这是一个我尚未找到解决方案的一般问题的具体示例。
我有一个程序(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
据我所知,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
我使用 playonlinux 启动星际争霸 II 时也遇到了同样的问题。首先有一个应用程序启动器:
(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 图标,但重要的是我知道为什么 :-)。
答案2
我知道这个问题真的很老了,但是在经历了同样的问题之后,我想我终于为此创建了一个解决方法,并决定与遇到此问题的人分享:
由于我们无法为单个 .desktop 文件设置多个 WMClass,为什么不将所有窗口都设置为单个 WMClass?
我们可以做类似的事情(显然,用你的窗口名称和所需的 WMClass 替换和Window 1
):Window 2
potatoes
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 设置为每次操作系统启动时运行:
希望我的回答对浏览这个问题的任何人都有帮助。