2023年初頭のWaylandと多言語入力
このブログポストのきっかけ
先日IPAの未踏プロジェクトの発表会をWeb配信で見たが、そのなかでもKonjac と IMPlaneの発表がちょうど自分の関心領域であった。 プロジェクトではMacに翻訳機能付きIMを実装してデモしており、研究の展望としてIMPlaneが他環境にも実装できれば共通のIMをOSを越えて実装できるのではないかと語っていた。 MITOU2022 Demo Day/第29回 未踏IT人材発掘・育成事業 成果報告会 開催のご案内:IPA 独立行政法人 情報処理推進機構 (本人のツイート及び録画へのリンク https://twitter.com/k3k3h0/status/1627184019929722880 )
実際に、今そういったものが欲しい。現在のLinuxでの多言語入力の実装はとても難しい。
2023年初頭のWaylandと多言語入力
概要
キー入力およびそれに限らない全ての入力はwaylandの'Seat'と呼ばれる仮想レイヤーに集約される。一般的にはseatは一つだけでキーボードを複数繋ごうとseatは同一のものに集約され、それぞれのキーを打つたびにキー配列等を切り替えて処理するが、どう処理するかはCompositorの実装依存でありプロトコル等で決められているものではない。
文字入力の際にはIMEがwaylandクライアントとしてグローバルのwl_seatからwl_keyboardをgrabして全てのキー入力をもらう。
IMEはテキストの入力をwayland compositorに渡し、各プログラムはwayland compositorからテキストを受けとって入力として扱う。
Text-input protocol
(GUI) Program <-> Wayland Compositor 間のプロトコルが text-inputプロトコル v1-v4まである
v1: Compositor側では参考実装でwestonくらいしか対応してないはず。
プログラム側ではChromeで--enable-wayland-ime
を有効にして起動すると一応まだ動くかも。
v2: wayland-protocols にマージされていない。多少は対応があった様子だけど、よく知らない。
Qtがサポートしている。
v3: wayland-protocolsにマージされているので、2023年現在多くのプログラムとCompositorが対応している。
Compositor側では mutter (GNOME shell のwindow composition manager), kwin (KDEの同上), wlroots(sway等) などの代表的なものは全てサポートしている。
Program側ではGtkがサポートしている
v4: wayland-protocolsのwip/text-input-next treeで現在進行で策定をしようとしている版 とはいえまだほぼv3と同じなので2023年現在は実質v3サポートとみなしてよい。
プログラム側ではQtがサポートしている。
zwp-input-method protocol
Wayland Compositor <-> Input Method 間のプロトコル。
v1: wayland-protocolsにマージされている。weston, kwinがサポート
v2: wlrootsがサポート(一部)
GNOMEは多言語対応がいろいろおかしいのはここでも発揮されていて、どれもサポートせず、IBusのプロトコルを使っているらしい。*1
zwp-virtual keyboard protocol
Wayland Compositor <-> Input Method 間のプロトコル
テキスト入力ではなくキー入力としてそのまま送りたい場合に使うことを想定されている。まだきちんと実装として対応しているものはないと思っていたが、wlrootsが実装した様子。しかしイベントを送るIMEは寡聞にして知らない。
まとめ
これらのプロトコル対応を見てわかる通り、waylandでの多言語入力はまだまだ発展途上の領域であり、実用上はXWaylandを介した古いプログラムのためXの対応まで必要となる。そのため実質的にfcitx5か、ある程度のwayland対応を無視してのIBusしか選択肢が無い。
参考文献
- wlcskk (拙作参考実装) https://github.com/naokiri/wlcskk
- wayland-protocols/text-input-next https://cgit.freedesktop.org/wayland/wayland-protocols/log/?h=wip/text-input-next
- wayland-protocols/Input Method Hub https://gitlab.freedesktop.org/wayland/wayland-protocols/-/issues/39#implementation-matrix
- Chrome/Chromium 今日 Wayland 输入法支持现状 https://www.csslayer.info/wordpress/fcitx-dev/chrome-state-of-input-method-on-wayland/