Установить несколько значений для StartupWMClass (для группировки под одним и тем же средством запуска в Unity)


20

Это конкретный пример общей проблемы, решение которой я пока не смог найти.

У меня есть программа (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

Это будет работать идеально (так как оба работают по отдельности), но я понятия не имею о синтаксисе, если он вообще существует. Я просто знаю, что ничего, что я пробовал, до сих пор не работало

Любая помощь или точный ответ в любом случае были бы великолепны, так как я считаю, что это довольно важный элемент хорошо функционирующего рабочего стола.


1
Сможете ли вы получить некоторые подсказки от ящиков ?

1
Я посмотрел видео по Drawersэтой ссылке и по тому, что они показывают, он просто группирует ссылки, когда вы щелкаете по любому подпункту, он все еще создается со своим собственным значком в Unityпанели запуска, который я пытаюсь остановить
BT

Ответы:


8

Та же самая проблема для меня с 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 ()):

  • Существует карта, которая устанавливает связь между файлом рабочего стола и одним и только одним классом,
  • Ключ StartupWMClass читается с помощью g_key_file_get_string (), которая не предназначена для возврата списка строк,
  • g_key_file_get_string_list () могла бы сделать это, но разработчики bamf не разработали структуру для возможности связывать несколько классов в одном файле рабочего стола.

В моем случае я обманываю, создавая 2 файла рабочего стола с теми же ключами, но StartupWMClass. Это не идеально, потому что у меня все еще есть 2 иконки Uniy, когда они находятся в лаунчере, но важно знать, почему :-).


Это выглядит очень многообещающе, я задал вопрос, чтобы попытаться получить от них подтверждение, но ответа пока нет ...
BT

1
Это не совсем ответ. Ответ: «Вы не можете», потому что спецификация Desktop File делает это значение одной строкой, а не списком строк (именно поэтому bamfdaemon использует get_string (), а не get_string_list () для этого значения).
Добей

1

Я знаю, что этот вопрос действительно старый, но, пройдя ту же самую проблему, я, наконец, создал обходной путь для этого и решил поделиться с каждым, кто имеет эту проблему:

Поскольку мы не можем установить несколько WMClasses для одного файла .desktop, почему бы не установить все окна в один 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"

И в файле .desktop мы можем сделать это: StartupWMClass=potatoes

Tadam! Все окна теперь сгруппированы.
Но, эй, мы делаем это вручную каждый раз, когда программа открывается? Конечно нет.

Мы можем просто создать скрипт 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, который мы создали, для запуска при каждом запуске ОС: Скриншот

Надеюсь, мой ответ будет полезен всем, кто просматривает этот вопрос.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.