Ustaw wiele wartości dla StartupWMClass (aby zgrupować w ramach tego samego programu uruchamiającego w Unity)

20

To konkretny przykład ogólnego problemu, dla którego nie udało mi się znaleźć rozwiązania.

Mam program (Android Virtual Device Manager), który uruchamia „podprogramy” (mianowicie emulatory lub urządzenia wirtualne) od siebie (można je również uruchamiać gdzie indziej). Chcę, aby wszelkie instancje EITHER tych programów były zgrupowane pod tą samą ikoną Jedności.

Utworzyłem .desktopplik, aby to osiągnąć, ale nie wiem, jak sobie z tym poradzić. Plik pulpitu wygląda następująco:

#!/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

Z tego, co rozumiem, StartupWMClassmuszę ustawić, aby osiągnąć to poprawnie. Otrzymałem dwie nazwy klas („Android Virtual Device Manager” i „emulator64-arm”), używając xprop WM_CLASSw repsective windows. Oba działają osobno (ikona programu uruchamiającego jest poprawnie dołączona do programu bez względu na to, w jaki sposób jest uruchomiona), ale nie mogę sprawić, aby działał dla obu.

Zakładam, że muszę jakoś ustawić dwie wartości, StartupWMClassale nie byłem w stanie zrobić tego poprawnie (lub wiedzieć, czy jest to poprawna operacja). Próbowałem, oddzielić dwukropek jak zmienne środowiskowe, przecinek, cudzysłowy itp. I nie mogę znaleźć żadnych wskazówek w oficjalnej dokumentacji .

Jakieś sugestie?

EDYTOWAĆ:

Innym, bardziej pedantycznym, ale prawdopodobnie bardziej identyfikowalnym przykładem jest Matlab. Używam 2013a i ekranu powitalnego, który początkowo pokazuje, a program ma zupełnie inne WM_CLASSwartości. Oznacza to, że kiedy kliknę mój program uruchamiający StartupWMClass=com-mathworks-util-PostVMInitw nim, na ekranie powitalnym pojawi się inna (domyślna Nieznana) Unityikona, podczas gdy reszta pojawi się zgrupowana pod moim programem uruchamiającym.

Używając xprop WMCLASSi klikając najpierw ekran powitalny, a następnie powtarzając z aktywną Matlabsesją, otrzymuję następujące dane wyjściowe terminala:

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"

Gdybym mógł podać coś w stylu:

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

To działałoby idealnie (ponieważ oba działają osobno), ale nie mam pojęcia o składni, jeśli w ogóle istnieje. Po prostu wiem, że do tej pory nic nie działało.

Każda pomoc lub ostateczna odpowiedź w obu przypadkach byłaby świetna, ponieważ uważam, że jest to dość podstawowy element dobrze funkcjonującego pulpitu.

BT
źródło
1
Czy byłbyś w stanie uzyskać wskazówki z Szuflad ?
1
Patrzyłem na filmy Drawersw tym linku i z tego, co pokazują, po prostu grupuje linki, po kliknięciu dowolnego elementu podrzędnego, jest nadal tworzone z własną ikoną w programie Unityuruchamiającym, co próbuję zatrzymać
BT

Odpowiedzi:

8

Ten sam problem dla mnie z uruchomionym Starcraft II rzutem playonlinux. Najpierw jest uruchamianie aplikacji:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") a następnie sama gra:

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

Myślę, że wino ustawia klasę za pomocą binarnego pliku wykonywalnego.

Zajrzałem do kodu bamf (bamf_matcher.c, metoda insert_desktop_file_class_into_table ()):

  • Istnieje mapa, która tworzy powiązanie między plikiem na pulpicie a jedną i tylko jedną klasą,
  • Klucz StartupWMClass jest odczytywany za pomocą g_key_file_get_string (), który nie jest przeznaczony do zwracania listy ciągów,
  • g_key_file_get_string_list () mógł to zrobić, ale programiści bamf nie zaprojektowali frameworka, aby móc powiązać wiele klas w jednym pliku pulpitu.

W moim przypadku oszukuję, tworząc 2 pliki pulpitu z tymi samymi kluczami, ale StartupWMClass. Nie jest to idealne, ponieważ nadal mam 2 ikony Uniy w programie uruchamiającym, ale ważne jest to, że wiem dlaczego :-).

upił się
źródło
Wygląda to bardzo obiecująco, zadałem pytanie, aby spróbować uzyskać od nich potwierdzenie, ale wciąż brak odpowiedzi ...
BT
1
To nie do końca odpowiedź. Odpowiedź brzmi „nie możesz”, ponieważ specyfikacja pliku pulpitu czyni tę wartość pojedynczym ciągiem, a nie listą ciągów (dlatego bamfdaemon używa get_string (), a nie get_string_list () dla tej wartości).
dobey
1

Wiem, że to pytanie jest naprawdę stare, ale po przejściu tego samego problemu, wydaje mi się, że w końcu stworzyłem obejście tego problemu i postanowiłem podzielić się z każdym, kto ma ten problem:

Ponieważ nie możemy ustawić wielu klas WMC dla jednego pliku .desktop, dlaczego nie ustawić wszystkich okien na jedną klasę WMC?

Możemy zrobić coś takiego (oczywiście zastąpić Window 1, Window 2a potatoesze swoimi nazwami okien i pożądanym 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"

A w pliku .desktop możemy to zrobić: StartupWMClass=potatoes

Tadam! Wszystkie okna są teraz zgrupowane.
Ale hej, czy robimy to ręcznie za każdym razem, gdy program się otwiera? Oczywiście nie.

Możemy po prostu stworzyć skrypt bash, który automatycznie robi to co pół sekundy:

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

Na koniec ustaw .sh, który stworzyliśmy, aby uruchamiał się przy każdym uruchomieniu systemu operacyjnego: Zrzut ekranu

Mam nadzieję, że moja odpowiedź jest pomocna dla każdego, kto przegląda to pytanie.

Misterio
źródło