3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TATEditorAdvent Calendar 2016

Day 14

IMEを使う(GTK+編)

Posted at

はじめに

GTK+はクロスプラットフォームなGUIライブラリらしいです。
その中でいかにIMEを使うかについての記事です。

GtkIMContext

https://developer.gnome.org/gtk3/stable/GtkIMContext.html
連日のIMEの記事で何度も似たようなことを書いていますが、IME APIの役割はアプリケーションからIMEに変換や変換候補の表示のための情報を渡し、IMEからアプリケーションに挿入するべき文字列や未確定文字列の情報を渡すことです。

初期化など

  • gtk_im_multicontext_newGtkIMContextを取得する
  • gtk_im_context_set_use_preeditTRUEを設定する
    • 未確定文字列を自前で処理する
  • 対象のウィンドウへのフォーカスに応じて適宜呼ぶ
    • gtk_im_context_focus_in
    • gtk_im_context_focus_out
  • gtk_im_context_filter_keypressGdkEventKeyを渡す
  • 終了時に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の話になります。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?