Linux で使われるデスクトップ環境で使われている "desktop" ファイルは、Windows のショートカットファイルの様な機能を提供します。これは小さなテキスト形式のファイルで、 ここにアプリケーションの実行開始に関する様々な条件を指定して決まったディレクトリに配置することによって Linux のデスクトップ環境にアプリケーションを登録することができます。
ところがこのファイルにGUIアプリケーションを起動する為のシェルスクリプトを指定して登録すると、ピンしたDesktopファイルのアイコンとの起動されたアプリケーションのアイコンが別々に分かれてしまい、アプリケーションランチャーに正しい状態でピン止めすることが出来ません。
ここではdesktop ファイルの作り方/配置方法と合わせてシェルスクリプトをアプリケーションランチャーにピン留めする方法を説明します。
Desktop ファイル形式
適当なファイルエディタで次のような形式でファイルを作成します。
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Name=MuseScore3 AppImage !!!!! # ← ここにアプリケーション名を指定
Icon=musescore3.png # ←ここでアイコンを指定
Path=/home/foobar/Documents/ # ←ここで実行時作業ディレクトリを指定
Exec=/home/foobar/bin/musescore3.sh # ←ここで実行開始コマンドを指定
StartupNotify=true
Terminal=false
StartupWMClass=mscore-portable # ← ウィンドウクラスを指定。※ ここが難しい。後述。
ウィンドウクラスの取得の仕方
desktopファイルからは起動したアプリケーションがどのようなウィンドウを作成するか知ることはできません。しかしパネルバーは既に存在しているウィンドウに対して処理を行っているために、そのウィンドウがどのdesktopファイルから起動されたものなのかを知ることが出来ません。
結果として次の様な症状が起こります ───ユーザが、自分自身で作成したdesktopファイルを使ってアプリケーションを実行したとき、パネルバーにアプリのアイコンが表示され、ユーザがそれをピン留めしそれをのちほど実行しようとしても、ユーザが作成したdesktopファイルは利用されず、システムはdesktopファイルが存在しないものと認識し、システムは自動的にdesktopファイルを別個に作成してそれを実行します。結果としてユーザが指定した起動パラメータその他が無視されてしまうという現象が発生します。
そこで必要となるのが WM_CLASS です。WM_CLASSはウィンドウを識別するためのIDです。このWM_CLASS を desktop ファイル内で指定しておくことで、あるウィンドウがどの desktopファイルから起動されたものなのかを推測することができるようになります。
この様な理由から、適切に desktopファイルを作成するためには、一旦アプリを実行し現れたウィンドウの WM_CLASS を調べてdesktopファイル内に反映する必要があります。
アプリを実行したあとウィンドウが表示された段階でこのコマンドを実行しアプリのウィンドウをクリックします。
> xprop | grep WM_CLASS
WM_CLASS(STRING) = "mscore-portable", "MuseScore3"
xprop コマンドは実行中のウィンドウに関する情報を出力するコマンドです。このコマンドを実行するとカーソルがクロスカーソルに変わりその状態でウィンドウをクリックするとそのウィンドウに関する情報を取得し標準出力に出力(表示)します。
ここで得られた情報をdesktop
ファイルのStartupWMClass
に指定します。
配置
作成したファイルを次のディレクトリのいずれかに配置します。
- /usr/share/applications/
- /home/[username]/.local/share/applications
実行
> gtk-launch musescore3.desktop # ファイル名のみを指定。パスは指定しない。
desktopファイルのディレクトリへの配置が終わればデスクトップ環境のランチャーに認識されて表示される様になり、マウス操作のみで実行できるようになっているはずです。
もしターミナル画面から実行する場合は上記のように gtk-launch コマンドを利用して実行します。