問題描述
這是我尚未找到解決方案的一般問題的具體示例。
我有一個程序(Android 虛擬設備管理器),它從內部啟動 ‘sub-programs'(即模擬器或虛擬設備)(也可以從其他地方啟動)。我希望將這些程序中的任何一個實例分組在同一個 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
獲得了兩個類名(“Android 虛擬設備管理器”和 ’emulator64-arm’)。兩者都單獨工作(無論以何種方式啟動,啟動器圖標都正確附加到程序),但我無法讓它同時工作。
我假設我需要為 StartupWMClass
設置兩個值,但無法正確執行(或知道它是否是有效操作)。我已經嘗試過,冒號分隔如環境變量、逗號分隔、引號等,但我在 official documentation 中找不到任何提示。
有什麽建議麽?
編輯:
另一個更迂腐但可能更容易識別的例子是 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
這將完美地工作(因為兩者都單獨工作)但我不知道語法,如果它甚至存在的話。我隻知道到目前為止我所嘗試的一切都沒有奏效。
無論哪種方式,任何幫助或明確的答案都會很棒,因為我相信這是運行良好的桌麵的一個非常基本的元素。
最佳方法
星際爭霸 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() 方法):
-
有一張Map可以在桌麵文件和一個且隻有一個類之間建立關聯,
-
使用 g_key_file_get_string() 讀取鍵 StartupWMClass,其目的不是返回字符串列表,
-
g_key_file_get_string_list() 可以做到這一點,但 bamf 開發人員並沒有將框架設計為能夠將多個類關聯到一個桌麵文件。
在我的情況下,我通過創建 2 個具有相同鍵但 StartupWMClass 的桌麵文件來作弊。這並不完美,因為在啟動器中我仍然有 2 個 Uniy 圖標,但重要的是我知道為什麽 :-)。
次佳方法
我知道這個問題真的很老,但是在經曆了同樣的問題之後,我想我終於為此創建了一個解決方法,並決定與遇到此問題的任何人分享:
由於我們不能為單個 .desktop 文件設置多個 WMClass,為什麽不將所有窗口設置為單個 WMClass?
我們可以這樣做(顯然,將 Window 1
、 Window 2
和 potatoes
替換為您的窗口名稱和所需的 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
最後,將我們創建的 .sh 設置為在每次操作係統啟動時運行:
希望我的回答對瀏覽這個問題的人有所幫助。