[Wayland] Waylandと入力方式

**日本語訳について**
この記事は，2020年8月15日時点のDorota著「[Wayland and input methods](https://dcz_self.gitlab.io/posts/input_method/)」の，技術的内容を変更しない日本語訳である。原文書の利用許諾は[CC 表示 - 継承 4.0](https://creativecommons.org/licenses/by-sa/4.0/deed.ja)である。訳す際に補った部分は亀甲括弧〔〕で囲んで示した。

- - -

## 序
Waylandでは，入力方式 (input method) への生来的な対応が徐々に進んでいる。実際の進行状況は多岐にわたる，というのも入力方式には複数の要素が関わっているからだ。私がこの分野に携わるなかで，Wayland上での入力方式について新規参入者に説明しなくてはならない機会が何度もあったので，かわりにブログ記事を書いて現状の説明をこれっきりにすることにした。

## 文章入力
簡単に纏める。入力方式の目的は次の二つである:

* 応用プログラムに利用者からの文章を受け渡すこと
* 文章の適切な表示時期および種類を見分けること

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157174/44dda8fb-dfcd-86a6-277e-65f4c539eef4.png" width="50%"/>

Waylandにおいて上述の事柄を行う最も基礎的な枠組みは，**text-input**規約である。この規約では，〔Waylandの〕割付子 (compositor) から受け取った文章を応用プログラムに受け渡す。応用プログラムは**text-input**規約を介して必要な文章の表示時期および種類を合成機に伝えることができる。この規約は利用者周りについては取り扱わず，かわりに割付子に委ねる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157174/82bc9863-ed88-a523-18ce-70cf5d5ace96.png" width="50%"/>

## 入力方式
利用者が割付子を介して文書を入力するには二通りの方法がある:

* 割付子自身が入力を処理して通信の負担を引き受ける方法
* 他のプログラムに処理を委ねる方法

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157174/8e84ae00-e1c6-a44d-9a97-cb58f988367e.png" width="65%"/>

Waylandにおいては，この処理を援助するべく**input-method**規約が設計された。これは*text-input*にかなり似通っている。というのも，この規約によって，プログラム*が*割付子*に*文書を送り，そして割付子*が*プログラム*に*必要な文書の種類を伝えられるからである。*text-input*規約のときと立場が反転しているのに注意せよ。今回の場合，プログラムのほうが特別な立場にあるのだ。プログラムは利用者と通信して，それから文章を割付子に受け渡す。割付子はそのあと，典型的には受け取った文章を，現在注目している応用プログラムに*text-input*を用いて送り出す。一連の流れとしては次の通り: 特殊なプログラム → 割付子 → 注目している応用プログラム。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157174/d896567d-32e9-3f99-2af4-7df2b5813992.png" width="80%"/>

この規約には，幾つかの追加的権限も賦与されている。この規約を使用している応用プログラムは，〔一つのWayland総体において〕典型的には唯一つであるから，応用プログラムが複数の場合には動作しないような挙動が可能となる。その一つに鍵盤の全面捕獲があるが，これはCJKV言語利用者には馴染み深い挙動である。*input-method*は，ある特別なプログラムが割付子から全ての鍵盤押下を受け取れる（「排他的捕獲」）ようにする。鍵盤を乗っ取ることで「nihao」という入力に対して「你好」という文章を送り出すことが可能になるのだ。別の拡張機能を使って，特別な突出窓を作成できる。その窓は割付子によって入力画面の傍らに配置され，変換候補などを表示するのに用いられる。

## 仮想鍵盤
入力方式への対応はこれで終わりである---気に掛けるべきが文章周りの事柄だけなら。やんぬるかな，世の中はそう単純ではないのだ。使い物になるためには，入力に係る別の事柄も考慮する必要がある:

* text-inputに対応していない旧世代の応用プログラムにおける文章への対処
* 通常は鍵盤入力が必要な動作の実行

双方とも鍵盤を用いることで対応できる。しかしタブレット機器，テレビジョン受信機，ゲーム卓，あるいはスマートフォンなどのように，鍵盤が使えない場合はどうすれば良いのだろう？ この問題に対処するには鍵の押下を模倣する必要がある。繰り返しになるが，基本的な対処方法は二通りある。割付子自身で何か実現してもいいし，または他のプログラムに処理を委ねてもいい。

**virtual-keyboard**規約の設計は，鍵盤を押下したという〝偽の〟現象を割付子に発行させるためのプログラムに向けたものである。

## 併用
本格的な入力方式プログラムとは，一つのWaylandクライアントであり，*input-method*規約を用いて文章を送信するだけではなく，*virtual-keyboard*にも対応し，それを動作の送信，および旧世代の応用プログラム用の予備的措置に用いるものになる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157174/3b9c7026-e63c-3f2a-c1ff-f15c8341a092.png" width="80%"/>

割付子は入力方式プログラムと入力対象の応用プログラムの間で文章を転送する。合成された鍵盤事象もまた，入力方式プログラムから対象の応用プログラムに転送される。

文章を扱う応用プログラムは*text-input*に対応し，入力欄が注目対象となるか対象から外れるたびに，有効化・無効化事象を送信する。また鍵盤事象も受け付ける。

旧世代の応用プログラムでは，入力欄が注目対象となり利用者が入力できる状態であっても有効化・無効化事象が送信されない。割付子と入力方式が，その時点で文章が送信されるべきか否かを判断できないからである。画面上の鍵盤を使う入力方式においては，鍵盤が表示されない恐れがある。したがって，利用者が〔手動で〕入力方式および入力文章を起動し，鍵盤事象（応用プログラムは鍵盤事象については常に反応できる）として受け渡せることを絶対確実にするのが最善である。

## 現行状態
関連規約について，2020年8月15日現在の最新版は次のとおり:

### [*text-input-unstable-v3*](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/master/unstable/text-input/text-input-unstable-v3.xml)
[wayland-protocols](https://gitlab.freedesktop.org/wayland/wayland-protocols/)に受理済み。Carlos Garnacho作の[*gtk-text-input*](https://gitlab.gnome.org/GNOME/mutter/-/blob/efd7a4af5e37299f17011a7f39cc66d8416a1bf9/src/wayland/protocol/gtk-text-input.xml)，および[*text-input-unstable-v1*](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/master/unstable/text-input/text-input-unstable-v1.xml)に基づいて原著者が設計した。

### [*input-method-unstable-v2*](https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/master/protocol/input-method-unstable-v2.xml)
[wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)で使用されている。[*text-input-unstable-v3*](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/master/unstable/text-input/text-input-unstable-v3.xml)および[*input-method-unstable-v1*](https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/master/unstable/input-method/input-method-unstable-v1.xml)に基いて原著者が設計した。

### [*virtual-keyboard-unstable-v1*](https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/master/protocol/virtual-keyboard-unstable-v1.xml)
[wlroots](https://gitlab.freedesktop.org/wlroots/wlroots)で使用されている。[*wl_keyboard*](https://gitlab.freedesktop.org/wayland/wayland/-/blob/4e16ef0aed8db425afc8910b2a9708b57e165d39/protocol/wayland.xml#L2171)操作様式に基いて原著者が設計した。

## 展望
解決を待つ問題はまだ残っている。最重要なのは*text-input*における欠損の修復，およびそれに合致するような*input-method*の更新である。*virtual-keyboard*がWaylandの設計としばしば競合している現状を踏まえると，*virtual-keyboard*に注力する価値があるかどうかという別の重要な問題も生じている。

あまり重要でないこととして，*input-method*への追加機能の実装がある。

文字ではなく「やりなおす」，「送る」，「次へ」といった動作を送信する専用の規約を設計して，最近の鍵盤にある鍵を模倣する必要性を除去しようという先駆的発想もある。