えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

Linux デスクトップファイルの書き方

desktop-computer
Icons made by Flat Icons from www.flaticon.com

お伝えしたいこと

Linuxデスクトップで使われるDesktop Entry (通称:デスクトップファイル) を自分で書くときに最低限必要な情報をまとめます。

Desktop Entryとは.desktop拡張子を持つテキストファイルです。
デスクトップのMenu上にアプリケーションを表示させるのに使われます。

Desktop Entryの作成は非常に簡単です。
以下の2工程で完結します。

  • 本記事のサンプルをベースに7行ほどのテキストファイルを作成する
  • ~/.local/share/applications/に格納する

「Menuにアプリケーションが表示されない...」と思ったらDesktop Entryを自分で作っちゃいましょう。

作り方を知りたい方は、ぜひ続きをお読みください。

既に慣れている方は、#要点を中心にチェックいただけると効率的です。

要点

Desktop Entryは、以下サンプルを書き換えることで簡単に書けます。

[Desktop Entry]
Name=Virtual Machine Viewer
Exec=virt-viewer
Comment=Display the graphical console
Terminal=false
Icon=virt-viewer
Type=Application

Iconファイルは主に以下のディレクトリから検索されます。
自分で画像を追加する場合は、先頭のホームディレクトリ配下に配置しましょう。

  • ~/.icons/ ★自作アイコンはここに配置
  • /usr/share/icons/
  • /usr/share/pixmaps/

作成したDesktop Entryは以下のディレクトリに配置します。
自分でDesktop Entryファイルを追加する場合は、先頭のホームディレクトリ配下に配置しましょう。

  • ~/.local/share/applications/ ★自作Desktop Entryはここに配置
  • /usr/share/applications/
  • /usr/local/share/applications/

Desktop Entryを作成してもMenuに表示されないときは、以下を疑いましょう。

  • 格納先のディレクトリは正しいか?
  • ファイルパーミッションやオーナーなどの権限情報に問題はないか?
  • Desktop Entryの文法にエラーはないか? → desktop-file-validateコマンドで確認できます

Desktop Entryとは?

Desktop Entryとは、.desktopという拡張子を持つテキストファイルです。
Desktop Fileや、Application Fileとも呼ばれます。

Desktop Entryを特定のディレクトリ配下に格納すると、LinuxデスクトップのMenu (WindowsでいうStart Menu) でアプリケーションとして表示され、クリック操作で起動できるようになります。

GUIでの実行を想定したアプリケーションをインストールすると、多くの場合インストール処理の一環で.desktopファイルも配布されます。
これによって、Menuでアプリケーション名を検索して起動できるようになります。

下記画像において "Google Chrome" という表示名でアイコンを用意し、クリックするとchromeを起動するのがDesktop Entryの役割です。

linux_desktop_menu

(参考) Desktop Entryの仕様を知る必要はあるのか?

デフォルトでDesktop Entryが用意されない場合に、自分で追加したいときに仕様がわかると便利です。

しかし、この知識が必要になる場面は限られているので、デスクトップアプリケーションを日常的に開発する方でなければ暗記する必要はありません。
必要なときに「こんな仕様があった」と思い出し、その場で調べながら書ければ十分です。

上記を踏まえ、本記事もDesktop Entryをちょこっと書きたい方向けに要点が短時間で伝わるように説明します。
より詳細な仕様については、freedesktop.orgを参照するように誘導します。

freedesktop.orgは公的な認証を受けている団体ではありませんが、Linuxデスクトップの標準的な仕様をいくつも定義しています。
そしてGnomeKDEなどのLinuxデスクトップがそれにある程度準拠しているため、実質的にLinuxデスクトップの仕様を知りたいときに重宝する情報源となっています。

Desktop Entryの書き方

まずはサンプルを示します。
私の環境ではvirt-viewerというプログラムにDesktop Entryファイルが付属しなかったので、Desktop Entryを自作しました。

このファイルは、~/.local/share/applications/virt-viewer.desktopに格納しています。
Desktop Entryの格納先については、#Desktop Entryの配置先で触れます。

[Desktop Entry]
Name=Virtual Machine Viewer
Exec=virt-viewer
Comment=Display the graphical console
Terminal=false
Icon=virt-viewer
Type=Application

Desktop EntryはINI形式で書くようです。
ざっくり、意味は以下のようになります。

Iconについては、#Iconの指定方法で別途補足します。

