构建一个给 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 里面的,所以重新编译。测试输入,成功。

This entry was posted in fcitx development. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.