みなさん、こんにちは。 このメールはこのスレッド<http://groups.google.com/group/uim-ja/browse_thread/ thread/ef951232a7d29c8e>の続きです。
かとうさんは先のスレッドで、uimがプリエディットをクリアしていないのはGTK+のドキュメントにおいてgtk_im_context_reset はcursor position change時に呼び出されるもので、プリエディットをクリアするかどうかは各IMの実装者によると説明していまし たが、これはかとうさんの記憶違いではないかと思うのです。 cursor position changeにはgtk_im_context_set_cursor_locationがあるので、 gtk_im_context_resetはcursor position change時にも呼ばれるよということだと思います。 uimの英語のメーリングリストで該当する議論を読んでみましたが、uimがgtk_im_context_reset時にfocus_out/ focus_inをしているのは以下のような場合に対処したためではないでしょうか。 gedit上でプリエディット中にツールバー上の保存ボタンがマウスで押された際に、 Byeoru (ハングル) の場合プリエディットをコミットしたい (そういうことをしたいIMがある) で、このようなツールバー上のボタンが押された際にGTK+はfocus_outを呼んでくれないので、その際に呼ばれるresetの方でuim側で擬 似的にfocus_out/focus_inを呼び出してByeoru側ではfocus_out時にコミットする動作をするようにして対処したのではな いかと推測してます。 # GTK+のこの動作については議論があるかとは思いますが(個人的にはfocus_outを呼ばないで現状の動作で正しいと思ってますが)、ここで は置いておきます。 で、uimが対処した上記のような場合だけじゃなくて、以下のような場合を想像してください。 1) エディタ上でプリエディット中に上書き保存機能のショートカットキー(Ctrl+S等)が押された場合 -> プリエディットをコミットしたいIMもある(Byeoru) -> そのままプリエディットの状態を続けたいIMもある 2) エディタ上でプリエディット中にツールバー上の文字の拡大ボタンが押された場合 -> プリエディットはコミットされるべきではなく、プリエディットのまま文字が拡大される で、この両者(+uimが対処している保存ボタンの例)を今のところIM側では判別できませんし、ツールキット側(GTK+)でも判別できないはずです (なんかすごく面倒くさいことをやればできるのかもしれませんが)。 とりあえずここでは判別できないという仮定のもとに話を進めますが、であればこれはアプリケーションが面倒をみてやらないといけないと思うわけです。そ のためには、アプリケーションからIMに『お前プリエディット中だけどそれをどうするか決めてくれ』ってお願いするメソッドが必要になるわけです。 で、そういうメソッドが必要だと思ってるんですが、どうでしょうか? また、そのメソッドの名前なんですが、どんな名前がいいでしょうか? 自分ではちっともいい名前が浮かんでこないので、まだきちんと整理されていないのかなあと思いますが、みなさんのすばらしい灰色の脳細胞からいい知恵を お借りしてなんとかよい着地点を見つけたいなと思います。 # なんとなくgtk_im_context_resetはもともとこういう用途のために作られたんじゃないかとも思ったりもしますが… # プリエディット中にコピーとかペーストされた時のことも考えるともっと別のメソッドもいるような気がしますがそれはまた別の話 # 1)の場合にはプリエディット中のIMの状態も含めて保存するというウルトラCが個人的には欲しいなとも思いますが、それもまた別の話 -- Hiroyuki Ikezoe -- Google Groups "uim-ja" group uim-ja@googlegroups.com http://groups.google.com/group/uim-ja/about