Category Archives: fcitx development

Fcitx 5 开发(一)一个按键事件的前半生:由程序到输入法

因为觉得有必要趁着 Fcitx 5 发布的功夫,决定写一系列的关于如何开发 Fcitx 5 相关内容的文档,之后会更新到 Wiki 上。 要理解输入法是如何工作的,首先要了解的是程序究竟是如何与输入法进行交互的。而这一部分的内容,也与一个常见问题相关:为什么我在 A 程序里面无法使用输入法? Fcitx 的基本架构是客户端/服务器架构,客户端,在 Fcitx 里面对应的词是“输入上下文(Input Context)”,具体究竟对应程序中的哪一个实体,是并没有明确规定的。一般来说,可能是对应程序的一个窗口。而具体对应什么,是取决于程序自己的实现,也就是“程序认为”哪些部分应当作为同一个上下文来处理。虽然,在实践当中一般并不会有程序做到如此的细化。 当一个程序不能用输入法的时候,一般最常见的情况就是这个程序并没有采用正确的方式和输入法进行通信。 那么,目前在 Linux 下到底有多少种不同的客户端通信方式呢?看看源码中 frontend 目录下有多少就知道了。 这里我们也详细说明一下各个目录的情况: 1、xim,最古老的基于 X11 的输入法协议。在 X11 下理论上是通用的,实现由 Xlib 完成。和 Xlib 的事件处理结合非常紧密,采用了一种直接原生和 Xlib 按键转化字符串的方式来实现,而不是非常直接的有回调来传递输入法想要程序进行的操作。Xlib 的实现里面非常多的操作都是实现成同步而且并没有错误处理,这也导致了一旦输入法退出,程序如果此时在进行一个同步操作,就会直接冻结。而这部分代码过于古老基本上处于没人会去改的状态,其中非常古老的缺陷之一就是光标跟随和嵌入预编辑文本无法共存,尽管从协议的角度来说,并没有什么道理阻止这个功能,但就是几年尽管有 Patch 都没有合并的状态。 XIM 允许多个输入法注册在 … Continue reading

Posted in fcitx development | 1 Comment

Client Side Input panel for Fcitx 5

(English version is at the end of this post.) 输入框的定位相关的问题其实很复杂,过去 Fcitx 总是自己绘制相关的窗口。X11 这个办法还好使,但是其他情况可能就没这么好使了。让客户端绘制窗口的想法其实比 Fcitx 5 要早得多,最早是为了 fbterm 而增加的支持。 显然 fbterm 没法利用任何来自显示管理器的界面,所以它需要自己绘制它自己的界面。那会儿我添加了一个很简单的实现来支持这个功能。 为了正确显示界面需要支持以下功能: 窗口显示在光标的位置 窗口不能移出屏幕 在 wayland 里,和 X 最大的区别就是不知道窗口的位置,所以不得不使用特别的方法来支持。 用 wayland 的输入法协议的话,它确实是支持将某个窗口标记为输入法窗口并让混成器帮你进行定位,但是需要程序自己先使用 wayland 的输入法协议,混成器也要支持这个协议。目前这两部分的支持并不好。 或者让窗口传送一个相对坐标,然后让混成器帮忙移动窗口。gnome wayland + kimpanel 的扩展就是这样进行定位的,因为 kimpanel … Continue reading

Posted in fcitx development | Tagged , , , | 3 Comments

构建一个给 WPS 用的 fcitx im module

WPS 处于许可证的考虑,里面自带的 fcitx 的 im module 是由 WPS 的开发自己写的。但是这就有一个问题了,他们对于跟随 fcitx 上游的变化可以说是几乎没有。在 Fcitx 4 已经加入了对于 flatpak / fcitx 5 的支持之后他们并没有做出对应的改变,导致了现在的很多问题。 在过去的这篇也曾经写到了,如何构建一个给闭源 Qt 程序用的模块。 我不知道过去有没有人干过这样的事情,但我们现在就来做这么一趟。 首先观察 WPS 使用的 Qt 版本 $ ls /usr/lib/office6/libQtCore.so -l                        lrwxrwxrwx 1 root root 18  1月 15 … Continue reading

Posted in fcitx development | 1 Comment

如何现在就用上 Fcitx 5 (Flatpak)

折腾了很久的自动构建,现在终于可以拿出来给大家用一下了。当然,据说 flathub 有特色网络问题……这部分我就不负责解决了。 首先添加源: 安装 Fcitx 5 和输入法: 然后,在本地非 flatpak 程序上使用的话,还需要安装 fcitx 4/5 的 im module。这个 repo 除了提供另一种更新方式之外,也主要是为了方便还没提供 fcitx 5 的发行版测试。fcitx 4 只要是最近的版本,都可以直接和 fcitx 5 配合使用。环境变量方面当然还是和过去一样,比较传统的就是设置在 ~/.xprofile 里面(和过去一样,如果你已经对 fcitx 4 进行设置了就不用修改什么。) 自动启动就把 flatpak 的 fcitx 5 的 desktop file 加入到自动启动即可。但相对的也需要阻止 … Continue reading

Posted in fcitx development | Tagged , , | Leave a comment

关于之前发在 Archlinux CN 群里 Fcitx 5 问卷里面问题的几个回答

1、sni图标似乎不响应系统(kde)配色了? 图标上来说用的是 input-keyboard-symbolic ,不幸他们没这个图标的 plasma 版本。其他图标都挺正常的啊?可以给 breeze 提交一个希望增加 input-keyboard 这个图标的请求。 2、非kde下面托盤和托盤右鍵菜單太醜了,還沒之前的4好看。 右键菜单和输入框一个主题吧。自带主题来说应该还行,没有修改的打算。如果你用的别的主题那就和 Fcitx 无关了。 3、更好康的皮肤,更佳的英文混输体验 皮肤本身就不说了,我自己应该不会再做什么别的皮肤。不过目前给皮肤增加了好几个新的功能,应该能帮助大家做出更好的皮肤。一个是 Overlay 图片,一个不会受到缩放的图片,可以固定显示在背景上。另一个是增加了 KWin 的模糊背景的支持,目前暂时可以设定一个矩形区域并模糊。 混合输入这个应该继续学习一下有什么办法……短期内肯定是没有大的改进。 4、Doesn’t work well on Sway, but that’s mainly a Wayland input protocol issue, no rush. 这个确实是比较难的事情…不过我对 wlroots 那个协议很不满意,下一步反正是打算自己实现一个新的协议。 5、fcitx5 … Continue reading

Posted in fcitx development | Tagged , | Leave a comment