[Anthy-dev 2283] Re: IM切り替え時のプリエディット消去について

Back to archive index

YamaKen yamak****@bp*****
2005年 8月 24日 (水) 22:30:12 JST


ヤマケンです。こんばんは。

At Mon, 22 Aug 2005 21:53:49 +0900,
h0131****@ice***** wrote:
> uim-im-switcherでIMを切り替えるときにプリエディットや候補ウィンドウが
> あると、IMが切り替わってもそれらが消えないことがありました。
> r1280でcannaとanthyについては消えるように直しました。
> skkはプリエディットは消えるようにしましたが、再帰学習時の候補ウィンド
> ウを消す方法がわかりませんでした。
> primeはわからなかったので何もしていません。

0.5.0リリース間近なのに反応が遅れてすいません。

これは以下のような変更によって実現されていますが、ここで加わった
コードはいずれも各IMが責任を負うのではなく、上層で解決されるべき
ものです。できれば修正をお願いします。

--- trunk/scm/anthy.scm	2005-08-22 11:16:25 UTC (rev 1279)
+++ trunk/scm/anthy.scm	2005-08-22 12:39:24 UTC (rev 1280)
@@ -975,7 +975,10 @@
 (define anthy-reset-handler
   (lambda (ac)
     (if (anthy-context-on ac)
-	(anthy-flush ac))
+        (begin
+          (anthy-flush ac)
+          (im-clear-preedit ac)
+          (im-update-preedit ac)))
     ;; code to commit pending string must not be added to here.
     ;; -- YamaKen 2004-10-21
     ))

まず、(im-clear-preedit ac)はuim_reset_context()の中で同等のコー
ドが実行されているので不要です。各IMでは実行すべきではありません。

次に、(im-update-preedit ac)は各ブリッジが実行すべきです。各IMの
resetハンドラ内ではこれを *呼んではいけません(must not)*。ちゃん
と仕様を書いておかなかったので後出しで申し訳ないんですが、以下の
ような理由によります。

uimレベルでのreset操作は、uim_reset_context()を呼び出す事によっ
て行われますが、

例えばQtではtext widgetがresetされると、IMコンテキストをresetす
ると共に、toolkit側でプリエディットをクリアします。IM resetはそ
のtext widgetで各種編集操作(paste, undo等だったと記憶しています) 
を行うのに先立って呼ばれる場合があり、IMコンテキストはreset後は
それらの操作を妨げない初期状態になっている事が仮定されています。

Qt3ではtoolkit側でwidget毎にIM入力状態のステートマシンを持ってお
り、update-preeditを呼ぶためにはIMStartイベントを受けて入力可能
状態に遷移している必要があります。このため、reset時に
update-preeditを呼ぶという事は、たとえ空文字列のプリエディットで
あっても入力可能状態への遷移を引き起こしてしまいます(すいません
がうろ憶えです)。

以上はQtの例ですが、Qtの事情で特別な考慮をしろと言っているわけで
はなく、論理的に考えてreset時のプリエディット消去を各IMが行うの
はresponsibility separationの観点からおかしい(layer violation)と
いう事です。

なお、uim @ fdoでの以下のresetに関する議論は全て読んだ上での見解で
す。

http://lists.freedesktop.org/archives/uim/2005-May/001077.html

-------------------------------
ヤマケン yamak****@bp*****



Anthy-dev メーリングリストの案内
Back to archive index