" />
JustsystemのFAQに掲載されてまする。(2008/01/09-)
「仕様通りです」と言われそうな、GTKアプリのウインドウ左下隅に表示される ATOK・あ連R漢 の文字列。いわゆるステータスウインドウ(status window)なのだが、これが非常に目障りなのです。GTKアプリのウインドウサイズを変えたり、ウインドウの位置を変えたその瞬間は左下隅へと移動してくれるのだが、ウインドウを切り替えたりして、元に戻ってくると...あら不思議、初期の位置に戻ってしまうのです。こうなるとステータスウインドウがアプリのウインドウに重なって見にくいったらありゃしない。そんなわけで、精神衛生上も好ましくない状況でしたので、これを解決すべく、ATOK for Linuxに同梱されていた iiimf のソースを追いかけました...。
眺めるためにはまずはソースファイルを展開します。
$ rpm -ivh /mnt/cdrom1/src/IIIMF/iiimf-trunk_r2059-js1.src.rpm
googleを検索してみると、iiimf-trunk_r2059/iiimgcf/gtkimcontextiiim.c にパッチを当ててこの表示問題を回避したという情報がありました。小生、C言語に詳しくなく、ソースファイルに手を入れることは避けたい(=設定で何とかしたい)ため、こちら(ヒビノキロク)でパッチ対象となっていたソースファイル(gtkimcontextiiim.c)を眺めました。どうやら、IMSettings構造体が初期化できれば、ステータスウインドウを非表示にすることができそうということがわかりました。
はてさて、こやつってどこで設定してるんだろうか...。
IMSettingsの内容は以下のとおり。
typedef struct { IMEnabled im_enabled; IMEnabled status_enabled; IMEnabled lookup_enabled; IMStatusPlacement status_placement; } IMSettings;
こやつを初期化している関数は get_im_settings_propery。gdk_atom_intern関数を使用して読み込んできているよう。てことは...gconfか。
iimgcfフォルダ内を検索する。が、設定している箇所が見つからない。"_IM_SETTINGS"というatomを使用していることはgdk_atom_intern関数の引数を見れば一目瞭然なので、ここは「力業」を使用してみるなり。
$ find . -type f -print0 | xargs -0 -e grep -n -e _IM_SETTINGS ./iiimxcf/xiiimp.so/iiimp/guiIM.c:68:static const char *_IM_SETTINGS = "_IM_SETTINGS"; ./iiimxcf/xiiimp.so/iiimp/guiIM.c:146: im_settings_atom = XInternAtom (display, _IM_SETTINGS, False); ./iiimxcf/xiiimp.so/ChangeLog:89: is no _IM_SETTINGS. ./iiimxcf/xiiimp.so/ChangeLog:149: use _IM_SETTINGS to change lookup & status style. ./gnome-im-switcher/ChangeLog:497: set _IM_SETTINGS property on root_window for enabling/disabling ./gnome-im-switcher/capplet/main.c:64:static const char *_IM_SETTINGS = "_IM_SETTINGS"; ./gnome-im-switcher/capplet/main.c:77: im_settings_atom = gdk_atom_intern (_IM_SETTINGS, FALSE); ./gnome-im-switcher/capplet/im_settings_daemon.c:56:static const char *_IM_SETTINGS = "_IM_SETTINGS"; ./gnome-im-switcher/capplet/im_settings_daemon.c:64: im_settings_atom = gdk_atom_intern (_IM_SETTINGS, FALSE); ./iiimgcf/ChangeLog:91: there is no _IM_SETTINGS. ./iiimgcf/ChangeLog:100: * gtkimcontextiiim.c: use _IM_SETTINGS only to decide status style. ./iiimgcf/ChangeLog:105: get _IM_SETTINGS property on root_window for ./iiimgcf/gtkimcontextiiim.c:144:static const char *_IM_SETTINGS = "_IM_SETTINGS"; ./iiimgcf/gtkimcontextiiim.c:657: im_settings_atom = gdk_atom_intern (_IM_SETTINGS, FALSE); $
gnome-im-switcherのChangeLogに"set _IM_SETTINGS"なんて文字が。ChangeLogをみると capplet/main.c への改修のようだ。どうやら、gnome-im-propertiesというプログラムで設定を行っているようだ。こいつを実行できるようにすればよいわけですな。
そうとわかれば、gnome-im-switcherをコンパイルしてみる。
$ cd ~/src/gnome-im-switcher/gnome-im-switcher $ aclocal $ autoconf $ autoheader $ automake configure.in: required file `./install-sh' not found configure.in: required file `./missing' not found configure.in:58: required file `./config.guess' not found configure.in:58: required file `./config.sub' not found configure.in:58: required file `./ltmain.sh' not found capplet/Makefile.am: required file `./depcomp' not found $
む。気を取り直す。
$ libtoolize --automake $ cp /usr/share/automake-1.8/install-sh /usr/share/automake-1.8/mkinstalldirs . $ cp /usr/share/automake-1.8/missing /usr/share/automake-1.8/depcomp . $ automake $
てなわけで、configure & make。
$ ./configure $ make
makeでエラー...。仕方ない、iiimf全部をrpmbuildしてみるか...。
Vineでbuildする際には、im-sdk.specを若干修正しないと駄目です。こちら(ヒビノキロク)参照。
$ vi ~/rpm/SPECS/im-sdk.spec
他にも修正する箇所があります。
こうして出来たim-sdk.specです。このSPECファイルを元にしてrpmbuildを行いますが、buildされたiiimf-*をインストールするわけではありません。ここでの作業の目的はあくまでgnome-im-switcherを(Vine3.1環境下で)コンパイルさせたいという点です。でわ早速、rpmbuildを実行してみます。(注)結構時間がかります。
$ rpmbuild -ba --target=i686 ~/rpm/SPECS/im-sdk.spec
がーん、gnome-im-switcher配下でリンクエラー発生...。src/utils.c の gimlet_util_show_help関数で呼び出している gnome_help_display_desktop_on_screen関数が見あたらないらしい。調べてみるとlibgnomeuiのgnome-help.hに定義されているらしい。しかし、Vine Linux 3.1ではlibgnomeにしかgnome-help.hは存在せず、libgnomeuiには存在しない。これは困った。「Helpだから、コメントアウトしてもよかろう」という判断でソースファイルを改修しました。最初と言ってることがちがう...。
ちなみに、VineSeedにあるバージョン(2.10.0)であれば、このコメントアウトを行わなくても大丈夫そうです(私は試していません)。
$ vi ~/rpm/SPECS/im-sdk.spec $ rpmbuild -ba --target=i686 ~/rpm/SPECS/im-sdk.spec
パッチを作成し(Patch2)、再ビルド。やっとコンパイルが出来ました。gnome-im-switcherもエラーなく、コンパイルが行われているようです。さて、RPMの作成が無事完了した後、なにやらエラーが発生しているように見えます。特に気にしなくても大丈夫なようです。
まず、tar.bz2を作成します。
$ cd ~/rpm/BUILD/iiimf-trunk_r2059/gnome-im-switcher/ $ make dist-bzip2 $ cp gnome-im-switcher-1.1.2.tar.bz2 ~/rpm/SOURCES $
次に SPECファイルを修正します。用意されたSPECファイルだと一部のプログラムがインストールされません(gnome-im-propertiesなど)。そのため、いくつか修正・追加を行っています。Vine Linux 3.1には gnome-panel-devel が存在しないため、BuildRequireをコメントアウトしています。コンパイルは出来ますのでたぶん大丈夫...。
$ cd ~/rpm/BUILD/iiimf-trunk_r2059/gnome-im-switcher/ $ vi gnome-im-switcher-applet.spec $ rpmbuild -ba --target=i686 gnome-im-switcher-applet.spec
無事にビルドが成功しました。
$ sudo rpm -ivh ~/rpm/RPMS/i686/gnome-im-switcher-1.1.2-0vl1.i686.rpm
はてさて、パッケージの名称にもなっている gnome-im-switcher をコマンドラインから起動するとエラーが発生します(汗。とりあえずは gnome-im-switcherは使用しないことから、ここでは気にせず他の設定を行います。libexec配下にあるプログラムなので、別のプログラムが間接的に実行するんだろうと思われます(たぷん。
$ /usr/libexec/gnome-im-switcher-applet (gnome-im-switcher-applet:14069): GConf-CRITICAL **: file gconf-client.c: line 546 (gconf_client_add_dir): assertion 'gconf_valid_key (dirname, NULL)' failed $
ステータスウインドウの設定は gnome-im-properties で行っていると上のほうで書きました。こいつを実行してみましょう。以下のコマンドを実行するか、TOPパネルの"アプリケーション"→"デスクトップの設定"→"拡張設定"→"入力方式" を選択すればコマンドラインと同じ結果となります。
$ gnome-im-properties
入力方式ウインドウの外観の配置について"デスクトップパネル上"を選択します。これだけです。するとあら不思議、憎きステータスウインドウが簡単に消えてしまいました。わーいわーい。
世の中はそんなに甘くありませんでした。X Window を再起動すると奴はまた復活してくるのです。gnome-im-switcherがきちんと動いていない(?)ようなので、起動時の初期化がきちんと行われていないのだろう...と思ったりもしたのですが、はてさてどう対処すればよいか。gnome起動時に gnome-im-propertiesを実行させれば設定が読み込まれる&設定されるのだけれども、この方法だとダイアログが毎回表示されてしまうため見苦しい...。
うーん...うん? そういえば、 gnome-im-settings-daemon てなプログラムも _IM_SETTINGS を読み込んでいた気がする。こいつを実行してみよう。
$ gnome-im-settings-daemon GNOME_IM_ENABLED=yes GNOME_IM_STATUS_ENABLED=yes GNOME_IM_LOOKUP_ENABLED=yes GNOME_IM_STATUS_PLACEMENT=panel $
おぉ...ATOKが消えた! てことは、このプログラムを自動起動させればよいわけだ。パネルの "アプリケーション"→"デスクトップの設定"→"セッション" から 自動起動するプログラム を選択し、gnome-im-settings-daemon を追加する。そして、X Window の再起動...。
成功。これで、月並みの生活に戻れます...。
gnome-im-settings-daemon を呼び出すタイミングは /usr/share/vine/imelib から... とするのが収まりがよいかなとは思いますが、ここでは gnomeのセッション起動を例としてあげています。
こちら。gnome-im-switcher-1.1.2-0vl1.src.rpm
gnomeのパネル上で、右クリックを押下し、"パネルに追加"→"ユーティリティ"→"入力方式スイッチ"とするとパネルに白いボックスが追加されます。この状態で、CTRL+SPACE等を押下して、IIIMと会話を行えば"あ連R漢ja"といったように、現在の入力モードを表示するようになります。結構便利かもしれません。
$Id: atok_statuswindow.html 39 2008-01-26 03:50:33Z noguchi $