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

20

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

У меня есть программа (Android Virtual Device Manager), которая запускает «подпрограммы» (а именно эмуляторы или виртуальные устройства) изнутри (также может быть запущена из другого источника). Я хочу, чтобы любые экземпляры 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 - это то, что мне нужно, чтобы установить это правильно. Я получил два имени класса («Android Virtual Device Manager» и «emulator64-arm»), используя xprop WM_CLASS в repsective windows. Оба работают индивидуально (значок запуска отображается правильно, независимо от того, как он запускается), но я не могу заставить его работать для обоих.

Я предполагаю, что мне как-то нужно установить два значения для StartupWMClass , но не удалось сделать это правильно (или знать, является ли это действительной операцией). Я пробовал двоеточие, разделенное как переменные среды, разделенные запятыми, кавычки и т. Д., И я не могу найти никаких намеков в официальная документация .

Любые предложения?

EDIT:

Другой, более педантичный, но, вероятно, более узнаваемый пример - с Matlab . Я запускаю 2013a и экран заставки, который изначально показывает, и у программы есть совершенно разные значения WM_CLASS . Это означает, что, когда я нажимаю свою пусковую установку с StartupWMClass=com-mathworks-util-PostVMInit в ней, заставка появляется с другим (по умолчанию неизвестным) значком Unity , а остальная группа группируется под моей пусковой установкой.

Используя xprop WMCLASS и щелкнув поначалу заставки, повторим с активным сеансом Matlab , я получаю следующий вывод терминала:

[email protected]:~$ xprop WM_CLASS
WM_CLASS(STRING) = "MATLAB", "MATLAB"
[email protected]:~$ xprop WM_CLASS
WM_CLASS(STRING) = "sun-awt-X11-XFramePeer", "com-mathworks-util-PostVMInit"

Если бы я мог указать что-то по строкам:

StartupWMClass=com-mathworks-util-PostVMInit&&MATLAB

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

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

    
задан B T 29.01.2013 в 01:17
источник

2 ответа

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 ()):

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

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

    
ответ дан gotrunk 12.05.2013 в 12:15
источник
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, который мы создали, чтобы запускать каждый раз, когда ОС запускается:

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

    
ответ дан Misterio7 25.03.2016 в 16:15