IMEはWebアプリからどの程度制御可能であるべきなのか
初回投稿日時: 2009年06月30日14時30分33秒
カテゴリ: Javascript Software
SNS:
Tweet (list)
W3CのDOMのメーリングリストのIME events以下や、それ以前にもDaniel氏と直接メールでやりとりをしていましたが、確かに現状、IMEまわりの挙動についてあまりにもW3Cで定義していないために、JavascriptでIMEの入力中に何かアクションをとろうとしてもWebアプリはブラウザごとの挙動の違いを意識しまくらないといけない、という問題があります。
これらの議論の直接のきっかけは、Google Waveによる入力中のテキストを複数のクライアント間で同期をとろうとしたことのようですが、この、ユーザ以外の人が同じコンテキストのテキストを変更してしまう、というのをインテリな日本のIMEは想定していないところがあります(もちろん、実際にGoogle Waveがそういう使われ方をするのか、という話になると、そんなことはほとんど無いんではないと思うのですが、ソフトウェアのデザインというのはそういうアレなケースでも動かないといけないわけで)。
で、今及川さんとの間でディスカッションしているのが、IMEの候補ウインドウ(candidate window)をJavascriptからどうにか制御したりできないのか、というもの。私個人の意見としては、IMEってのはシステムの一部であって、ユーザはそのIMEの使い方を既に学習している訳ですし、その機能をフルに使えてしかるべきだと思うので、アプリケーションがその挙動に介入してしまうのは良くないと思うのですが、それでもアプリ側で制御したいという要望があるのも理解できるところです。
で、IMEの候補ウインドウに関するAPI等をざっとながめてみた感じでは、PCのメジャーなプラットフォームでは以下のような感じかな、と思って上記のスレッドにポストしています。間違い等あれば、www-domに意見をもらえれれば助かります。
- IMM32
-
ImmSetCandidateWindow
で位置は指定可能WM_IME_SETCONTEXT
のハンドリング時なら、非表示にすることも可能、ただし、任意のタイミングでの非表示はできない?
- TSF
-
- UIlessモードじゃなければ、位置指定も非表示もできない
- UIlessモードなら、表示しようとしたときに抑制はできるっぽい
- UIlessモードでも、位置の指定はできないっぽい
- UIlessモードで非表示にしてしまって、候補ウインドウを自前で描画すれば位置指定も可能になるけど、補足説明等の候補ウインドウの本来の基本機能以外は失われる可能性大
- そもそも、UIlessモードをサポートしないTIPが存在する可能性があるのではなかろうか
- GTK2
-
gtk_im_context_set_cursor_location
で位置指定は可能- 非表示にすることができそうなAPIは見あたらない
- Cocoa (10.5以降のIMKを考慮に入れて)
-
- 位置も非表示も指定できないっぽい
IMEの仕様によっては、候補ウインドウって必ず必要であってもおかしくない代物ではあるので(例えば中国語のIME等)、これを非表示にしよう、という発想はやっぱり無しなのではないかと私は思います。位置の指定に関しても、スクリーンとキャレットの位置関係等から、それなりに色々と考慮して位置決めが行われるので、なかなか直接的な指定は難しいのではないかな、という印象があります。
及川さんの文面を見る限りでは、候補ウインドウが表示された位置とサイズが分かれば、別のアプローチも可能なのではないかな、と思うのですが、全プラットフォーム共通でサイズは取得できないっぽいのでこのアイデアもボツ。
この辺の担当としての個人的な意見としては、IMEで未確定文字列がある状態というのは、文字通り「未確定」、つまり入力している真っ最中なので、その時に他から色々と割り込まないで欲しい、というのが本音ではあるのですが、逆の立場なら確かに当然の要求なんだよなぁと思うところもあって悩ましいです。