yusuk****@cheru*****
yusuk****@cheru*****
2003年 7月 9日 (水) 21:38:06 JST
田畑です。 Qtのアプリにjmodeで入力すると遅いという報告を受けたので、 調べてみました。 まず、jmodeは英数モードの際にもキーイベントを受けとる ように設定しているという点で他のXIMサーバと異なっています。 GUIのツールバーから英数モードと平仮名モードの切り替えを 実現するためにこのような設定になっています。 (XIMではサーバ側からイベントの転送開始を指示できない) また、Qtはプリエディットが無い時に一回キーが押されると4回の XSetICValuesを呼ぶというのも原因のようです。 キーイベントを含めてXIMサーバとの間でパケットが5往復する ことになります。また、jmodeはXのイベント経由で通信をするので コンテキストスイッチは jmode <-> Xサーバ <-> Qtアプリで 発生してて、結構悲惨です。 XSetICValuesを呼んでいるのは QInputContext::setComposePosition()と QInputContext::setComposeArea()で2回です。 XSetICValuesは名前がValue*s*で複数形であることから わかるようにこの2回の呼出しは統合できます。 さらに、これらはキーを押した時とカーソルが移動した時の 2回呼ばれて計4回です。この場合はカーソルを動かしたあとの 一回にまとめれば良いので統合することができます。 ということで、直し方はわかったのですが、XIM関連のコードを 直すよりも本質的な改善に取り組むというのが、私も含めた 周囲の皆様のコンセンサスだと解釈しているので、この問題の 優先順位は低いです。 -- CHAOS AND CHANCE! Yusuke TABATA (yusuk****@cheru*****)