2011-02-25 (金) の 17:54 +0900 に Etsushi Kato さんは書きました:

> 2011/2/25 Hiroyuki Ikezoe <hiike...@gnome.org>:
> > かとうさんは先のスレッドで、uimがプリエディットをクリアしていないのはGTK+のドキュメントにおいてgtk_im_context_reset
> > はcursor position change時に呼び出されるもので、プリエディットをクリアするかどうかは各IMの実装者によると説明していまし
> > たが、これはかとうさんの記憶違いではないかと思うのです。
> 
> えっと、そういう意図の説明ではなかったような気がします。GTK+ では、"本
> 当のリセット" (初期化的な物) と "クリックなどによってカーソルがジャン
> プしたりした場合に必要な (必要ではない場合もあり) リセット" が区別でき
> ないので、uim では uim 内 の各言語ごとに対応ができるように、
> gtk_im_context_reset() で必ずしもプリエディットを消去 (確定) してはい
> ませんよ、という意味で書いたような気がします。

なるほど。理解できました。

> > 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_im_context_reset() がどういう意図なのかわからないので、とりあえず
> uim ではカーソル移動的なリセットと解釈して focus_out と focus_in で処
> 理しようということでした。
> 
> 
> > で、uimが対処した上記のような場合だけじゃなくて、以下のような場合を想像してください。
> >
> > 1) エディタ上でプリエディット中に上書き保存機能のショートカットキー(Ctrl+S等)が押された場合
> >  -> プリエディットをコミットしたいIMもある(Byeoru)
> >  -> そのままプリエディットの状態を続けたいIMもある
> >
> > 2) エディタ上でプリエディット中にツールバー上の文字の拡大ボタンが押された場合
> >  -> プリエディットはコミットされるべきではなく、プリエディットのまま文字が拡大される
> >
> > で、この両者(+uimが対処している保存ボタンの例)を今のところIM側では判別できませんし、ツールキット側(GTK+)でも判別できないはずです
> > (なんかすごく面倒くさいことをやればできるのかもしれませんが)。
> >
> > とりあえずここでは判別できないという仮定のもとに話を進めますが、であればこれはアプリケーションが面倒をみてやらないといけないと思うわけです。そ
> > のためには、アプリケーションからIMに『お前プリエディット中だけどそれをどうするか決めてくれ』ってお願いするメソッドが必要になるわけです。
> >
> >
> > で、そういうメソッドが必要だと思ってるんですが、どうでしょうか?
> > また、そのメソッドの名前なんですが、どんな名前がいいでしょうか?
> > 自分ではちっともいい名前が浮かんでこないので、まだきちんと整理されていないのかなあと思いますが、みなさんのすばらしい灰色の脳細胞からいい知恵を
> > お借りしてなんとかよい着地点を見つけたいなと思います。
> >
> > # なんとなくgtk_im_context_resetはもともとこういう用途のために作られたんじゃないかとも思ったりもしますが…
> 
> そう思います。問題は、”本当のリセット" がないことによる混乱 (?) かな、
> と思っていました。そういった用途に、
> gtk_im_context_fix_preedit(GtkIMContext *context) みたいな API (fix は
> 固定してコミットするという意味) があればいいとは、昔は思ったような記憶がありま
> す。

実際のところ、アプリケーション側からそういう風に強制的にコミットする機
能って必要なんでしょうか? ”本当のリセット”のことも考えると以下の3つの
APIが要るんじゃないかと考えてる人がいる気がします。

a) gtk_im_context_reset: プリエディット中に呼び出された場合の動作は各IM
の実装に任せる

b) gtk_im_context_clear_preedit: プリエディット中の状態を初期化(プリエ
ディット文字列を削除)

c) gtk_im_context_fix_preedit: プリエディット中の文字列をそのままコミッ
ト

この中で、今のGTK+にはa)しかないわけですが、個人的にはアプリケーションが
b)c)を呼び出す必要性がいまいちピンと来ないので(IMのプリエディット中にそ
の状態をどうするかはアプリケーションには決められないと思ってるので)、現
状のままでもgtk_im_context_reset時の挙動に関して開発者の間で合意が取れて
いれば(GTK+のドキュメントに修正を入れた方がいいかもしれませんが)、今の
ままでよいのではないかとも考えています。

ただ、2)の場合にもresetが飛んできてしまうので、その点ではGTK+を修正しな
くてはいけませんが。

-- 
Hiroyuki Ikezoe

-- 
Google Groups "uim-ja" group
uim-ja@googlegroups.com
http://groups.google.com/group/uim-ja/about

メールによる返信