Help us understand the problem. What is going on with this article?

IMEを使う(GTK+編)

More than 3 years have passed since last update.

はじめに

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の話になります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした