Это конкретный пример общей проблемы, решение которой я пока не смог найти.
У меня есть программа (Android Virtual Device Manager), которая запускает «подпрограммы» (а именно эмуляторы или виртуальные устройства) изнутри себя (также может быть запущена из другого места). Я хочу, чтобы все экземпляры этих программ были сгруппированы под одним и тем же значком 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
это то , что мне нужно установить, чтобы добиться этого правильно. Я получил два имени класса ('Android Virtual Device Manager' и 'emulator64-arm'), использующих xprop WM_CLASS
в репозитивных окнах. Оба работают по отдельности (значок программы запуска правильно прикреплен к программе, независимо от того, каким образом она запускается), но я не могу заставить ее работать для обоих.
Я предполагаю, что мне как-то нужно установить два значения для, 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
Это будет работать идеально (так как оба работают по отдельности), но я понятия не имею о синтаксисе, если он вообще существует. Я просто знаю, что ничего, что я пробовал, до сих пор не работало
Любая помощь или точный ответ в любом случае были бы великолепны, так как я считаю, что это довольно важный элемент хорошо функционирующего рабочего стола.
Drawers
этой ссылке и по тому, что они показывают, он просто группирует ссылки, когда вы щелкаете по любому подпункту, он все еще создается со своим собственным значком вUnity
панели запуска, который я пытаюсь остановитьОтветы:
Та же самая проблема для меня с Starcraft II, запущенным броском 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 ()):
В моем случае я обманываю, создавая 2 файла рабочего стола с теми же ключами, но StartupWMClass. Это не идеально, потому что у меня все еще есть 2 иконки Uniy, когда они находятся в лаунчере, но важно знать, почему :-).
источник
Я знаю, что этот вопрос действительно старый, но, пройдя ту же самую проблему, я, наконец, создал обходной путь для этого и решил поделиться с каждым, кто имеет эту проблему:
Поскольку мы не можем установить несколько WMClasses для одного файла .desktop, почему бы не установить все окна в один WMClass?
Мы можем сделать что-то вроде этого (очевидно, заменить
Window 1
,Window 2
иpotatoes
с вашими именами окон и желаемого WMClass):И в файле .desktop мы можем сделать это:
StartupWMClass=potatoes
Tadam! Все окна теперь сгруппированы.
Но, эй, мы делаем это вручную каждый раз, когда программа открывается? Конечно нет.
Мы можем просто создать скрипт bash, который автоматически делает это каждые полсекунды:
И, наконец, установите .sh, который мы создали, для запуска при каждом запуске ОС:
Надеюсь, мой ответ будет полезен всем, кто просматривает этот вопрос.
источник