ATOK 3X for GTK+ 3.0.

Canna から乗り換えて以来、ATOK for Linux 一本でやってきたのだが、GTK+ 3.0 でビルド中の GNOME 3.0 アプリでは日本語入力はできないだろうなぁという不安がふとよぎったので、まずは確認してみる。良くも悪くも慣れ親しんだ ATOK で日本語が入力できなければ GNOME 3.0 デスクトップ作業はかなりキツイかなぁと。
ここでは、既にビルドした testgtk にある GtkEntry クラスのテスト・ウィジットを使ってみた:
atokx-gtk3-20110306-01.png
予想通り正しく入力はできないが、X経由で入力しているので変換前のコンテキストは表示されているようだ。とはいえ、キーボードからは「にほんごの」と入力したのだがこれでは全く使い物にならない。
GtkEntry ウィジェットの上で右クリックしてコンテキスト・メニューを表示してみる:
atokx-gtk3-20110306-02.png
この [入力メソッド(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 へ移植するといった感じ。
結果からいうと、移植してリビルドすると見事日本語入力できるようになった 8)
移植の際は 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 を読め!とでも返事した方がイイな :X
とはいえ、最初は 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 が表示されていることを確認:
atokx-gtk3-20110306-03.png
GtkEntry に実際に「にほんご」を入力して変換することもできた:
atokx-gtk3-20110306-04.png
ということで、GTK+ 3.0 でも今までと同じように日本語入力ができるようになったので、GNOME 3.0 のビルドを再開する。
次回はパッチとビルド方法について解説する予定。

Building my GNOME 3.0.

前に紹介した GNOME 3.0 の Live CD もベータ版にあわせて順調にリリースを重ねているようで、そろそろ My Desktop も新しくしてみようとパッケージのビルドを開始してみた。
まずはベースとなるシステムを今までの Ubuntu の Maverick から Natty に上げてみる:


aihana@mikeforce3:~>lsb_release -a
LSB Version:	core-2.0-amd64:core-2.0-noarch:core-3.0-amd64:core-3.0-noarch:core-3.1-amd64:core-3.1-noarch:core-3.2-amd64:core-3.2-noarch:core-4.0-amd64:core-4.0-noarch:cxx-3.0-amd64:cxx-3.0-noarch:cxx-3.1-amd64:cxx-3.1-noarch:cxx-3.2-amd64:cxx-3.2-noarch:cxx-4.0-amd64:cxx-4.0-noarch:desktop-3.1-amd64:desktop-3.1-noarch:desktop-3.2-amd64:desktop-3.2-noarch:desktop-4.0-amd64:desktop-4.0-noarch:graphics-2.0-amd64:graphics-2.0-noarch:graphics-3.0-amd64:graphics-3.0-noarch:graphics-3.1-amd64:graphics-3.1-noarch:graphics-3.2-amd64:graphics-3.2-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-3.2-amd64:printing-3.2-noarch:printing-4.0-amd64:printing-4.0-noarch:qt4-3.1-amd64:qt4-3.1-noarch
Distributor ID:	Ubuntu
Description:	Ubuntu Natty (development branch)
Release:	11.04
Codename:	natty
aihana@mikeforce3:~>

ただし、一度に全てのパッケージをあげようとすると今の GNOME 2 環境がぼろぼろになるので、以前痛い目にあった経験を生かしつつ影響の少ない範囲で。まずは libc、toolchain、xorg 系のライブラリ、システムライブラリ、ユーティリティ なんて順で上げていく。今回は binutils が曲者だったなぁ :|
で Ubuntu は次の Natty から GNOME 3.0 ではなく独自の Unity UI を採用するため、肝心な GNOME 3 系のパッケージはほとんど揃っていない状況。なので Debian の experimental パッケージを参考に依存関係に従い要所々で Build-Depends なパッケージをアップグレードしながらビルドしていく。今のところ gnome-keyring-3 までは完了。ちなみに、日本語メッセージ・カタログの更新はパッケージのインストールが完了した後に片付ける予定。
そんなもので、ここで紹介できるアプリはまだまだ少ないのだが GTK+ 3 付属の testgtk や新しくなった GNOME Control Center などでも。
GTK+ 3.0 はもちろん GTK+ 2.0 と一緒にインストールしておける (まぁこれは GTK+ 1.2 系から 2.0 系にアップグレードした時と同じ条件だけれど)。細かい変更点はリリースノートや Migrating from GTK+ 2.x to GTK+ 3 なんかを参照すれば特徴や規模とかはわかるはず。アプリの移植なんかもあるので、後者は近いうちに抄訳する予定 :)
GTK+ に付属する testgtk:
building-gnome3-gtk3-testgtk-20110306.png
目立ってウィジェットの追加などはないので 2.0 系とほとんど変わらない。表示している色とか文字とかは従来の rc ファイルから css 形式に変更になっている。そのため GtkStyle クラスべったりな、特に 2.0 系の初期からこのスタイル周りの変更を適用していない古いアプリなんかは大変だな :Oこの辺の概念や 2.0 系の頃の GC のプロパティとの違いとか。
さらに 2.0 系後半で Deprecated な烙印を押された API がことごとく無くなっているのも追い打ちになっていたりして。
building-gnome3-gtk3-testlabel-20110306.png
GLib や Pango といったバックエンド系ライブラリは 2.0 系を踏襲しているのであまり変化なし。
building-gnome3-gtk3-testappchooserbutton-20110306.png
とはいえ、新しいウィジエットが全く無いわけでもなく。Combo と GtkChooser 系を組み合わせた感じで、コンボのメニューから [その他のアプリケーション…] を選択するとダイアログが出てくるし:
building-gnome3-gtk3-testappchooserbuttondialog-20110306.png
これも新ウィジェットかな。こちらはGNOME コントロール・センターでも多用されているスイッチ風のウィジェット:
building-gnome3-gtk3-testswitch-20110306.png
こちらは新しいコントロール・センターのシェル。ますますどこぞの OS のものと似てきたな:
building-gnome3-gtk3-gcc-20110306-01.png
シングル・ウィンドウなスタイルで、シェルにあるアイコンをクリックすると中身だけ切り替わる:
building-gnome3-gtk3-gcc-20110306-02.png
これは時刻と日付を変更する設定。左上にある [All Settings] ボタンで元のシェル画面に戻る。
building-gnome3-gtk3-gcc-20110306-03.png
ネットワークの設定は NetworkManager を使っているのだけれど、今は Build-Depends なバージョンが合わず無効にしている。
最後は gnome-disk-utility。これがビルドの順番で一番最初に GTK+3 化ドしたアプリ:
building-gnome3-gtk3-gdu-20110306.png
ちなみに上のアプリのテーマはデフォルトです。既に gnome-themes 系のアプリもインストールしたので、おそらくセッションを入り直せばもう少しはマシな見映えになるはず。