はじめに
GTK+はクロスプラットフォームなGUIライブラリらしいです。
その中でいかにIMEを使うかについての記事です。
GtkIMContext
https://developer.gnome.org/gtk3/stable/GtkIMContext.html
連日のIMEの記事で何度も似たようなことを書いていますが、IME APIの役割はアプリケーションからIMEに変換や変換候補の表示のための情報を渡し、IMEからアプリケーションに挿入するべき文字列や未確定文字列の情報を渡すことです。
初期化など
-
gtk_im_multicontext_new
でGtkIMContext
を取得する -
gtk_im_context_set_use_preedit
でTRUE
を設定する- 未確定文字列を自前で処理する
- 対象のウィンドウへのフォーカスに応じて適宜呼ぶ
gtk_im_context_focus_in
gtk_im_context_focus_out
-
gtk_im_context_filter_keypress
にGdkEventKey
を渡す - 終了時に
gtk_im_context_reset
する
基本実装について
以下のコールバックに登録する関数を実装します。
-
void commit
- 現在の選択範囲に渡された文字列を挿入する
-
gboolean delete-surrounding
- 指定範囲をキャレットからの相対位置で削除する
-
void preedit-changed
- 未確定文字列を更新する
- 未確定文字列は
gtk_im_context_get_preedit_string
で取得する- 注意点
- 取得される文字列はUTF-8
- キャレット位置はコードポイント(あるいはUTF-32)でのインデックス
- キャレットの位置を
gtk_im_context_set_cursor_location
でIMEに知らせる
-
void preedit-end
- 未確定文字列を破棄する
-
void preedit-start
- 未確定文字列の編集を開始する
-
gboolean retrieve-surrounding
-
gtk_im_context_set_surrounding
で周辺の文字列とその中でのキャレット位置を返します- 注意点
- 渡す文字列はUTF-8
- キャレット位置はUTF-8でのインデックス
-
縦書きについて
GTK+3のVersion 3.18から縦書きに対応されたようです。
- プロパティの
input-hints
に以下を設定するGTK_INPUT_HINT_VERTICAL_WRITING
対応してるIMEはあるんですかね。
(TATEditorは一応対応していますが、私はまだ縦書きでのIMEの挙動を確認したことはありません)
おわりに
キャレット周辺の文字列取得がアプリケーション側に委ねられているのは、動作速度的に嬉しいですね。
最低限の実装はちゃんと揃っているのですが、縦書き対応が遅かったのが……。
明日と明後日はiOS/AndroidのモバイルOSの話になります。