Skip to content

使用 Rust 实现 Linux 输入法

kingzcheung
Published date:
Edit this post

Linux 平台都有哪些输入法? 我只听说过 ibus 和 fcitx,然后没有了。其他的输入法,要么基于ibus,或者基于 fcitx 实现的插件。比如 百度输入法是基于 fcitx 插件实现的, rime 在linux 平台上,官方的是基于 ibus 实现的,社区版本是基于 fcitx 实现的。

对于我来说,无论是ibus 还是 fcitx,第一印象都是界面丑陋,配置复杂,偶尔还会出现bug。特别是 fcitx 的rime 插件,总是会出现很难切换的bug。

所以,有没有办法绕过 ibus 和 fcitx,自己实现一个输入法呢?

调研

我们都知道, Linux 有 2 个图形显示协议:X11 和 Wayland 。 还有好几个桌面,其实最出名的是 KDE 和 GNOME。

但是其实对于输入法而言,最重要的是合成器。其中,KDE 使用的是 KWin,GNOME 使用的是 Mutter 合成器。

又由于 X11 基本被判了死缓,所以,我们只讨论 Wayland 的情况。

Wayland 的输入法框架分为两部分,使用合成器作为中介:

  1. 合成器与输入法之间的协议唤作 input-method-v1 和 input-method-v2
  2. 合成器与 Wayland 客户端(就是我们平时用的应用程序 )之间的协议唤作 text-input-v1 、text-input-v2、text-input-v3、text-input-v4 四个版本
输入法 <=> 合成器 <=> 应用程序

所以这个合成器很重要。麻烦的是,合成器有很多个,比如 KWin、Mutter、Sway 等等。 应用程序的 text input 协议一般要看框架的情况,比如:

输入法反而简单得多,因为就2个平台:

由于合成器基本是和桌面绑定的,所以,选择桌面环境也约等于选择了默认的合成器。

而上面的内容还只是 Wayland 的情况,我们还有一个 X11 来要兼容,因为目前有非常大量的软件其实是以 X11 作为默认的显示引擎,哪怕你的桌面是以 Wayland 启动的。

看了上面的内容,你就会明白为什么商业输入法一般都基于 ibus 或者 fcitx 插件了。因为 Linux 平台太过于碎片化了! 是个正常人都不愿意干这个活。

Next
使用 Rust 实现 Windows 输入法