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のインストール時にも走らせればいいのかも。

2008-02-04

FreeBSD 6.3でもFreeSBIEはNO_UNIONFS=YESが必要

FreeSBIEにはmfs+unionfsを使うことで/usrなどへの書込みも可能にするような機構が組み込まれているが、unionfsの不完全さから、デフォルトではNO_UNIONFS=YESとなっている。

これを解消することなどを目的に、FreeBSD unionfsの改善提案および修正状況として、unionfsの再実装と6.3へのバックポートも行われたらしいので、もしかして使えるんじゃないかと、NO_UNIONFSを消してみた。結果はあと一歩というところ。

/tmpのパーミッションや、/tmpや/varとのマウント順序、dhclientの実行時期などに問題があったので、conf/rc.d/unionfsを調整すると、これらはすぐに解決し、ベースのシステムは問題なく起動するまでになった。しかし、Xのデスクトップ環境を作ろうとしてみると、いろいろなアプリケーションがうまく起動できない状態になっていた。

相当な時間をかけていろいろいじって調べたところ、unionfs上でUNIXドメインのソケットにうまくconnectできていない(Connection refused)ことがわかった。kern/118346にも報告があった。

というわけで、unionfsの利用は、当面おあずけ。

この過程で、zshにはzmodloadというモジュールロード機能があって、zsh/net/socketというモジュールをロードすると、zsocketというコマンドが使えるようになり、zshだけでUNIXドメインソケットを張ることができることを発見。たしかに今回みたいなちょこっとテストには便利だけど、これだけの機能を日常的に使う人いるのか?