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 が始まると、最初だけ位置がおかしくなる。
それは、
- 確定
- 文字入力イベントを queue に突っ込む
- 次の preedit が始まる
- preedit text を現在のカーソル位置に表示
-
- で突っ込まれたイベントを dequeue する
- 文字がバッファに入力される
- preedit text の表示位置は変化しない
となるため。
解決策としては、文字入力イベントの後ろに preedit text イベントを突っ込むしか 思いつかなかった。
はー。また keyboard event loop をいじることになろうとは…… 理解するの難しいんだ、ここ…
でもま、なんとか修正できた。
ちなみにこの修正により、昨日の SET_FRAME_GARBAGED(f)
は呼ばなくてよくなった。
やっぱりなー。こんなことで必要になるなんて、おかしいと思ったんだよ
残り。
- フォントが違うのをなんとかしたい
C-x 2
で2
が挿入される
[ツッコミを入れる]