d亚当博客1219

原文

有人指出写障,不需要注册线程的问题:还需要知道在哪里,才能扫描他们

以前有,从C#调用D代码不正常的报道,本周在论坛上又有,关于从Java调用D代码不正常,这里.
Ali诊断其为Java运行时创建的线程,未通知D运行时.有了写障,就可避免通知D运行时;可在写障边界处懒执行.
我展示了在一月份写在博客上的FF1-nsf程序,研究minigui中一些旧的硬件和一些实用实现代码有意思.然后过渡到编写微型媒体播放器,并观察是否可自动从接口创建对话框.答案是否定的.
我只做了类,所以我编辑了minigui.d来增加对接口的支持,足够好了,但我想让它引用变化的对象,然后开始增加一些指针支持,结果有点陷入了兔子洞,然后我就没时间了.

关于内容,我仅作几点主要评论:
1),Atila反射库中使用错误.如前,我更喜欢最小化使用串,用它们时,尽量用本地名而不是构造全名,并且只做想做的,而不是堆积更多抽象层.

2),RobertSchadeknogc有个正确的想法,只是不要去搞那些无聊的东西!的确,很多js可相当容易地移植到D.如"D中声明式界面"帖子,那里的噪音生成器是一个JS移植.
3),我喜欢Steve的模型思想,也同意API应该易于使用.他和我现在有一些重叠项目.
4),拉里让我想起了一些旧的d形式的东西.事实上,使用时,我发现崩溃快乐并易产生漏洞,因此我开始minigui的一部分!我已考虑写个自定义编辑器,vim有时确实惹恼了我.但首先我需要新的文本布局系统.

dom.dXmlDocument

另外,我在dom.d'中的XmlDocument修复了错误.不让<script><style>HTML处理xml.这对svg也重要.

文本布局

我又开始了TextLayouter类.两年前,我开始写ExperimentalTextComponent2,并在这里写了博客.
来替换Linux上的minigui构建TextEdit(和LineEdit等)组件所依赖的非常有缺陷的ExperimentalTextComponent.
虽然ExperimentalTextComponent2一开始很有希望,但它最终与ExperimentalTextComponentv1陷入了同一堵墙,我找不到解决办法,而且破坏了它上面的API,所以被无限期地搁置.
v1是在我写OperatingSystemFont类之前写的,所有函数都绑定到simpledisplayScreenPainter,所以必须有个实例来布局;它会在绘画(或至少是伪绘画)时布局,然后缓存些信息供未来使用来.由于与ScreenPainter紧密耦合,它也会绘画自己及其部分,如选区和光标(因此会出现闪烁,它不知道minigui的焦点模型).

还想搞富文本编辑器.
v2,现在OperatingSystemFont工作了,我试从ScreenPainter解耦,并同时简化,它避免了布局时直接依赖ScreenPainter.但仍然有draw(ScreenPainter)函数,它避免了v1内置的一些混乱,并通过ComponentInFlow接口,来具有些可扩展性.但仍然向外部暴露了太多的内置构,破坏了所有的API,并限制了功能和优化.
正在开发v3.与v2一样,它主要基于OperatingSystemFont,但不完全是.具体来说,它使用了OperatingSystemFont实现的MeasurableFont接口.
几个月前,重构中创建了MeasurableFont,它非常适合,并影响了前进方向,OperatingSystemFontsimpledisplay相关的,但MeasurableFont,虽然在simpledisplay中,但可很容易地在其他地方使用,且有完全不同实现.甚至不需要严格地以像素为单位测量,表明它甚至可在字符单元终端中工作.

现在,文本布局器已完全解耦,它不需要绘画自己,而是公开迭代可渲染片段的方法.片段包含文本,可绘画信息,如抽象坐标空间中的基线和边界框.及相对不透明的TextStyle实例.
TextStyle必须可提供字体度量,因此它有返回MeasurableFont方法,除此外,布局器不关心(包括字体颜色).
也表明绘图代码可能会基于布局引擎完全未知的来设置文本风格,如,在绘画时,基于这些语法高亮,而不是嵌入这些信息至布局器自己的数据结构.

因此,不像v2那样限制使用提供风格,现在可用自己定义风格选项使用布局器.

类似,v3使用闭包来确定各种点边距.类似css浮点,文本出现在图像旁边,然后在图像下面环绕.v1v2都有用矩形表示的排除区的概念.v3使用闭包,表明可定义想要的形状,与旧方法相比,更易编码且更灵活.

除了布局和渲染外,文本系统的另一个关键组件是导航和操作.v1基于自己方法实现.v2未真正实现.v3已基于选区对象概念工作.可四处移动,设置锚点和焦点,然后删除,插入,取数据,这样不需要暴露底层实现细节,就给你重要访问权限,选区是相当不透明对象,它不会告诉文本偏移等.

表明不必用数组,因为用户不能切片它,修复了v1v2问题.PoC实现是数组,但是我可在,不破坏用户API就添加间隙索引其他数据结构.

此外,这些api非常好用,因为你可映射它们到你已熟悉文本编辑器中的熟悉操作.

最后,我决定支持多选区/光标,这对用户来说是个有用的文本编辑工具,可不同用户控制,来获得有GoogleDoc风格的协作体验.

ExperimentalTextComponent1和2之间的关键区别在于是否有OperatingSystemFont的度量方法.再加上ScrollMessageWidget,在新代码中帮助很大.

这里
现在一些文件,依赖core.d了.

import arsd.dom;

void main() {
   auto document = new Document("<html></html");
}

dmd -i yourapp.d自动拉arsd.dom文件.加上

document.parseGarbage("<html></html");

自动拉arsd.characterencodings文件.而:

auto document = Document.fromUrl("http://dlang.org/");

自动拉arsd.characterencodingsarsd.http2文件.
你可能会喜欢cgi调度器,通过它的serveApi函数,它可从D函数自动生成html表单.

import arsd.cgi;

class TheClass : WebObject {
    @UrlName("") // 根函数.
    string hello(string name) {
        return "Hello, " ~ name ~ "!";
    }

    static struct Info {
        string name;
        string title;
    }

    @AutomaticForm
    @(Cgi.RequestMethod.POST)
    Info[] withAutomaticForm(Info[] info) {
        return info;
    }
}

mixin DispatcherMain!(
    "/".serveApi!TheClass
);

我实际上使用了arsd.terminal.TerminalAPI的子集,作为代码中内省类似终端对象的基础.有许多通用函数使用DbI实现虚屏幕,子屏幕,缓冲屏幕等类似终端功能.

posted @   zjh6  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示