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 .desktop
plik, 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, StartupWMClass
muszę ustawić, aby osiągnąć to poprawnie. Otrzymałem dwie nazwy klas („Android Virtual Device Manager” i „emulator64-arm”), używając xprop WM_CLASS
w 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, StartupWMClass
ale 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_CLASS
wartości. Oznacza to, że kiedy kliknę mój program uruchamiający StartupWMClass=com-mathworks-util-PostVMInit
w nim, na ekranie powitalnym pojawi się inna (domyślna Nieznana) Unity
ikona, podczas gdy reszta pojawi się zgrupowana pod moim programem uruchamiającym.
Używając xprop WMCLASS
i klikając najpierw ekran powitalny, a następnie powtarzając z aktywną Matlab
sesją, 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.
Drawers
w 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 programieUnity
uruchamiającym, co próbuję zatrzymaćOdpowiedzi:
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 ()):
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 :-).
źródło
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 2
apotatoes
ze swoimi nazwami okien i pożądanym WMClass):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:
Na koniec ustaw .sh, który stworzyliśmy, aby uruchamiał się przy każdym uruchomieniu systemu operacyjnego:
Mam nadzieję, że moja odpowiedź jest pomocna dla każdego, kto przegląda to pytanie.
źródło