为 StartupWMClass 设置多个值(在 Unity 中的同一启动器下分组)

bta*_*alb 21 unity launcher 12.10 .desktop

这是我尚未找到解决方案的通用问题的具体示例。

我有一个程序(Android 虚拟设备管理器),它从自身内部启动“子程序”(即模拟器或虚拟设备)(也可以从其他地方启动)。我希望将这些程序的任何一个实例分组在同一个 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
Run Code Online (Sandbox Code Playgroud)

据我所知,StartupWMClass我需要设置才能正确实现这一目标。我已经获得了xprop WM_CLASS在相应窗口上使用的两个类名(“Android 虚拟设备管理器”和“emulator64-arm”)。两者都可以单独工作(无论以何种方式启动,启动器图标都正确附加到程序上),但我无法让它同时适用于两者。

我假设我以某种方式需要设置两个值,StartupWMClass但无法正确执行(或知道它是否是有效操作)。我试过,冒号分隔如环境变量、逗号分隔、引号等,但我在官方文档中找不到任何提示。

有什么建议?

编辑:

另一个更迂腐但可能更容易识别的例子是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"
Run Code Online (Sandbox Code Playgroud)

如果我可以指定以下内容:

StartupWMClass=com-mathworks-util-PostVMInit&&MATLAB
Run Code Online (Sandbox Code Playgroud)

这将完美地工作(因为两者都单独工作)但我不知道语法,如果它甚至存在的话。我只知道到目前为止我尝试过的一切都没有奏效。

无论哪种方式,任何帮助或明确的答案都会很棒,因为我相信这是运行良好的桌面的一个非常基本的元素。

小智 8

对我来说同样的问题,星际争霸 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() 方法):

  • 有一张地图可以将桌面文件与一个且只有一个类关联起来,
  • 键 StartupWMClass 是用 g_key_file_get_string() 读取的,它不是用来返回字符串列表的,
  • g_key_file_get_string_list() 可以做到这一点,但是 bamf 开发人员没有设计出能够将多个类关联到一个桌面文件的框架。

就我而言,我通过创建 2 个具有相同键但 StartupWMClass 的桌面文件来作弊。这并不完美,因为我在启动器中仍然有 2 个 Uniy 图标,但重要的是我知道为什么 :-)。


Mis*_*rio 6

我知道这个问题确实很老,但是在经历了同样的问题之后,我想我终于为此创建了一个解决方法,并决定与遇到此问题的任何人分享:

由于我们无法为单个 .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"
Run Code Online (Sandbox Code Playgroud)

在 .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
Run Code Online (Sandbox Code Playgroud)

最后,将我们创建的 .sh 设置为在每次操作系统启动时运行:截屏

希望我的回答对浏览这个问题的人有所帮助。