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

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

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

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

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

20
задан 12 January 2015 в 04:29

2 ответа

Та же самая проблема для меня с Starcraft II, запущенным броском playonlinux. Сначала запускается приложение:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine"), а затем сама игра:

  • (WM_CLASS(STRING) = "SC2.exe", "Wine")

  • [ 1113]

    Я предполагаю, что wine устанавливает класс с помощью исполняемого двоичного файла.

    Я посмотрел в коде bamf (bamf_matcher.c, метод insert_desktop_file_class_into_table ()):

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

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

0
ответ дан 12 January 2015 в 04:29

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

Как мы можем не установить несколько 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

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

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

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

0
ответ дан 12 January 2015 в 04:29

Другие вопросы по тегам:

Похожие вопросы: