旅とプログラミングを少々

趣味に関する記録などをします。おそらくプログラミング入門に関しての内容を連ねていきます。

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しか選択肢が無い。

参考文献

*1:Fcitx5はわざわざibusの非公開プロトコルまで一部実装してGNOME対応をしている。