Loading [Contrib]/a11y/accessibility-menu.js
トップ «前の日記 最新 次の日記»

2019-11-17 (Su) [長年日記]

preedit を on/off できるようにした

widget ごとに im context を作ってたんだけど、 どうも作るだけで機能してしまって、gtk_im_context_set_client_window() を 呼ばなくても機能はしてしまうみたい。

ということは、im context が存在する限り off にはできないわけで。

で、IM を使う widget を gtk_im_context_set_client_window() で好きなように 切り替えられるみたいなので、on にしたら 1つだけ作って全ウィンドウで使い回して、 off にしたら g_object_unref() で捨てることにした。

Emacs の場合、Emacs の外部で変換して Emacs に入力する方法と、 Emacs にキーイベントを全部投げて Emacs 内で変換する方法と、 流儀が2つあるので、ちょい面倒だよね。

preedit の位置を調整した

確定と同時に次の preedit が始まると、最初だけ位置がおかしくなる。

それは、

  1. 確定
  2. 文字入力イベントを queue に突っ込む
  3. 次の preedit が始まる
  4. preedit text を現在のカーソル位置に表示
    1. で突っ込まれたイベントを dequeue する
  5. 文字がバッファに入力される
  6. preedit text の表示位置は変化しない

となるため。

解決策としては、文字入力イベントの後ろに preedit text イベントを突っ込むしか 思いつかなかった。

はー。また keyboard event loop をいじることになろうとは…… 理解するの難しいんだ、ここ…

でもま、なんとか修正できた。

ちなみにこの修正により、昨日の SET_FRAME_GARBAGED(f) は呼ばなくてよくなった。 やっぱりなー。こんなことで必要になるなんて、おかしいと思ったんだよ sweat_drops

残り。

  • フォントが違うのをなんとかしたい
  • C-x 2 が挿入される

編集 パスワード変更