Etsushi Kato
ekato****@ees*****
2004年 4月 17日 (土) 00:29:25 JST
こんばんは。 On Thu, Apr 15, 2004 at 11:08:44PM +0900, yusuk****@cheru***** wrote: > で、passive packetというのは返事を送れるチャンスになったら > 返事よりも先に送ってしまうパケットというつもりでコードを書きました。 > プロトコル的には > (1)Client->Server XIM_FORWARD_EVENT > (2)C<-S XIM_SYNC_REPLY > というの流れが必要なのですが、ここにキーイベントの送り返しと確定が > 発生すると > (1)C->S XIM_FORWARD_EVENT > (2)C<-S XIM_FORWARD_EVENT(返事として同じイベント) > (3)C<-S XIM_COMMIT(確定文字列) > (4)C<-S XIM_SYNC_REPLY > ということになるのですが、前回のpatchでは(2)と(3)の順序は保たれて > いたのですが、(3)と(4)が入れ替わっていて、次にC<-Sのパケットが > 来るチャンスが来ないと(3)の処理が保留されてしまうというのが > 問題の原因でした。 なるほど。 パッチを送っておきながら実は自分で混乱してしまっいているので、uim-xim (skk) の変換中にリターンキーを押した場合、 XIM server がパケットをどの ように client に送っているか一応まとめてみました。--trace-xim の結果も載 せておきます (左が S で右が C)。右の説明は正確でないかもしれません。 uim-0.3.3 では、変換中にリターンキーを押すと XIM_COMMIT をまず送るので すが、その後 XIM_SYNC_REPLY する前にXIM_FORWARD_EVENT で改行を送ってし まうので、client 上では改行してから次の行に確定された文字が表示されて いました。 <-: XIM_FORWARD_EVENT. ▽とか▼の状態でリターンキー (->): XIM_COMMIT. 確定した文字を送る ->: XIM_FORWARD_EVENT. 改行を送る ->: XIM_SYNC_REPLY. 改行を sync <-: XIM_SYNC_REPLY. 改行された <-: XIM_FORWARD_EVENT. keycode 0 の KeyPress イベント ->: XIM_FORWARD_EVENT. ->: XIM_SYNC_REPLY. <-: XIM_SYNC_REPLY. 確定された内容が表示された <-: XIM_SET_IC_VALUES. ->: XIM_SET_IC_VALUES_REPLY. <-: XIM_SET_IC_VALUES. ->: XIM_SET_IC_VALUES_REPLY. 補足ですが、uim-0.3.3 より前の uim-xim では、client から forward され てきた keycode 0 の KeyPress イベントは DO_NOTHING と扱われていたので、 XIM_FORWARD_EVENT (send_key_event) が起きず、client 上では改行だけされ て確定したはずの文字は表示されずに消えていました。 そこで [Anthy-dev 699] に送ったパッチでは send_sync_reply() を前に持っ てくることによって、XIM_COMMIT のあとすぐに XIM_SYNC_REPLY を送り、そ の後 XIM_FORWARD_EVENT で改行を渡すようになったので、確定と改行の順序 が保たれるようになりました。 <-: XIM_FORWARD_EVENT. ▽とか▼の状態でリターンキー (->): XIM_COMMIT. 確定した文字を送る ->: XIM_SYNC_REPLY. 確定した文字を sync ->: XIM_FORWARD_EVENT. 改行を送る <-: XIM_SYNC_REPLY. 確定された内容が表示された <-: XIM_SET_IC_VALUES. ->: XIM_SET_IC_VALUES_REPLY. <-: XIM_SYNC_REPLY. 改行された <-: XIM_SET_IC_VALUES. ->: XIM_SET_IC_VALUES_REPLY. ただし、COMMIT_RAW になる文字の場合、まだ何も文字を送らないうちに XIM_SYNC_REPLY を先に送って、そのあと実際のキーを XIM_FORWARD_EVENT で クclient に送ることになるので、場合によっては emacs で保留がおこるよう になりました。 で、結局 [Anthy-dev 761] で XIM_FORWARD_EVENT を passive で送るように したことによって、確定と改行の順序も保たれ、また COMMIT_RAW の場合でも、 XIM_FORWARD_EVENT が XIM_SYNC_REPLY より先に来るので問題なくなりました。 <-: XIM_FORWARD_EVENT. ▽とか▼の状態でリターンキー (->): XIM_FORWARD_EVENT. 改行を送る (->): XIM_COMMIT. 確定した文字を送る ->: XIM_SYNC_REPLY. 確定した文字を sync <-: XIM_SYNC_REPLY. 確定された内容が表示された <-: XIM_FORWARD_EVENT. 改行 の KeyPress イベント (->): XIM_FORWARD_EVENT. 改行を送る ->: XIM_SYNC_REPLY. 改行を sync <-: XIM_SYNC_REPLY. 改行された <-: XIM_SET_IC_VALUES. ->: XIM_SET_IC_VALUES_REPLY. <-: XIM_SET_IC_VALUES. ->: XIM_SET_IC_VALUES_REPLY. > > > 一応の解決策として、すでに send_sync_reply してしまったという事で、 > > > COMMIT_RAW 時の send_key_event を push_packet ではなく > > > push_passive_packet で送るようにしてみました。 XIM を理解していないの > > > で、全く間違ったことをしている心配はありますが… > ということで、これで正解のようです。 よかったです。文字の送信を push_passive_packet で行なえば、それらが必 ず XIM_SYNC_REPLY より先に送られるので、send_sync_reply と OnKeyEvent の位置関係は問題にならないのですね。 -- Etsushi Kato ekato****@ees*****