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

20

Ceci 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" (à savoir des émulateurs ou des périphériques virtuels) à partir de lui-même (et peut également être lancé ailleurs). Je souhaite que toutes les instances de chacun 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 le suivant:

#!/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 classes ('Android Virtual Device Manager' et 'emulator64-arm') en utilisant xprop WM_CLASS sur les fenêtres repsective. Les deux fonctionnent individuellement (l'icône du lanceur est correctement attachée au programme, peu importe la manière dont il est lancé), mais je ne peux pas le faire fonctionner pour les deux.

Je suppose que je dois en quelque sorte définir deux valeurs pour StartupWMClass mais que je n'ai pas pu le faire correctement (ou savoir si c'est une opération valide). J'ai essayé, les deux points séparés comme les variables d'environnement, les virgules, les guillemets, etc. "> documentation officielle .

Des suggestions?

MODIFIER:

Un autre exemple, plus pédant, mais probablement plus identifiable, concerne Matlab . Je cours 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 avec StartupWMClass=com-mathworks-util-PostVMInit , l'écran de démarrage affiche une icône différente (par défaut) Unity , tandis que le reste est regroupé sous mon lanceur.

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

[email protected]:~$ xprop WM_CLASS
WM_CLASS(STRING) = "MATLAB", "MATLAB"
[email protected]:~$ xprop WM_CLASS
WM_CLASS(STRING) = "sun-awt-X11-XFramePeer", "com-mathworks-util-PostVMInit"

Si je pouvais spécifier quelque chose comme:

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

Cela fonctionnerait parfaitement (comme les deux fonctionnent séparément) mais je n'ai aucune idée de la syntaxe, si elle existe même. Je sais juste que rien n'a fonctionné jusqu'ici.

Toute aide ou une réponse définitive de quelque manière que ce soit serait formidable car je crois que c'est un élément fondamental d'un ordinateur qui fonctionne bien.

    
posée B T 29.01.2013 - 02:17
la source

2 réponses

8

Même problème pour moi avec Starcraft II lancé lance playonlinux. Il y a d'abord un lanceur d'application:

  • (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 regardé dans le code bamf (méthode bamf_matcher.c, insert_desktop_file_class_into_table ()):

  • Il y a une carte qui fait l'association entre un fichier de bureau et une et une seule classe,
  • La clé StartupWMClass est lue avec g_key_file_get_string () qui n'est pas conçue 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 framework 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 car j’ai encore 2 icônes Uniy dans le lanceur mais l’important est de savoir pourquoi: -).

    
réponse donnée gotrunk 12.05.2013 - 14:15
la source
1

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

Comme nous ne pouvons pas définir plusieurs 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 ça (évidemment, remplacez Window 1 , Window 2 et potatoes par vos noms Windows et WMClass désiré):

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 le faire: 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, définissez le fichier .sh que nous avons créé pour être exécuté à chaque démarrage du système d'exploitation:

J'espère que ma réponse sera utile à tous ceux qui parcourent cette question.

    
réponse donnée Misterio7 25.03.2016 - 17:15
la source

Lire d'autres questions sur les étiquettes