項目 詳細
Name
Menu上の表示名
Virtual Machine Viewer
Exec
クリック時に実行されるコマンド
virt-viewer
Comment
アプリケーションの説明文
Display the graphical console
Terminal
ターミナル上で実行するか?
false
Icon
Menu上のアイコンファイル
virt-viewer.svg
Type
タイプ
アプリケーション。
他にLink, Directoryがあるが、基本Applicationにする

作成したファイルを~/.local/share/applications/virt-viewer.desktopに配置すると、Menu上で検索してヒットするようになります。
以下はアプリケーション名で検索していますが、Exec (virt-viewer) やComment (graphical console) でもヒットします。
このあたりはMenuの実装にも依ると思いますが、とても便利です。

virtual_machine_manager_on_the_menu

Desktop Entryの基本的な書き方については、上表の説明で全てです。
オプションの意味を理解した上で上記サンプルを書き換えれば、Desktop Entryファイルを簡単に作成できると思います。

より詳細な仕様については、freedesktop.orgのDesktop Entry Specificationに記載があります。
また、/usr/share/applications/に既存のDesktop Entryが数多くあるので、見ると参考になると思います。
マニアックですが、デスクトップの言語に併せてNameやCommentを使い分けることもできるようです。

ただよほど凝りたいのでない限りは、詳細な仕様を知る必要はあまりないと思います。

Iconの指定方法

サマリ

Iconの指定方法は2通りあります1

  • 画像ファイルのフルパス指定
  • キーワード指定

キーワードを指定すると、Icon Theme Specificationの仕様に従って画像ファイルを検索し、それを使います。
内部的には難しい仕組みが動いていますが、ざっくり言うと以下の通りです。

  • ファイル名を指定すると指定のディレクトリから画像ファイルを探してきてそれを使う
  • ファイルの拡張子は省略して良い

実用上は、以下のディレクトリ配下の画像ファイルを、拡張子を省いたファイル名で指定する使い方が多いと思います。
上2つのディレクトリには、アプリケーションのインストーラが自動配置する画像ファイルが格納されます。
自前で画像を用意したい場合は、3番目のディレクトリにSVG形式などで画像ファイルを格納します。

  • /usr/share/icons/
  • /usr/share/pixmaps/
  • ~/.icons/

(参考) Iconの詳細仕様

本セクションは参考情報のため、興味のない方はスキップしてください。

Iconをキーワードで指定した際、画像ファイルの検索対象となるディレクトリは以下の3箇所です。
上から順に検索されます。

  • $HOME/.icons/
  • $XDG_DATA_DIRS/icons/
  • /usr/share/pixmaps/

環境変数XDG_DATA_DIRSについては、以下の中身でした。
PATHのように、複数のディレクトリが:で順に並んだ構造です。

echo $XDG_DATA_DIRS
/home/endy/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share

XDG_DATA_DIRSを展開すると、デフォルトでは以下の順で画像ファイルを探索します。
flatpakを使っていない方は、2番目と3番目のディレクトリは無視して問題ありません。

  • ~/.icons/
  • ~/.local/share/flatpak/exports/share/icons/ ※flatpak
  • /var/lib/flatpak/exports/share/icons/ ※flatpak
  • /usr/local/share/icons/
  • /usr/share/icons/
  • /usr/share/pixmaps/

実用上は、特に以下の3箇所をチェックすればほぼ事足ります。

  • /usr/share/icons/, /usr/share/pixmaps/: 既存の画像ファイルの主な格納先
  • ~/.icons/: 自前で用意したアイコンの格納先

今回は目的のファイルがvirt-viewer.svgとして存在することがわかったので、それを使います。

find ~/.icons /usr/share/icons /usr/share/pixmaps -iname 'virt-viewer*'
# /usr/share/icons/Paper/24x24@2x/apps/virt-viewer.png
# /usr/share/icons/Paper/16x16/apps/virt-viewer.png
# /usr/share/icons/Paper/32x32@2x/apps/virt-viewer.png
# /usr/share/icons/Paper/48x48@2x/apps/virt-viewer.png
# /usr/share/icons/Paper/48x48/apps/virt-viewer.png
# /usr/share/icons/Paper/512x512@2x/apps/virt-viewer.png
# /usr/share/icons/Paper/32x32/apps/virt-viewer.png
# /usr/share/icons/Paper/512x512/apps/virt-viewer.png
# /usr/share/icons/Paper/24x24/apps/virt-viewer.png
# /usr/share/icons/Paper/16x16@2x/apps/virt-viewer.png
# /usr/share/icons/hicolor/22x22/apps/virt-viewer.png
# /usr/share/icons/hicolor/16x16/apps/virt-viewer.png
# /usr/share/icons/hicolor/256x256/apps/virt-viewer.png
# /usr/share/icons/hicolor/48x48/apps/virt-viewer.png
# /usr/share/icons/hicolor/32x32/apps/virt-viewer.png
# /usr/share/icons/hicolor/scalable/apps/virt-viewer.svg
# /usr/share/icons/hicolor/24x24/apps/virt-viewer.png

