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


20

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

我有一个程序(Android虚拟设备管理器)可以从自身内部启动“子程序”(即仿真器或虚拟设备)(也可以从其他位置启动)。我希望将这些程序的任何EITHER实例归入同一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但不能正确执行(或知道它是否是有效的操作)。我已经尝试过,像环境变量一样用冒号分隔,用逗号分隔,用引号引起来,等等,但是我在官方文档中找不到任何提示。

有什么建议么?

编辑:

另一个更有趣,但可能更可识别的示例是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

Answers:


8

我用Starcraft II发射出的playonlinux遇到了同样的问题。首先有一个应用程序启动器:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") 然后是游戏本身:

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

我猜这是用二进制可执行文件设置类的。

我看了一下bamf代码(bamf_matcher.c,insert_desktop_file_class_into_table()方法):

  • 有一张地图将桌面文件与一个(只有一个)类关联起来,
  • 使用g_key_file_get_string()读取键StartupWMClass,该键并非旨在返回字符串列表,
  • g_key_file_get_string_list()可以做到这一点,但bamf开发人员并未将框架设计为能够将多个类关联到一个桌面文件。

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


这看起来非常有希望,我问了一个问题,试图获得他们的确认,但到目前为止仍未得到任何回应……
BT

1
这不是一个答案。答案是“不能”,因为桌面文件规范将此值设为单个字符串而不是字符串列表(这就是为什么bamfdaemon使用get_string()而不是get_string_list()作为该值)的原因。
dobey 2014年

1

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

由于我们无法为单个.desktop文件设置多个WMClass,因此为什么不将所有窗口都设置为单个WMClass?

我们可以做这样的事情(当然,更换Window 1Window 2potatoes与您的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

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

希望我的回答对浏览此问题的任何人有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.