今回は、以前紹介したMac OS XのCocoa版GTK+で日本語入力を行うためのgtkimmodule(GtkIMCocoa)の開発の続きです。
前回の記事に対してはいくつかの反応を頂きましたが、中でも興味深かったのは、Xamarin Studio(旧MonoDevelop)でも日本語入力ができるようになるかもしれないという記事でした。筆者は、現時点ではCocoa版GTK+に対応したバイナリを配布しているアプリケーションはほとんどないと認識していたので、これは意外な反応でした。この記事をきっかけに知ったのですが、Mac版MonoDevelopでは何年も前からCocoa版GTK+を採用しており、当初からユーザーの間では日本語入力の問題が取り沙汰されていたようです。MonoDevelopはメジャーなゲームエンジンの一つであるUnityにも採用されており、潜在的なユーザーは意外と多いのではないか?ということに気づきました。
そこで今回は、いくつかのGTK+アプリケーションにGtkIMCocoaを組み込んでみて、現時点のGtkIMCocoaがどの程度動作するのかを確認した結果を紹介致します。問題点を把握することで開発を加速させることが目的であり、現時点での実用性をアピールするものではありませんので、その面での期待はしないでください。
前回の記事でも紹介した通り、GtkIMCocoaはGTK+本体を修正すること無く組み込むことができるように設計されています。このため、バイナリ形式で配布されているGTK+に対しても、GtkIMCocoaのモジュールファイルを追加して、設定ファイルを更新するだけで適用することができます。
2013年5月22日現在、Xamarin Studioに同梱されているGTK+は、正式にMac OS Xに対応した3.0系ではなく、2.0系にCocoa対応パッチを当てたバージョンが採用されています。これに対して、GtkIMCocoaは主にGTK+3をターゲットとしており、前回の記事でリリースしたgtkimcocoa-0.0.0も、GTK+3のみをビルド対象としています。
しかし、その後の修正でGTK+2に対してもビルドできるように対応しておりますので、GTK+2アプリケーションに組み込みたい場合は、GitHubから最新のソースコードを取得してください。
GtkIMCocoaの基本的なビルドおよびインストール方法は前回の記事を参照してください。
Xamarin Studioに同梱されているGTK+に対するビルドも、基本的にはこれと同じ方法で行います。ただし、インストールされているパスやGTK+バイナリの対応アーキテクチャに合わせて、configureスクリプト実行時に環境変数を調整する必要があります。GTK+が/Library/Frameworks/Mono.framework/Versions/2.10.12にインストールされている場合のインストール例を以下に示します*1。前回と同様にjhbuildのshellで実行します。
$ ~/.local/bin/jhbuild shell $ export GTK_PATH=/Library/Frameworks/Mono.framework/Versions/2.10.12 $ git clone git://github.com/ashie/gtkimcocoa.git $ cd gtkimcocoa $ ./autogen.sh $ ./configure ¥ PATH="$GTK_PATH/bin:$PATH" ¥ PKG_CONFIG_PATH="$GTK_PATH/lib/pkgconfig" ¥ CFLAGS="-arch i386" ¥ LDFLAGS="-arch i386" $ make $ sudo make install $ $GTK_PATH/bin/gtk-query-immodules-2.0 | sudo tee $GTK_PATH/etc/gtk-2.0/gtk.immodules
Xamarin Studioに含まれるGTK+はi386用のバイナリですが、x86_64環境で普通にビルドしてしまうとx86_64用のバイナリが生成されてしまうため、CFLAGSおよびLDFLAGSにオプションを追加して適切なバイナリを生成するようにしています。
前述の方法でGtkIMCocoaを組み込んだXamarin Studio 4.0.1を実行したところ、トップ画面の検索エントリで日本語を入力できることを確認しました。
次にテキストエディタで入力を試みたところ、こちらでは問題が発生しました。
GTK+が標準で用意しているテキスト入力ウィジェットについては、前回の記事である程度の動作は確認できています。しかし、アプリケーションの中にはテキスト入力ウィジェットを独自実装して提供しているものもあります。このようなウィジェットでは、テキスト入力処理の動作がGTK+標準のウィジェットとは微妙に異なることによって、不具合が発生することもしばしばあります。このため、immoduleの開発にあたってはさまざまなアプリケーションと組み合わせての動作検証や調整が必要であり、時にはアプリケーション側の修正も必要となります。Xamarin Studioのテキスト入力ウィジェットもアプリケーション独自のウィジェットであるため、このケースに当たってしまったようです。
原因を究明するにあたり、まずはUbuntu上のXamarin Studioでも簡単に動作確認を行ってみました。UbuntuではGtkIMCocoaは動作しませんので、Ubuntu標準のibusというimmoduleで動作を検証しています。これにより、問題がアプリケーション側にあるのか、immodule側にあるのかを大雑把に切り分けることができます。
結果としては、
ということになりました。
この検証結果を受けてGtkIMCocoaには修正を入れ、2.〜4.の問題については解決しています。しかし、1.の問題については着手できておらず、今後の調査が必要です。
一つのアプリケーションだけでは問題を把握しきれない可能性が高いため、Xamarin Studioに加えて、Sylpheedでも動作検証を行いました。
SylpheedについてはMac OS X用のバイナリは配布されていませんので、ソースからビルドする必要があります。筆者の場合は、GTK+2をjhbuildでインストールし、GtkIMCocoaとSylpheedもjhbuildのshell上でビルドしました。
前回の記事を元にGTK+3をインストール済みの環境の場合、追加で以下を実行することでGTK+2をインストールすることができます。
$ ~/.local/bin/jhbuild build meta-gtk-osx-core
GtkIMCocoaについては、GTK+2用のimmoduleを追加するために、最新のソースコードを取得して、前回と同様の手順でビルドおよびインストールします。
$ ~/.local/bin/jhbuild shell $ git clone git://github.com/ashie/gtkimcocoa.git $ cd gtkimcocoa $ ./autogen.sh $ ./configure $ make $ make install $ gtk-query-immodules-2.0 > ~/gtk/inst/etc/gtk-2.0/gtk.immodules
Sylpheedのサイトからソースコードをダウンロードして、同様の手順でビルドします。
$ tar xvfj sylpheed-3.4.0beta3.tar.bz2 $ cd sylpheed-3.4.0beta3 $ ./configure --prefix=~/gtk/inst $ make $ make install
SylpheedではGTK+標準のウィジェットしか使われていないため、一見すると普通に動いている様にも見えます。
しかしながら、よくよく確認してみると、以下のような問題があることがわかりました。
その後の修正で2.の問題については解決していますが、1.および3.の問題については今後の調査が必要です。
今回の検証では、当初の設計意図通り、バイナリ配布されているCocoa版GTK+アプリケーションに対して、GtkIMCocoaのモジュールファイルを一つ追加するだけで日本語入力が可能となることは確認できました*4。しかしながら、細かい挙動ではまだまだ課題も多く、引き続き地道な検証および調整作業が必要なこともわかりました。また、Xamarin Studioについてはアプリケーション側の修正が必要な事もわかりました。
引き続き弊社インターンシップの題材としても挙げていますので、修正にチャレンジしてみたいと思われる方はご応募頂ければ幸いです。
*1 パス中のバージョン番号はインストールされているXamarin Studioによって異なると思われますので、その場合は適宜読み替えてください。
*2 未確定文字列をマウスで選択状態にして反転させると表示されることから、GTK+のスタイル定義の問題である可能性もあります。
*3 このスクリーンショットの状態では本来は「件名」の部分が注目文節になっているのですが、2重下線は「本当は」の部分に描画されています。
*4 現在判明している主な問題点を解決出来た際には、GtkIMCocoaのコンパイル済みバイナリを配布することも検討しています。