我在Tkbind.c,TkEvent.c和TkEntry.c中的tk源代码中看到,有一组指针,eventPtr,dispPtr,bindPtr,还有一些指向不同的C结构。
有eventPtr存储与按下哪个键有关的信息。 然后bindPtr从哈希表中获取适当的字形,对应于来自eventPtr的keySym,并将结果存储到patPtr指向的结构(模式指针)。
我想,一个例子会有所帮助。
所以,我按下“A”键。这就是eventPtr中的内容。 如果我关闭了CAPS LOCK,那么实际文本将是“a”,因此通过bindPtr从哈希表中选择相应的字形“a”。 这个“a”传递给patPtr。
如果我想写阿拉伯语,再次按“A”,在eventPtr中给出相同的keySym。 从哈希表中,bindPtr将选择适当的“ش”字形。在阿拉伯语中,由于字母的连接,字形可以是不同的,即使对于相同的字母也是如此。 适当的字形传递给patPtr。
然后将其传递给dispPtr。我知道(或者至少我认为)这些指向结构的指针用于形成链接列表,然后将其移交给系统/平台资源以在窗口小部件上呈现文本。
到目前为止我是在正确的轨道还是......?我最终打算使用fribidi(二进制或如果不是二进制文件,动态链接库和相应的头文件)来启用tk来处理阿拉伯语。如果fribidi不是合适的选择那么我会选择pango / cairo或更进一步。
谢谢!附:我知道这个问题是特定的,只有Tcl / Tk维护者/开发人员可以回答。我希望这是一个正确的问题!答案 0 :(得分:1)
这实际上超出了Stack Overflow的范围,但是让我说我肯定支持想要解决这个问题的人!我知道我缺乏所需的具体专业知识(特别是,我不知道什么是正确的行为)所以我只能帮助那些接受这一点的人。如果你是这样的人, 太棒了!
关于事件绑定的具体要点,我建议你尽可能避免使用绑定代码本身。通常,导致在窗口小部件中插入字符的键的处理被委托给(Tcl)脚本,该脚本调用正确的代码来插入字符(或字符序列 - 您不能假设一个按键产生一个字符)。但是,如果您只是想要增加代码来决定按键插入哪些字符,以及添加一种方法告诉脚本哪个方向与字符相关联,那么我可以支持。
通过%A
替换插入密钥序列(如果可能的话,通常不建议拦截密钥,因为它对输入法处理不起作用)并且通过{获取内容{1}};实现通常将字符串缓存在事件本身的扩展字段内(否则使用TkpGetString
两次 - 这在复杂的绑定集中很容易完成 - 导致奇怪的失败)。
我不知道你如何获得插入方向(即在写入特定字符后将光标移动到哪个方向)但是在插入替换时,你会选择一些完全未使用或不是用于%A
或KEY
事件并增加它。假设信息不是通过自己的事件传递的;如果 以这种方式完成,只需将该事件传递给脚本(您肯定希望最大限度地减少在C中完成的工作量)。
对于渲染,您需要查看字体引擎。 Unix主字体引擎的源代码位于VIRTUAL
,它通过将大部分工作委托给Xft库来工作。 (还有unix/tkUnixRFont.c
,它使用原生的X11 API,但实际上并不鼓励它使用;它在现代显示器上看起来很丑陋。或者实际上是在过去10年内制作的任何东西,特别是当文本被旋转时,可以在画布上完成。)如果我们让这个区域出现灾难性的错误(除了OSX上的或者,并且可能在Windows上超级加倍;他们都有自己的平台 - 我都不会感到惊讶特定的渲染引擎,但我不知道我们是否通过足够大的块来提供文本以便有用。)
作为修复程序的一部分,可能还有其他地方可供查看。进行文字输入的小部件是unix/tkUnixFont.c
/ entry
,spinbox
/ ttk::entry
,ttk::spinbox
(我不知道与之分享了多少ttk::combobox
),ttk::entry
小部件(这是非平凡的代码!)和text
小部件通过其canvas
项。
我希望这能为您提供一些入门信息。一旦你有了什么东西,即使它没有真正用于除了一些基本案例之外的其他任何事情,请联系Tcl Core Team(或者更好的是我们的邮件列表)上的任何人,我们将在Tk源代码库供您使用。我真的很想看到合适的比迪支持;这已经是我所知道的很长一段时间了。