web-dev-qa-db-ja.com

StartupWMClassに複数の値を設定する(Unityで同じランチャーの下にグループ化するため)

これは、一般的な問題の具体例であり、まだ解決策を見つけることができませんでした。

「サブプログラム」(つまり、エミュレーターまたは仮想デバイス)をそれ自体から起動するプログラム(Android Virtual Device Manager)があります(他の場所からも起動できます)。これらのプログラムのいずれかのインスタンスを同じUnityアイコンの下にグループ化する必要があります。

これを試して達成するために.desktopファイルを作成しましたが、その方法を正確に知りません。デスクトップファイルは次のとおりです。

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Name=Android Virtual Device
Icon=/home/ben/.icons/Android.svg
Exec=/home/ben/usr/bin/Android avd
StartupWMClass=Android Virtual Device Manager

私が理解していることから、StartupWMClassはこれを正しく達成するために設定する必要があるものです。応答ウィンドウでxprop WM_CLASSを使用して、2つのクラス名(「Android Virtual Device Manager」と「emulator64-arm」)を取得しました。両方とも個別に動作します(起動方法に関係なく、ランチャーアイコンはプログラムに正しくアタッチされています)が、両方で動作するようにすることはできません。

私はどういうわけかStartupWMClassに2つの値を設定する必要があると仮定していますが、それを正しく行うことができません(または有効な操作かどうかを知る)。環境変数のようにコロンで区切られたもの、コンマで区切られたもの、引用符などを試しましたが、 公式ドキュメント にヒントが見つかりません。

助言がありますか?

編集:

もう1つの、より独創的ですが、おそらくより識別可能な例は、Matlabを使用したものです。私は2013aを実行していますが、最初に表示されるスプラッシュスクリーンとプログラムはWM_CLASS値がまったく異なります。つまり、StartupWMClass=com-mathworks-util-PostVMInitを含むランチャーをクリックすると、スプラッシュ画面に別の(デフォルトでは不明)Unityアイコンが表示され、残りはランチャーの下にグループ化されます。

xprop WMCLASSを使用し、最初にスプラッシュ画面をクリックしてから、アクティブなMatlabセッションで繰り返すと、次の端末出力が得られます。

ben@ben-OptiPlex-9010:~$ xprop WM_CLASS
WM_CLASS(STRING) = "MATLAB", "MATLAB"
ben@ben-OptiPlex-9010:~$ xprop WM_CLASS
WM_CLASS(STRING) = "Sun-awt-X11-XFramePeer", "com-mathworks-util-PostVMInit"

次の行に沿って何かを指定できる場合:

StartupWMClass=com-mathworks-util-PostVMInit&&MATLAB

それは完全に機能します(両方とも別々に機能します)が、構文が存在する場合でも、それについてはわかりません。私は今まで試したことがないことを知っています。

これはデスクトップがうまく機能するための非常に基本的な要素であると考えているため、いずれの方法でもヘルプまたは決定的な答えは素晴らしいでしょう。

20
B T

Starcraft IIで私にとって同じ問題がthrow playonlinuxを立ち上げました。最初にアプリケーションランチャーがあります。

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine")そしてゲーム自体:

  • (WM_CLASS(STRING) = "SC2.exe", "Wine")

Wineはクラスをバイナリ実行可能ファイルで設定していると思います。

私はbamfコードを見ていた(bamf_matcher.c、insert_desktop_file_class_into_table()メソッド):

  • デスクトップファイルと1つだけのクラスを関連付けるマップがありますが、
  • キーStartupWMClassは、文字列のリストを返すように設計されていないg_key_file_get_string()で読み取られます。
  • g_key_file_get_string_list()はそれを行うことができますが、bamf開発者は複数のクラスを1つのデスクトップファイルに関連付けることができるようにフレームワークを設計しませんでした。

私の場合、StartupWMClassと同じキーを持つ2つのデスクトップファイルを作成することにより、ごまかします。これは完璧ではありません。なぜなら、ランチャーにいるとき、私はまだ2つのUniyアイコンを持っているからです。

8
gotrunk

私はこの質問が本当に古いことを知っていますが、同じ問題を経験した後、私は最終的にこれの回避策を作成し、この問題を抱えている人と共有することにしたと思います:

単一の.desktopファイルに複数のWMClassを設定できないため、すべてのウィンドウを単一のWMClassに設定しないのはなぜですか?

次のようなことができます(明らかに、Window 1Window 2、およびpotatoesをWindows名と目的のWMClassに置き換えてください):

xprop -name "Window 1" -f WM_CLASS 8s -set WM_CLASS "potatoes"

xprop -name "Window 2" -f WM_CLASS 8s -set WM_CLASS "potatoes"

.desktopファイルでは、これを行うことができます:StartupWMClass=potatoes

タダム!すべてのウィンドウがグループ化されました。
しかし、ちょっと、プログラムが開くたびにこれを手動で行っていますか?もちろん違います。

半秒ごとに自動的に行うbashスクリプトを作成できます。

while true
do
    xprop -name "Window 1" -f WM_CLASS 8s -set WM_CLASS "potatoes"
    xprop -name "Window 2" -f WM_CLASS 8s -set WM_CLASS "potatoes"
    sleep 0.5
done

そして最後に、OSが起動するたびに実行するように作成した.shを設定します。 Screenshot

私の答えがこの質問を閲覧している人に役立つことを願っています。

1
Misterio