トップ «前の日記 最新 次の日記»

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 でウィンドウが移動してくれるんだろうか。 端末アプリの場合を見る限り、ダメっぽいんだが…


編集 パスワード変更