fix for Polish

issue #47 への対応。

これはポーランドの方からのバグ報告で、ポーランド語向けのキーボードではいくつかの文字は AltGr キーを併用して入力する必要があるのだが、wasavi の input モードではそれを入力できないというものだ。

詳しく聞いてみると、入力できないのは Chrome を Windows で動かした場合に限るようである。が、これはポーランド語に限った話ではなく、AltGr という日本人にはあまり馴染みのないキーを使用する言語圏に共通する問題に思える。通常キーボードから入力できる文字というのは、直接入力するキー、shift 併用で入力するキーである。これに AltGr が加わると、さらに複数のキー入力を用いて単一の文字を入力できるようなのである。おもしろい。とてもおもしろい。

まず Windows のキーボード設定にポーランド語を追加する。いくつかさらに小分類があるが、どれを選ぶべきなのかはちょっとわからない。とりあえず最初のやつを選ぶ。いずれにしても、しかしそれによってキーボードのどれかのキーに AltGr が現れるわけではないので、スクリーンキーボードを使う。スクリーンキーボードは、選択している言語によってリアルタイムに表示上のキーの配列が変化する(正確には、切り替えたあとキーボードの上をマウスでなぞったりする必要があるので半リアルタイムというところだ)。

そんな環境で テストページを開き、適当にキー入力してみると確かに AltGr 併用の入力ができない。このページで使っているスクリプトは基本的に wasavi と同じロジックでキー入力を処理している。

スクリプトの動きを追ってみると、どうも Chrome は AltGr の入力を Ctrl+Alt の入力に変換しているようだ。つまり modifier としての keydown イベントが先行して 2 回発生し、それは Ctrl と Alt である。また、modifier ではないキー入力の属性として ctrlKey と altKey のフラグが両方立っている。一方 wasavi は、Ctrl 併用のアルファベットはコントロールコードの入力とみなしていて、すなわちそれがまずい。modifier キーに対する条件判断を、Ctrl が押されている場合、ではなく Ctrl「のみ」が押されている場合にする必要がある。そのように判定を厳しくすることで keydown イベントのキャンセルを回避し、keypress イベントを発生させるのである。

というわけでそういうふうに直した。このへんの仕組みはとても新鮮でとても興味深い。というのも、キーボードから直接入力できない文字に関しては、東アジア圏の人間の場合は IME を通して変換するのが通常だからである。

ところでこれに関連して、あるいは偶然のタイミングなのか、issue #52 も上がっている。これは vim の digraph は wasavi で使えないんだけど! というものだ。digraph というのは、input モード時に [cci]^K[/cci] を先行して 1 バイト文字を 2 文字入力することで別の文字に変換する機構のことだ。このへんの変換機構は RFC にまとまっている。

wasavi では vim の digraph は実装しない。というのは、そういうのは個々のアプリケーションではなく、もっとシステムワイドな層で設定すべきものだと思うからだ。たとえば ~./Xcompose とか、あるいは Windows なら AutoHotKey とかでなんとかすればいいのである。

Leave a Reply

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