2019-11-11 (Mo) [長年日記]
_ Gtk で input method が使えるようにする
自前改造版 emacs って、Gtk アプリなのに input method が使えないんだよな… ってのが少し残念で、使えるようにしようかと数日前からちょこちょこ考えてた。
とりあえず試しにやってみた。
gtk_im_multicontext_new()
する- この im context に対して、
gtk_im_multicontext_set_context_id()
する (optional みたい)- preedit を false に
- client_window をセット
- focus_in
commit
signal handler をセット
- keypress 時にイベントを im context に渡す
commit
時に、single byte 文字と multi byte 文字でタイプを分けて、event queue に突っ込む
だいたいこんなもんで、とりあえず動いた。
そういや cursor location のセットをやってないな。 とりあえずやらんでも動くやろ、と思ってやらなかった。
preedit を false にしておけば、im 側でよろしくやってくれて、 結果だけ返してくれるので、楽なんだけど、 見栄え的にはいまいちだよな。 かといって preedit を実装するのはかなり大変…
commit 時の処理に若干問題があって、
modifier も timestamp も常に 0 にしかできない。確定した文字列しかくれないから。
問題とは思うけど、どうしようもないから、このままでいくしかないか。
一応、試した限りでは C-x
なんかは filter で食われないので、大丈夫なのかもしれない。
いやわかんないけど。fcitx でしか試してないし。
あとは、im context なしでもいけるようにしたいな。 im context を常に有効にすると、たぶん mozc.el までキーが届かないだろうから。
そもそもが、複数の frame に対応してないので、まずはそこからかな。 gtk の gtkentry.c を見たところ、各 widget ごとに im context を作っていいみたいなので、 frame ごとに作ればいいな。
いや、まずは cursor location からかな。 wayland でウィンドウが移動してくれるんだろうか。 端末アプリの場合を見る限り、ダメっぽいんだが…
[ツッコミを入れる]