0

我在 Tkbind.c、TkEvent.c 和 TkEntry.c 中的 tk 源代码中看到,有一组指针,eventPtr、dispPtr、bindPtr 以及更多指向不同 C 结构的指针。

有 eventPtr 存储与按下哪个键有关的信息。然后 bindPtr 从 hashtable 中获取一个适当的 glyph,对应于 eventPtr 中的 keySym,并将结果存储到 patPtr(模式指针)指向的结构中。

我想一个例子会有所帮助。

所以,我按下键“A”。这就是 eventPtr 中的内容。如果我关闭了 CAPS LOCK,那么实际文本将是“a”,因此 bindPtr 从哈希表中选择相应的字形“a”。这个“a”被传递到 patPtr。

如果我想写阿拉伯语,再次按“A”,在 eventPtr 中给出相同的 keySym。从哈希表中,bindPtr 将选择适当的字形“ش”。在阿拉伯语中,由于字母的连接,即使是同一个字母,字形也会有所不同。适当的字形被传递到 patPtr。

然后将其传递给 dispPtr。我知道(或者至少我认为)这些指向结构的指针用于形成一个链表,然后将其移交给系统/平台资源以在小部件上呈现文本。

到目前为止,我是在正确的轨道上还是...?我最终打算使用 fribidi(二进制或如果不是二进制,则使用带有相应头文件的动态链接库)来使 tk 能够处理阿拉伯语。如果 fribidi 不是合适的选择,那么我会去 pango/cairo 或其他地方。

谢谢 !ps 我知道这个问题有点具体,只有 Tcl/Tk 维护人员/开发人员才能回答。我希望这是问这个问题的正确地方!

4

1 回答 1

1

这确实超出了 Stack Overflow 的范围,但我要说,我绝对支持想要从事此工作的人!我知道我缺乏所需的特定专业知识(特别是,我不知道什么是正确的行为),所以我只能帮助那些承担这一点的人。如果你是这样的人,那就太好了!

关于事件绑定的具体点,我敦促您尽可能避免使用绑定代码本身。通常,将导致字符插入到小部件中的键的处理委托给 (Tcl) 脚本,该脚本调用正确的代码来插入字符(或字符序列 - 您不能假设按一次键会产生一个特点)。但是,如果您只是想增加决定通过按键插入哪些字符的代码以及添加一种方法来告诉脚本哪个方向与字符相关联,我可以支持。

键序列是通过%A替换插入的(如果可能的话,通常不建议截取键符,因为它不适用于输入法处理),并且其内容通过TkpGetString; 该实现通常将字符串缓存在事件本身的扩展字段中(否则使用%A两次——这在复杂的绑定集中很容易完成——会导致奇怪的失败)。

我不知道您如何获得插入方向(即,在写入该特定字符后将光标移动到哪个方向)但是在插入替换时,您选择了一些完全未使用或未用于KEYVIRTUAL事件并增加它。假设信息不是通过自己的事件传递的;如果以这种方式完成,只需将该事件传递给脚本(您肯定希望尽量减少在 C 中完成的工作量)。

对于渲染,您需要查看字体引擎。主要 Unix 字体引擎的源代码位于 中unix/tkUnixRFont.c,它通过将大部分工作委托给 Xft 库来工作。(还有unix/tkUnixFont.c,它使用原生 X11 API,但并不真正鼓励使用;它在现代显示器上看起来很丑。或者实际上在过去 10 年内制作的任何东西上,尤其是在旋转文本时,就像在画布。)如果我们在这个区域出现灾难性的错误,我一点也不感到惊讶(可能在 OSX 上除外,在 Windows 上可能会加倍;它们都有自己的特定于平台的渲染引擎,但我不知道我们是否以足够大的块提供文本以使其有用)。

作为修复程序的一部分,可能还有其他地方可以查看。进行文本输入的小部件是entry/ spinboxttk::entry/ ttk::spinboxttk::combobox(我不知道与 共享多少ttk::entry),text小部件(这是不平凡的代码!)和canvas通过其text项目的小部件。


我希望这可以为您提供一些入门信息。一旦你得到了一些东西,即使它除了一些基本情况之外并没有真正起作用,请联系Tcl 核心团队中的任何人(或者,更好的是,我们的邮件列表),我们将整理 Tk 源中的一个分支存储库供您使用。我真的很想看到适当的比迪烟支持;我知道它已经丢失了很长时间了。

于 2013-11-07T19:43:28.327 回答