构建一个给 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 14:23 /usr/lib/office6/libQtCore.so -> libQtCore.so.4.7.4

显而易见,是 Qt 4.7.4,出于 Qt API 的修改可能有兼容性的考虑,我们先去下载一下 4.7.4 的源代码。现在可能面临两个问题:

1、Qt 4.7.4 的代码在当前系统上可能编译不了了

2、WPS 的 Qt 可能修改过大。

当然 2 的概率相对是较小的,即使内部的修改也不太可能影响到 API。但 1 确实是有这样的现实的问题。而且在这次也确实遇见了,但是我们其实不需要大部分的工具,我们需要的只是 moc,qmake 这两个工具,即使其他都编译失败也没有关系,因为 WPS 里面已经有了对应的编译好的库。

下载源代码之后,编辑 configure 文件,设置 CFG_INOTIFY=no ,执行

 ./configure -opensource -confirm-license -no-openssl
make

当然确实是出现了一些奇怪的错误,不管他。我们其实需要的只是生成的 qtconfig.h 文件和 qmake 和 moc。

然后准备一些 fcitx 的源文件,用 fcitx 或者 fcitx5-qt 都可以,早前我已经基本让 fcitx 4 的 im module 脱离需要链接 fcitx 本身的库,只需要链接 Qt 即可。但是我还是引用了一些 fcitx 的头文件。用 fcitx 4 的代码就需要手动复制一些 enum 的定义过来。因此 fcitx5-qt 可能更好一点。

我特意修改了一下 fcitx5-qt 的代码让它可以不修改就能编译通过。写了一个专门的 cmake 配置,我也就是随意一写,所以放到了个人帐号上。 https://github.com/wengxt/fcitx5-wps 。利用 git submodule 直接引用了 fcitx5-qt 的代码,所以 clone 之后别忘了 git submodule update –init

具体编译参数就需要设置 -DQT_QMAKE_EXECUTABLE=<qt源代码路径>/bin/qmake 还有 -DWPS_LIBRARY_DIR=<WPS 的 qt 库路径>

然后生成了库之后把他复制到 WPS 对应目录 /usr/lib/office6/qt/plugins/inputmethods/qtim-fcitx.so 测试运行。当然,最好删掉原来的那个 libqim-fcitx.so 文件,避免环境变量设置成 fcitx 时会读到这个。

嗯?为什么不行?这时候就要利用 Qt 的一个调试用环境变量来测试了

QT_DEBUG_PLUGINS=1 /usr/lib/office6/wps

可以发现有如下输出:

QFactoryLoader::QFactoryLoader() looking at "/usr/lib/office6/qt/plugins/inputmethods/qtim-fcitx.so"  
In /usr/lib/office6/qt/plugins/inputmethods/qtim-fcitx.so:
 Plugin uses incompatible Qt library
 expected build key "x86_64 linux clang full-config", got "x86_64 linux g++-10.2.0 full-config"
"The plugin '/usr/lib/office6/qt/plugins/inputmethods/qtim-fcitx.so' uses incompatible Qt library. Expected build key "x86_64 linux clang full-config", got "x86_6
4 linux g++-10.2.0 full-config""  
        not a plugin

哦,QT_BUILD_KEY 对不上号呗。好办,直接强行修改生成的对应 qconfig 文件的内容。

在 Qt 源代码里面找到 src/corelib/global/qconfig.h ,把 QT_BUILD_KEY 修改成 WPS 对应的。这部分是直接构建在 plugin 里面的,所以重新编译。测试输入,成功。

Posted in fcitx development | 1 Comment

仿原神 UI 的 KDE 系统配色

原神痴竟是我自己

下载地址:https://uploads.csslayer.info/uploads/Genshin.colors

Posted in Linux | Tagged , , | Leave a comment

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

折腾了很久的自动构建,现在终于可以拿出来给大家用一下了。当然,据说 flathub 有特色网络问题……这部分我就不负责解决了。

首先添加源:

# 添加 flathub 到用户级
flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
# 添加 fcitx5-unstable 到用户级配置
flatpak remote-add --user --if-not-exists fcitx5-unstable https://flatpak.fcitx-im.org/unstable-repo/fcitx5-unstable.flatpakrepo

安装 Fcitx 5 和输入法:

flatpak install org.fcitx.Fcitx5
flatpak install org.fcitx.Fcitx5.Addon.ChineseAddons
# 例如需要 Rime: flatpak install org.fcitx.Fcitx5.Addon.Rime
# 可以用 flatpak remote-ls fcitx5-unstable 查看有哪些包

