GNOME 3 中的自定义 VirtualBox 启动器

GNOME 3 中的自定义 VirtualBox 启动器

我正在使用带有 GNOME 3 的 Ubuntu 13.04。我的目标是创建一个自定义启动器,用于启动特定的 VirtualBox 虚拟机,并且我希望它有自己的图标。

从纯粹的功能角度来看,我已经成功了。 本文(webupd8.org) 给了我一个直接启动虚拟机的命令。因此,我在 ~/.local/share/applications 中创建了一个新的 .desktop 文件,该文件使用该命令作为“Exec”部分。当我单击启动器时,机器成功启动。

我的问题在于图标行为。我在 .desktop 文件中指定了一个自定义图标,它在我的收藏夹栏中显示得很漂亮。但是,当我单击图标并启动虚拟机时,新打开的窗口与我的自定义启动器不关联(即,我的自定义图标没有“突出显示”)。相反,窗口与新创建的 VirtualBox 图标相关联。

有人知道是否有办法向 GNOME 3 指示我想将新窗口与我的自定义图标关联起来吗?我记得在使用 Matlab 时遇到过类似的问题,并在 .desktop 文件中指定了名为“StartupWMClass”的内容,但我不知道在这种情况下应该将值设置为多少(或者这是否适用于非 Matlab 启动器)。

这是我的 .desktop 文件,如果有人认为它可能会有用:

[Desktop Entry]
Name=Windows 8
GenericName=Windows 8 Virtual Machine
Comment=Windows 8 in VirtualBox
Exec=VBoxManage startvm 'Windows 8'
Icon=/home/username/Pictures/Icons/Windows8.png
Terminal=false
Type=Application
Categories=Office;

谢谢!

答案1

我在 Fedora 20 上使用最新的 GNOME 3.10, StartupWMClass=VirtualBox似乎可以解决问题。

也许从您提出问题时起它就已经被修复了?

无论如何,VirtualBox 仍然有一个缺点 - 所有窗口都有相同的 WM_CLASS。因此,如果您运行多台机器,它们将被分组在一起。我已为此提交了一份错误报告:https://www.virtualbox.org/ticket/12534。希望我们能很快看到问题得到解决。

答案2

我找到了一个很好的解决方法。

我的 windows.desktop 启动器:

[Desktop Entry]
Name=Windows 10 VM
GenericName=Windows 10 Virtual Machine
Comment=Windows 10 in VirtualBox

Exec=/home/admin/.local/share/applications/windows.sh
Icon=/home/admin/.local/share/applications/windows.png
StartupWMClass=Windows

Terminal=false
Type=Application
Categories=Office;

我的 windows.sh 文件:

#!/bin/bash

virtualbox --startvm agromov-vm &
VM_PID=$!
sleep 1
xprop -id $(wmctrl -lp | grep $VM_PID | cut -d ' ' -f 1) -f WM_CLASS 8s -set WM_CLASS 'Windows'

“agromov-vm” 是虚拟机名称
wmctrl 正在获取没有鼠标指针的窗口 ID

答案3

仅供参考,@atitoxic 在其回答中提到的限制已在 VirtualBox >= 5.2.0 中修复,这要感谢他的错误报告。但是,VirtualBox 默认为 WM_CLASS 分配一个通用值(在撰写本文时的最新版本中为“VirtualBox Machine”,即 6.0.14)。要启用此功能, GUI/DistinguishMachineWindowGroups必须将额外数据设置为true使用VBoxManage

VBoxManage setextradata <uuid|name> GUI/DistinguishMachineWindowGroups true

<uuid|name>是虚拟机的 UUID 或名称。也可以将其设置global为全局为所有虚拟机启用该功能。

此后,VirtualBox 应该分配一个包含 VM 的 UUID 的 WM_CLASS 值。您可以使用 进行验证xprop WM_CLASS

相关内容