yusuk****@cheru*****
yusuk****@cheru*****
2004年 4月 15日 (木) 23:08:44 JST
田畑です。 > > こちらで確かめてみたところ、Linux ではそのような症状は出ませんでしたが、 > > Mac OS X では確かに問題が出ました。前回の変更で、イベントの処理の順番 > > を変えるために send_sync_reply を先に持って来たことが原因だと思います。 > > よく考えずパッチを送ってしまってすみません。 こちらこそよく確認してなくてすみません。 XIMではサーバから送るパケットは何かのパケットの返事として 送らないといけないというルールがあります。 #skkinput2のソースコード中のコメントというか愚痴、 #とuim-xim --trace-ximの出力が参考にできると思います。 で、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)の処理が保留されてしまうというのが 問題の原因でした。 クライアントの作りによっては、preeditの場所の 更新などで、そのチャンスがすぐ来るのですが、そうでない場合に 問題となったようです。 > > 一応の解決策として、すでに send_sync_reply してしまったという事で、 > > COMMIT_RAW 時の send_key_event を push_packet ではなく > > push_passive_packet で送るようにしてみました。 XIM を理解していないの > > で、全く間違ったことをしている心配はありますが… ということで、これで正解のようです。 uim-ximのコード自体はそろそろ5周年になろうというのに、 まだまだバグが出てきて悲しいです。 -- CHAOS AND CHANCE! Yusuke TABATA (yusuk****@cheru*****)