2008-02-11

XfceとThunarでちゃんとアイコンを出すにはlibrsvg2が必要

普段のPCではXfceがなかなか快適になったが、VMware Player用のFreeBSDでXfce4を入れて動かすと、アイコンが全然かっこよくならない。メニューの設定から、インタフェースを選んで、アイコンテーマをGnomeにするとデスクトップはたしかに変わるが、Thunarのメインのペインが変わらなかったり、挙動がよくわからない。

で、しかたがないので、xfdesktopのソースにデバッグプリントを入れてみると、xfdesktop_file_utils_get_file_icon()でxfce_themed_icon_load()が失敗してxfdesktop_file_utils_get_fallback_icon()を呼び、/usr/local/share/pixmaps/xfdesktop/xfdesktop-fallback-icon.pngを表示している雰囲気。

そこから、
→gtk_icon_theme_load_icon()
→gtk_icon_info_load_icon()
→icon_info_ensure_scale_and_pixbuf()
→load_svg_at_size()
→gdk_pixbuf_loader_new_with_type()
→gdk_pixbuf_loader_load_module()
→_gdk_pixbuf_get_named_module()
→_gdk_pixbuf_load_module()
→_gdk_pixbuf_load_module_unlocked()
と大追跡を行って、最後に g_module_error() が "Cannot open "/usr/local/lib/gtk-2.0/2.10.0/loaders/svg_loader.so" と出力しているのをつきとめた(たぶんもっと上のレベルでエラーメッセージを探した方が早かったかも)。

このファイルは、graphics/librsvg2 によってインストールされるもので、gimp がこれに依存しているせいで、PCの方にはちゃんと入っていたようである。xfce4-desktopとthunarもこれに依存するようになってないといけなかったわけである。

というわけで、解決。


追記(2/21)

事態はそう単純ではなくて、本当の問題はもっと深いところにあった。

最初からxfceしか入れていないマシンを作ったところ、librsvg2なんか入っていなくてもちゃんとアイコンが表示された。そのマシンで追跡したところ、gtk_icon_info_load_icon() にはSVGではなくPNGファイルが指定されて呼ばれている。では、そもそもなんで呼ぶ側の gtk_icon_theme_load_icon() がSVGを指定したりPNGを指定したりするかが問題で、これを追いかけていたら /usr/local/etc/gtk-2.0/gdk-pixbuf.loaders というファイルに行きあたった。これに image/svg を開くためのモジュール /usr/local/lib/gtk-2.0/2.10.0/loaders/svg_loader.so が登録されているかどうかを調べて、あればアイコンの拡張子を svg に決めるらしい。ではこのファイルは誰が用意するのかというと、gtk20をインストールするときにモジュールの有無を調べて、svg_loader.soがあればそれを登録するようになっているっぽい。

つまり、たまたまXfceとかThunarとかのアプリケーションがひっかかっただけで、gtk20とlibrsvg2の関係に問題があった。しかし、gtk20がlibrsvg2に依存すればいいかというとそうではなくて、もともと逆向きの依存があるので、循環させるわけにいかない。librsvg2のインストール・アンインストール時にgdk-pixbuf.loadersの中身をいじるようなしかけを作るくらいしかないのかもしれない。この場合、将来別のフォーマットのモジュールが出てきたら、同じしかけを追加していくことになる。

で、話はそれだけではなくて、同じようにgtk20がインストール時に探して登録してしまうものに、IM関連がある。/usr/local/etc/gtk-2.0/gtk.immodules がそれで、SCIMのモジュールがあればここに追加されるようである。依存関係についてはlibrsvg2の場合とまったく同じことになっていて、本来は同じような対処をちゃんとやっておく必要がある。


追記(2/22)

と思ったら、librsvg2もscimも、インストール・アンインストール時にgdk-pixbuf-query-loadersとgtk-query-immodules-2.0を動かすことになっていて、ちゃんとpkg_deleteすればgdk-pixbuf.loadersが更新されている。

問題は、librsvg2をインストールした状態でgtk20のパッケージを作り、それだけを別のマシンにインストールしたことだった。gtk20のインストール時にも走らせればいいのかも。

0 件のコメント: