Встановіть декілька значень для 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" і "емулятор64-рука"), використовуючи 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")

Я здогадуюсь, що вино встановлює клас із бінарним виконуваним файлом.

Я ознайомився з кодом 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
Це не зовсім відповідь. Відповідь - "ви не можете", оскільки специфікація файлу робочого столу робить це значення єдиним рядком, а не списком рядків (саме тому bamfdaemon використовує get_string (), а не get_string_list () для цього значення).
добі

1

Я знаю, що це питання справді давнє, але, переживши ту саму проблему, я думаю, що нарешті створив вирішення цього питання, і вирішив поділитися з усіма, хто має цю проблему:

Оскільки ми не можемо встановити кілька класів WMC для одного файлу .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

Тадам! Усі вікна зараз згруповані.
Але ей, чи робимо ми це вручну кожного разу, коли програма відкривається? Звичайно, ні.

Ми можемо просто піти і зробити скрипт, який автоматично робить це кожні пів секунди:

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.