d亚当博客1219
有人指出写障,不需要注册线程的问题:还需要知道栈在哪里,才能扫描他们
以前有,从C#调用D代码不正常的报道,本周在论坛上又有,关于从Java调用D代码不正常,这里.
Ali诊断其为Java运行时创建的线程,未通知D运行时.有了写障,就可避免通知D运行时;可在写障边界处懒执行.
我展示了在一月份写在博客上的FF1-nsf程序,研究minigui中一些旧的硬件和一些实用实现代码有意思.然后过渡到编写微型媒体播放器,并观察是否可自动从接口创建对话框.答案是否定的.
我只做了类,所以我编辑了minigui.d来增加对接口的支持,足够好了,但我想让它引用变化的对象,然后开始增加一些指针支持,结果有点陷入了兔子洞,然后我就没时间了.
关于内容,我仅作几点主要评论:
1),Atila在反射库中使用串是错误.如前,我更喜欢最小化使用串,用它们时,尽量用本地名而不是构造全名,并且只做想做的,而不是堆积更多抽象层.
2),RobertSchadek对nogc有个正确的想法,只是不要去搞那些无聊的东西!的确,很多js可相当容易地移植到D.如"D中声明式界面"帖子,那里的噪音生成器是一个JS移植.
3),我喜欢Steve的模型思想,也同意API应该易于使用.他和我现在有一些重叠项目.
4),拉里让我想起了一些旧的d形式的东西.事实上,使用时,我发现崩溃快乐并易产生漏洞,因此我开始minigui的一部分!我已考虑写个自定义编辑器,vim有时确实惹恼了我.但首先我需要新的文本布局系统.
dom.d的XmlDocument
另外,我在dom.d'中的XmlDocument修复了错误.不让<script>和<style>按HTML处理xml.这对svg也重要.
文本布局
我又开始了TextLayouter类.两年前,我开始写ExperimentalTextComponent2,并在这里写了博客.
来替换Linux上的minigui构建TextEdit(和LineEdit等)组件所依赖的非常有缺陷的ExperimentalTextComponent.
虽然ExperimentalTextComponent2一开始很有希望,但它最终与ExperimentalTextComponentv1陷入了同一堵墙,我找不到解决办法,而且破坏了它上面的API,所以被无限期地搁置.
v1是在我写OperatingSystemFont类之前写的,所有函数都绑定到simpledisplay的ScreenPainter,所以必须有个实例来布局;它会在绘画(或至少是伪绘画)时布局,然后缓存些信息供未来使用来.由于与ScreenPainter紧密耦合,它也会绘画自己及其部分,如选区和光标(因此会出现闪烁,它不知道minigui的焦点模型).
还想搞富文本编辑器.
对v2,现在OperatingSystemFont工作了,我试从ScreenPainter解耦,并同时简化域,它避免了布局时直接依赖ScreenPainter.但仍然有draw(ScreenPainter)函数,它避免了v1内置的一些混乱,并通过ComponentInFlow接口,来具有些可扩展性.但仍然向外部暴露了太多的内置构,破坏了所有的API,并限制了功能和优化.
正在开发v3.与v2一样,它主要基于OperatingSystemFont,但不完全是.具体来说,它使用了OperatingSystemFont实现的MeasurableFont接口.
几个月前,重构中创建了MeasurableFont,它非常适合,并影响了前进方向,OperatingSystemFont是simpledisplay相关的,但MeasurableFont,虽然在simpledisplay中,但可很容易地在其他地方使用,且有完全不同实现.甚至不需要严格地以像素为单位测量,表明它甚至可在字符单元终端中工作.
现在,文本布局器已完全解耦,它不需要绘画自己,而是公开迭代可渲染片段的方法.片段包含文本,可绘画信息,如抽象坐标空间中的基线和边界框.及相对不透明的TextStyle实例.
TextStyle必须可提供字体度量,因此它有返回MeasurableFont方法,除此外,布局器不关心(包括字体颜色).
也表明绘图代码可能会基于布局引擎完全未知的来设置文本风格,如,在绘画时,基于这些串语法高亮,而不是嵌入这些信息至布局器自己的数据结构.
因此,不像v2那样限制使用提供风格,现在可用自己定义风格选项使用布局器.
类似,v3使用闭包来确定各种点边距.类似css浮点,文本出现在图像旁边,然后在图像下面环绕.v1和v2都有用矩形表示的排除区的概念.v3使用闭包,表明可定义想要的形状,与旧方法相比,更易编码且更灵活.
除了布局和渲染外,文本系统的另一个关键组件是导航和操作.v1基于自己方法实现.v2未真正实现.v3已基于选区对象概念工作.可四处移动,设置锚点和焦点,然后删除,插入,取数据,这样不需要暴露底层实现细节,就给你重要访问权限,选区是相当不透明对象,它不会告诉文本偏移等.
表明不必用数组,因为用户不能切片它,修复了v1和v2问题.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.characterencodings和arsd.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.Terminal的API的子集,作为代码中内省类似终端对象的基础.有许多通用函数使用DbI实现虚屏幕,子屏幕,缓冲屏幕等类似终端功能.
浙公网安备 33010602011771号