當前位置: 首頁>>技術教程>>正文


為 StartupWMClass 設置多個值(在 Unity 中的同一啟動器下分組)

, , ,

問題描述

這是我尚未找到解決方案的一般問題的具體示例。

我有一個程序(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 1Window 2potatoes 替換為您的窗口名稱和所需的 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 設置為在每次操作係統啟動時運行:

希望我的回答對瀏覽這個問題的人有所幫助。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/12692.html,未經允許,請勿轉載。