画像の見た目はGUIでフォルダ階層を下ってファイルを見ても良いですが、せっかくフルパスがわかっているのでCLIから開いちゃいます。

xdg-open /usr/share/icons/hicolor/scalable/apps/virt-viewer.svg

余談ですが、xdg-openは既定のアプリケーションで目的のファイルやURLを開くコマンドです。
xdg-open .でカレントディレクトリを開いたり、xdg-open https://xxxというコマンドを紐付けたDesktop Launcherを作成してショートカット代わりに使うと便利です。

Desktop Entryの配置先

サマリ

Desktop Entryは主に以下に格納されています。

  • ~/.local/share/applications/
  • /usr/share/applications/
  • /usr/local/share/applications/

自前で作成したDesktop Entryは、基本的に1番目のパスに格納します。
システム全体にインストールされたデスクトップファイルは、2番目か3番目のパスに格納されています。

今回サンプルで作成したvirt-viewer.desktopは、1番目のリンクに格納します。

(参考) Desktop Entry配置先の詳細

本セクションは参考情報のため、興味のない方はスキップしてください。

作成したDesktop Entry (*.desktop) は、$XDG_DATA_DIRS/applications/配下に設置するようです。

$XDG_DATA_DIRSの中身を再掲します。

echo $XDG_DATA_DIRS
/home/endy/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share

したがって、Desktop Entryファイルの格納先は以下のとおりです。

  • ~/.local/share/flatpak/exports/share/applications/
  • /var/lib/flatpak/exports/share/applications/
  • /usr/local/share/applications/
  • /usr/share/applications/

ただ、実際には以下のディレクトリにもDesktop Entryを格納できます。
公式の情報ソースはありませんが、Arch Wikiには記載がありました。

  • ~/.local/share/applications/

補足ですが、経験上ディレクトリには以下のようなルールがあります。

  • /usr//usr/local/~/.local/配下のファイル構成は類似している
  • /usr/にはディストリビューションのパッケージマネージャが配布したファイルが格納される
  • /usr/local/にはその他の方法でシステムにインストールされたファイルが格納される (pipやmake installなど)
  • ~/.local/はホームディレクトリ配下なので、ユーザー固有のリソースが配置される

従って、/usr/share/applications/が使えるということは、~/.local/share/applications/も恐らく使えるだろうと連想できます。

(参考) desktop-file-validate

滅多に使うことはありませんが、Desktop Entryのエラーを検出するプログラムがあります。
もし作成したデスクトップファイルに正しいPermissionを付与し、正しいディレクトリに配置したにも関わらずMenuに表示されない場合は、以下のコマンドでDesktop Entryの定義が正しいかを確認してみると良いかもしれません。

desktop-file-validateコマンドは、以下のように.desktopファイルを指定して使います。
特に何の警告もでなければ、文法上は問題ありません。

desktop-file-validate virt-viewer.desktop
# (出力なし)

試しに、virt-viewer.desktopのNameオプションを以下のようにコメントアウトしてみます。

[Desktop Entry]
#Name=Virtual Machine Viewer
Exec=virt-viewer
Comment=Display the graphical console
Terminal=false
Icon=virt-viewer
Type=Application

そして、再びdesktop-file-validateを実行してみます。
必須パラメータのNameが指定されていないことでエラーになりました。

desktop-file-validate virt-viewer.desktop
# virt-viewer.desktop: error: required key "Name" in group "Desktop Entry" is not present

まとめ

Desktop Entry (デスクトップファイル) の書き方、配置先について書きました。 既にDesktop Entryの概要を知っている方は、#要点を中心にチェックいただけると効率的です。

Linux PC関連まとめ

endy-tech.hatenablog.jp