web-dev-qa-db-fra.com

Définissez plusieurs valeurs pour StartupWMClass (à regrouper sous le même lanceur dans Unity)

C'est un exemple spécifique d'un problème générique pour lequel je n'ai pas encore trouvé de solution.

J'ai un programme (Android Virtual Device Manager) qui lance des "sous-programmes" (notamment des émulateurs ou des périphériques virtuels) à partir de lui-même (peut également être lancé ailleurs). Je souhaite que toutes les instances de l'un ou l'autre de ces programmes soient regroupées sous la même icône Unity.

J'ai créé un fichier .desktop pour essayer de le faire, mais je ne sais pas exactement comment s'y prendre. Le fichier de bureau est comme suit:

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

D'après ce que j'ai compris, StartupWMClass est ce que je dois définir pour y parvenir correctement. J'ai obtenu les deux noms de classe ('Android Virtual Device Manager' et 'emulator64-arm') en utilisant xprop WM_CLASS sur les fenêtres repsectives. Les deux fonctionnent individuellement (l'icône du lanceur est correctement connectée au programme, quelle que soit la manière dont il est lancé), mais je ne parviens pas à le faire fonctionner pour les deux.

Je suppose que je dois en quelque sorte définir deux valeurs pour StartupWMClass, mais je n'ai pas été en mesure de le faire correctement (ou de savoir si l'opération est valide). J'ai essayé, séparés par deux points, comme les variables d'environnement, séparés par des virgules, des guillemets, etc., et je ne trouve aucun indice dans le documentation officielle .

Aucune suggestion?

EDIT:

Un autre exemple, plus pédant, mais probablement plus identifiable, est avec Matlab. Je suis en cours d'exécution 2013a et l'écran de démarrage qui s'affiche initialement et le programme ont des valeurs WM_CLASS complètement différentes. Cela signifie que, lorsque je clique sur mon lanceur contenant StartupWMClass=com-mathworks-util-PostVMInit, l'écran de démarrage se présente avec une icône différente (par défaut inconnue) Unity, le reste apparaissant regroupé sous mon lanceur.

En utilisant xprop WMCLASS et en cliquant d'abord sur l'écran de démarrage, puis en répétant avec une session active Matlab, j'obtiens la sortie de terminal suivante:

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"

Si je pouvais préciser quelque chose comme:

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

Cela fonctionnerait parfaitement (comme les deux travaillent séparément) mais je n’ai aucune idée de la syntaxe, même si elle existe. Je sais simplement que rien de ce que j'ai essayé a fonctionné jusqu'à présent.

Toute aide ou réponse définitive dans un sens ou dans l’autre serait très utile, car j’estime qu’il s’agit là d’un élément fondamental d’un ordinateur de bureau fonctionnel.

20
B T

Le même problème pour moi avec Starcraft II a été lancé par Playonlinux. Il y a d'abord un lanceur d'applications:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") et ensuite le jeu lui-même:

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

Je suppose que wine définit la classe avec l'exécutable binaire.

J'ai jeté un œil dans le code bamf (méthode bamf_matcher.c, insert_desktop_file_class_into_table ()):

  • Il existe une carte qui associe un fichier de bureau à une et une seule classe,
  • La clé StartupWMClass est lue avec g_key_file_get_string () qui n’est pas conçu pour renvoyer une liste de chaînes,
  • g_key_file_get_string_list () pourrait le faire, mais les développeurs de bamf n'ont pas conçu le cadre pour pouvoir associer plusieurs classes à un seul fichier de bureau.

Dans mon cas, je triche en créant 2 fichiers de bureau avec les mêmes clés mais StartupWMClass. Ce n’est pas parfait parce que j’ai toujours 2 icônes Uniy dans le lanceur mais l’important est que je sais pourquoi :-).

8
gotrunk

Je sais que cette question est vraiment ancienne, mais après avoir traversé le même problème, je pense que j'ai finalement créé une solution de contournement pour cela et j'ai décidé de la partager avec quiconque ayant ce problème:

Comme nous ne pouvons pas définir plusieurs classes WMClasses pour un seul fichier .desktop, pourquoi ne pas définir toutes les fenêtres sur une seule classe WMC?

Nous pouvons faire quelque chose comme ceci (évidemment, remplacez Window 1, Window 2 et potatoes par vos noms de fenêtres et le WMClass souhaité):

xprop -name "Window 1" -f WM_CLASS 8s -set WM_CLASS "potatoes"

xprop -name "Window 2" -f WM_CLASS 8s -set WM_CLASS "potatoes"

Et sur le fichier .desktop, nous pouvons faire ceci: StartupWMClass=potatoes

Tadam! Toutes les fenêtres sont regroupées maintenant.
Mais bon, faisons-nous cela manuellement chaque fois que le programme s’ouvre? Bien sûr que non.

Nous pouvons simplement créer un script bash qui le fait automatiquement toutes les demi-secondes:

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

Et enfin, configurez le .sh que nous avons créé pour s’exécuter à chaque démarrage du système d’exploitation: Screenshot

J'espère que ma réponse sera utile à quiconque parcourant cette question.

1
Misterio