Canna から乗り換えて以来、ATOK for Linux 一本でやってきたのだが、GTK+ 3.0 でビルド中の GNOME 3.0 アプリでは日本語入力はできないだろうなぁという不安がふとよぎったので、まずは確認してみる。良くも悪くも慣れ親しんだ ATOK で日本語が入力できなければ GNOME 3.0 デスクトップ作業はかなりキツイかなぁと。
ここでは、既にビルドした testgtk にある GtkEntry クラスのテスト・ウィジットを使ってみた:
予想通り正しく入力はできないが、X経由で入力しているので変換前のコンテキストは表示されているようだ。とはいえ、キーボードからは「にほんごの」と入力したのだがこれでは全く使い物にならない。
GtkEntry ウィジェットの上で右クリックしてコンテキスト・メニューを表示してみる:
この [入力メソッド(M)] のメニュー項目に、該当する入力メソッド (IIIM) がないのは、GTK+ 3.0 の入力メソッド・モジュール (Input Method Modules) に ATOK X3 で利用できるクライアント・ライブラリ、通称 iiimgcf が登録されていないからだ。当たり前だが。
GTK+ 3.0 では 2.0 と同様にいくつかの immodules (XIM とかタイ語の独自系フレームワークなど) がデフォルトで用意されているが、ATOK 用は Justsystem の製品に含まれていた im-iiim.so なるモジュールをインストールしておく必要がある。今使っている GTK+ 2.0 だと:
aihana@mikeforce3:~>cat /etc/gtk-2.0/gtk.immodules # GTK+ Input Method Modules file # Automatically generated file, do not edit # Created by /usr/bin/gtk-query-immodules-2.0 from gtk+-2.22.1 # "/usr/lib/gtk-2.0/2.10.0/immodules/im-ipa.so" "ipa" "IPA" "gtk20" "/usr/share/locale" "" (省略) "/usr/lib/gtk-2.0/immodules/im-iiim.so" "iiim" "Internet/Intranet Input Method" "iiimgcf" "/usr/share/locale" ""
ちなみに ATOK を使った日本語入力要求の流れはこんな感じかな。変換や確定、表示といった結果はこの逆ということで。
GTK アプリ → (X経由) → GTK IMConext → im-iiim.so クライアント → libiiim*.so ライブラリ → (IIIM プロトコル) → iiimd デーモン → 日本語辞書
ということは、GTK+ 3.0 用の im-iiim.so クライアントを用意すれば 2.0 同様に日本語入力できるわけで、それも 2.0 と 3.0 の両クライアントからそれぞれ利用できるということになる。
というわけで、製品版を購入すると IIIMF のソースアーカイブと Justsystem が独自に作成したパッチがいくつかついてくるので、これを GTK+ 3.0 とリビルドしてみる。サーバ側の iiimd デーモンや libiiim*.so ライブラリは既にシステムにインストール済のものを利用したりリンクするので、今回は iiimgcf を GTK+ 2.0 から 3.0 へ移植するといった感じ。
結果からいうと、移植してリビルドすると見事日本語入力できるようになった 。
移植の際は Migrating from GTK+ 2.x to GTK+ 3 と testgtk.c を参考にした。前のブログでも書いておいたけど、GtkStyle クラスは全く利用できないため書き換えが必要だった。Justsystem が提供している iiimgcf は GTK+ 2.0 の初期バージョンからまったく更新されておらず、この GtkStyle を使ったコードが多くて手こずったが。あと、ステータスバーとかは GDK を使っているが、こちらは GTK+ 3.0 になって deprecated になったものが多く、Cairo を使うことが推奨されているため、いくつか書き直した (例えば gdk_draw_rectangle() なんか)。コードの書き換えは、前述の testgtk のソースコードが大変役に立った。バージョン 2.0 と 3.0 の testgtk.c を比較すると書き換え時の違いがよく分かる。どこぞの掲示板とかで GTK+ プログラミングを教えて!とか書き込まれているのをみると、まずは testgtk.c を読め!とでも返事した方がイイな 。
とはいえ、最初は iiimgcf の GTK+ 3.0 を誰かビルドしているかなぁと思い、最新の IIIMF のソースコードを探してみたけど、配布元と思われる OpenI18n という団体にもアクセスできないし、ウェブにもころがっていなかったので、仕方なく移植したといった次第。まぁ、Justsystem はこの団体が公開しているソースコードを利用して売っているだけなので、コードが古いのはある程度仕方がないか。
実行時の注意点としては、ビルドした im-iiim.so を GTK+ 3.0 の所定の場所にインストールして、gtk-query-immodules-3.0 した結果を、GTK+ 2.0 のように /etc/gtk-3.0/gtk.immodules というファイルではなく、このドキュメントの GTK_IM_MODULE_FILE の説明に従って、/usr/lib/gtk-3.0/3.0.0/immodules.cache といったファイルに保存すること:
aihana@mikeforce3:~>ls -al /usr/lib/gtk-3.0/3.0.0/immodules/ 合計 480 drwxr-xr-x 2 root root 4096 2011-03-06 21:46 ./ drwxr-xr-x 5 root root 4096 2011-02-27 16:11 ../ -rw-r--r-- 1 root root 19488 2011-02-27 16:08 im-am-et.so -rw-r--r-- 1 root root 6256 2011-02-27 16:08 im-cedilla.so -rw-r--r-- 1 root root 7800 2011-02-27 16:08 im-cyrillic-translit.so -rw-r--r-- 1 root root 309004 2011-03-06 21:46 im-iiim.so -rw-r--r-- 1 root root 8224 2011-02-27 16:08 im-inuktitut.so -rw-r--r-- 1 root root 6904 2011-02-27 16:08 im-ipa.so -rw-r--r-- 1 root root 14576 2011-02-27 16:08 im-multipress.so -rw-r--r-- 1 root root 14408 2011-02-27 16:08 im-thai.so -rw-r--r-- 1 root root 19472 2011-02-27 16:08 im-ti-er.so -rw-r--r-- 1 root root 19472 2011-02-27 16:08 im-ti-et.so -rw-r--r-- 1 root root 8120 2011-02-27 16:08 im-viqr.so -rw-r--r-- 1 root root 31512 2011-02-27 16:08 im-xim.so aihana@mikeforce3:~>sudo bash -c 'gtk-query-immodules-3.0 > /usr/lib/gtk-3.0/3.0.0/immodules.cache' aihana@mikeforce3:~>ls -al /usr/lib/gtk-3.0/3.0.0/immodules.cache -rw-r--r-- 1 root root 1838 2011-03-06 21:46 /usr/lib/gtk-3.0/3.0.0/immodules.cache aihana@mikeforce3:~>cat /usr/lib/gtk-3.0/3.0.0/immodules.cache # GTK+ Input Method Modules file # Automatically generated file, do not edit # Created by gtk-query-immodules-3.0 from gtk+-3.0.1 # (省略) # "/usr/lib/gtk-3.0/3.0.0/immodules/im-iiim.so" "iiim" "Internet/Intranet Input Method" "iiimgcf" "/usr/share/locale" "*" (省略)
こんな感じで先ほどの testgtk から日本語を入力してみる。まずは[入力メソッド(M)]のメニュー項目には IIIM が表示されていることを確認:
GtkEntry に実際に「にほんご」を入力して変換することもできた:
ということで、GTK+ 3.0 でも今までと同じように日本語入力ができるようになったので、GNOME 3.0 のビルドを再開する。
次回はパッチとビルド方法について解説する予定。