然后,在本地非 flatpak 程序上使用的话,还需要安装 fcitx 4/5 的 im module。这个 repo 除了提供另一种更新方式之外,也主要是为了方便还没提供 fcitx 5 的发行版测试。fcitx 4 只要是最近的版本,都可以直接和 fcitx 5 配合使用。环境变量方面当然还是和过去一样,比较传统的就是设置在 ~/.xprofile 里面(和过去一样,如果你已经对 fcitx 4 进行设置了就不用修改什么。)

export QT_IM_MODULE=fcitx
export GTK_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx

自动启动就把 flatpak 的 fcitx 5 的 desktop file 加入到自动启动即可。但相对的也需要阻止 fcitx 4 的自动启动。如果没有拆包而导致 fcitx 被安装,如果系统提供了 /etc/xdg/autostart/fcitx-autostart.desktop 就需要在 ~/.config/autostart/fcitx-autostart.desktop 新建如下内容的文件

[Desktop Entry]
Hidden=true

如果是采用 im-config 等类似的方式,则直接禁用并自行配置环境变量即可。

目前仅仅是测试版本,可能会遇见各种问题(例如图标缺失等),如果在用 flatpak 版本的时候有任何问题请汇报到 https://github.com/fcitx/flatpak-fcitx5/ 。

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 拼音的繁体翻译建议改一下 OpenCC 的配置档或者提供选项供偏好设定,个人不是很喜欢直接用 s2t 的翻译

安排上了,已经修改了。

6、Kimpanel的菜单要是能模糊就好了

……右键菜单是就是普通的菜单,输入框本身也可以模糊,如果你的系统输入窗口没有模糊建议检查窗口配置。

7、完善对 steam 的支持

steam 完善对输入法的支持才对

8、希望能增强对wsl/wsl2环境的兼容性

用 opensuse leap 测试了一下,没有问题。建议网上搜索一下别人的设置步骤。

9、词库太少 云输入太慢

open-gram 确实数据版本是有年头了…不知道能不能联系他们有机会在训练一次。其他有可以直接下载 sogou 词库的功能,另外也可以试试 zhwiki 这个词库。

10、支持用户自己加入个别未收录的字

现在就可以的。拼音词库的话可以随便添加字(只要拼音本身合法),如果有特殊读音的需求请提交 issue 给 libime。

11、可以配置指定程序初始化指定的输入法(比如可以手动设置tg默认使用中文,终端默认英文)

如果急切需要的话,其实写个插件就可以实现。

12、对wm有更好的支持

这个……不够具体。不太懂说的意思。

Posted in fcitx development | Tagged , | Leave a comment

Fcitx 5 的拼音有哪些新功能

拼音方面做了特别多的改进,但是目前还没有比较集中的地方说明到底有哪些新功能,所以这里特别列举一下。

1、算法的改进
数据采用了和 sunpinyin 相同的 open-gram(也是为什么没有 fcitx5-sunpinyin的原因),算法来说是类似的基于统计语言模型计算概率,在用户的历史处理上和 sunpinyin 有所不同,但是整体来说是类似的。和原本的 Fcitx 4 自带拼音相比的话改进则是巨大的。

2、笔画过滤
按 ` (反引号)键触发,可以输入 hpszn(横撇竖折捺)进行搜索。

3、输入颜文字
对于有对应颜文字的词组可以直接输入,具体列表可以参考 https://github.com/fcitx/fcitx5-chinese-addons/blob/master/im/pinyin/emoji.txt

4、查询读音
选中一段文字之后,可以用快速输入输入 duyin 来列出文字的读音。

5、自定义双拼方案音节
例如可以直接指定某个音节对应的双拼,而不是根据单独声母/韵母来指定。此外之前似乎一直和标准不符的自然码方案也得到了修复。

6、多词库管理
可以直接导入搜狗的细胞词库,单独启用或者禁用某个词库等。

7、Lua 扩展
目前加入了针对候选词匹配的功能,而且预置了一些 lua 功能,例如输入时间:

8、拆字输入
通过输入汉字部件来找到对应汉字。例如:

9、一些之前就有的功能
笔画输入(直接hpszn输入笔画查找汉字),以词定字,联想,简繁转换,输入单词,云拼音,还有 Fcitx 一直以来就有的高度可扩展的快速输入功能。

Posted in fcitx development | Tagged , , | 1 Comment