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


20

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

自分の中から「サブプログラム」(つまり、エミュレーターまたは仮想デバイス)を起動するプログラム(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」)を取得しました。両方とも個別に機能します(起動方法に関係なく、ランチャーアイコンはプログラムに正しくアタッチされます)が、両方で機能するようにすることはできません。

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

助言がありますか?

編集:

もう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

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

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


1
引き出しからいくつかのヒントを得ることができますか?

1
私はのビデオを見ているDrawersあなたが任意のサブ項目をクリックしたとき、それはまだで、独自のアイコンを使用して作成され、それは単にグループのリンクを、そのリンクで、彼らが示したものからUnity、私は停止しようとしているものですランチャー
BT

回答:


8

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アイコンを持っていますが、重要なことはその理由を知っていることです:-)。


これは非常に有望に見えます。私は彼らから確認を得ようとする質問をしましたが、まだ応答がありません
BT

1
これはまったく答えではありません。答えは「できません」です。なぜなら、デスクトップファイルの仕様では、この値が文字列のリストではなく単一の文字列になっているためです(そのため、bamfdaemonはget_string_list()をその値に使用します)。
ドビー14年

1

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

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

(もちろん、交換してください私たちはこのような何かを行うことができWindow 1Window 2およびpotatoesWindowsの名前と希望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を設定します。 スクリーンショット

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.