Embeddeding an icon path into .desktop file.

調べるのに時間がかかった割にはすぐにも忘れちゃいそうな些細なテクニック。
make 時にデスクトップ・ファイル (.desktop) の中に独自のアイコンパスを埋め込む (というか、置き換える) 方法。
最近の GTK+ 系アプリならばアイコンテーマに準拠したアイコンを自前で用意してインストールしておけば、ファイル名ではなく名前でアイコンを探す方法を .desktop ファイルでも利用できる。例えば、こんな感じで:

$ grep Icon /usr/share/applications/anjuta.desktop
Icon=anjuta
$ ls -1 /usr/share/icons/hicolor/*/*/anjuta.png
/usr/share/icons/hicolor/16x16/apps/anjuta.png
/usr/share/icons/hicolor/22x22/apps/anjuta.png
/usr/share/icons/hicolor/24x24/apps/anjuta.png
/usr/share/icons/hicolor/32x32/apps/anjuta.png
/usr/share/icons/hicolor/48x48/apps/anjuta.png

しかしながら、アイコン・セットを用意できない (したくない) 場合や独自のアイコン・ファイルを $(datadir) 配下の独自フォルダにインストールして、それを .desktop ファイルから参照する際は、そのアイコン・ファイルのパス名を指定しておく必要がある。例えば、こんな風に:

$ grep Icon /usr/share/applications/gip-ng.desktop
Icon=/usr/share/gip-ng/ui/gip.png

Makefile の中で sed コマンドを使った置き換えがてっとり早いけど、.desktop.in から intltool を使ってローカライズした結果も反映させたいので巧い方法がないか調べてみた:

  • make 中に自動で置き換えたい
  • @INTLTOOL_DESKTOP_RULE@ と衝突することなく連携させたい

後者は .desktop.in の段階で ja.po ファイルに従って日本語に展開されて .desktop ファイルが生成されるようになっているので、同様に .desktop.in を生成する際に Icon のエントリを sed などで文字列を置換するのが適当じゃないかと。
ということで、まずテンプレート (例: gip-ng.desktop.in.in) を作成しておく:

[Desktop Entry]
_Name=IP Address Calculator
_GenericName=IP Adress Calculator
_X-GNOME-FullName=gip IP Adress Calculator
_Comment=Calculate IP addresses and networks
Categories=GNOME;GTK;Utility;
Exec=gip-ng %U
Icon=@UIDIR@/gip.png                  <>
MimeType=application/x-gip;
StartupNotify=true
Terminal=false
Type=Application
X-GNOME-Bugzilla-Bugzilla=Mikeforce
X-GNOME-Bugzilla-Product=gip-ng
X-GNOME-Bugzilla-Component=utility
X-GNOME-Bugzilla-Version=@VERSION@    <>

このファイルの中にある置換文字を sed を使って妥当なデータで置き換えるために Makefile.am の記述を次のようにする:

NULL=
(中略)
## Icons for UI, Misc
uidir = $(pkgdatadir)/ui
(中略)
## Desktop File
gip-ng.desktop.in: gip-ng.desktop.in.in
@sed -e "s|@UIDIR@|${uidir}|g"                  \
-e "s|@VERSION[@]|${VERSION}|" $ $@
desktop_in_in_files = \ gip-ng.desktop.in.in \ $(NULL) desktop_in_files = \ gip-ng.desktop.in \ $(NULL) desktopdir = $(datadir)/applications desktop_DATA = \ gip-ng.desktop \ $(NULL)
@INTLTOOL_DESKTOP_RULE@ (中略)

みたとおりで、intltool に渡す一つ手前の段階でアイコンのパス名を埋め込むといった流れ。
ちなみに、置換せずにアイコン名だけで参照するならば上から5行目は不要。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください