Festlegen mehrerer Werte für StartupWMClass (zum Gruppieren unter demselben Launcher in Unity)

20

Dies ist ein spezifisches Beispiel für ein generisches Problem, für das ich noch keine Lösung gefunden habe.

Ich habe ein Programm (Android Virtual Device Manager), das "Unterprogramme" (nämlich Emulatoren oder virtuelle Geräte) von sich aus startet (kann auch von woanders gestartet werden). Ich möchte, dass alle Instanzen von JEDEM dieser Programme unter demselben Unity-Symbol gruppiert werden.

Ich habe eine .desktopDatei erstellt, um dies zu erreichen, weiß aber nicht genau, wie ich es anstellen soll. Die Desktop-Datei sieht wie folgt aus:

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

Nach meinem Verständnis muss StartupWMClassich Folgendes einstellen, um dies korrekt zu erreichen. Ich habe die beiden Klassennamen ('Android Virtual Device Manager' und ' xprop WM_CLASSemulator64 -arm') unter Verwendung der entsprechenden Fenster erhalten. Beide funktionieren einzeln (das Startsymbol ist unabhängig von der Art des Programmstarts korrekt an das Programm angehängt), aber ich kann nicht dafür sorgen, dass es für beide funktioniert.

Ich StartupWMClassgehe davon aus, dass ich zwei Werte für irgendwie festlegen muss, aber nicht in der Lage war, es richtig zu tun (oder zu wissen, ob es eine gültige Operation ist). Ich habe versucht, Doppelpunkt getrennt wie Umgebungsvariablen, Komma getrennt, Anführungszeichen usw. und ich kann keine Hinweise in der offiziellen Dokumentation finden .

Irgendwelche Vorschläge?

BEARBEITEN:

Ein anderes, umständlicheres, aber wahrscheinlich identifizierbareres Beispiel ist mit Matlab. Ich führe 2013a aus und der Startbildschirm, der anfänglich angezeigt wird, und das Programm haben völlig unterschiedliche WM_CLASSWerte. Das heißt, wenn ich auf meinen StartupWMClass=com-mathworks-util-PostVMInitStartbildschirm klicke, wird auf dem Begrüßungsbildschirm ein anderes (standardmäßig unbekanntes) UnitySymbol angezeigt , während der Rest unter meinem Startbildschirm gruppiert wird.

Wenn ich xprop WMCLASSzuerst den Begrüßungsbildschirm benutze und darauf klicke und dann mit einer aktiven MatlabSitzung wiederhole, erhalte ich die folgende Terminalausgabe:

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"

Wenn ich etwas nach folgendem Schema spezifizieren könnte:

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

Das würde perfekt funktionieren (da beide getrennt funktionieren), aber ich habe keine Ahnung von der Syntax, ob sie überhaupt existiert. Ich weiß nur, dass bisher nichts funktioniert hat, was ich ausprobiert habe.

Jede Hilfe oder endgültige Antwort wäre großartig, da dies meiner Meinung nach ein ziemlich grundlegendes Element eines gut funktionierenden Desktops ist.

BT
quelle
1
Könntest du ein paar Hinweise von Drawers bekommen ?
1
Ich habe ich die Videos sah Drawersin dieser Verbindung und von dem, was sie zeigen, ist es einfach gruppiert die Links, wenn Sie eine beliebigen Unterpunkt klicken, wird es immer noch mit einem eigenen Symbol in dem erstellten UnityLauncher das ist , was ich zu stoppen bin versucht
BT

Antworten:

8

Das gleiche Problem für mich mit Starcraft II startete Wurf Playonlinux. Es gibt zuerst einen Anwendungsstarter:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") und dann das Spiel selbst:

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

Ich vermute, dass Wein die Klasse mit der ausführbaren Binärdatei setzt.

Ich habe in der Methode bamf code (bamf_matcher.c, insert_desktop_file_class_into_table ()) nachgesehen:

  • Es gibt eine Karte, die die Zuordnung zwischen einer Desktop-Datei und einer und nur einer Klasse herstellt.
  • Der Schlüssel StartupWMClass wird mit g_key_file_get_string () gelesen, das keine Liste von Zeichenfolgen zurückgeben soll.
  • g_key_file_get_string_list () konnte das tun, aber die Entwickler von bamf haben das Framework nicht so entworfen, dass mehrere Klassen einer einzelnen Desktop-Datei zugeordnet werden können.

In meinem Fall betrüge ich, indem ich 2 Desktop-Dateien mit denselben Schlüsseln erstelle, aber StartupWMClass. Dies ist nicht perfekt, da ich im Launcher noch 2 Uniy-Symbole habe, aber das Wichtigste ist, dass ich weiß, warum :-).

betrunken
quelle
Das sieht sehr vielversprechend aus, ich habe eine Frage gestellt , um eine Bestätigung von ihnen zu erhalten, aber noch keine Antwort ...
BT
1
Dies ist keine richtige Antwort. Die Antwort lautet "Sie können nicht", da in der Desktop-Dateispezifikation dieser Wert eine einzelne Zeichenfolge und keine Liste von Zeichenfolgen ist (daher verwendet bamfdaemon get_string () und nicht get_string_list () für diesen Wert).
Dobey
1

Ich weiß, dass diese Frage wirklich alt ist, aber nachdem ich dasselbe Problem durchgearbeitet habe, habe ich wahrscheinlich endlich eine Problemumgehung für dieses Problem erstellt und beschlossen, sie allen mitzuteilen, die dieses Problem haben:

Da wir nicht mehrere WMClasses für eine einzige .desktop-Datei festlegen können, sollten Sie nicht alle Fenster auf eine einzige WMClass festlegen.

Wir können etwas tun (Offensichtlich ersetzen Window 1, Window 2und potatoesmit Ihren Windows - Namen und die gewünschten 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"

Und in der .desktop-Datei können wir dies tun: StartupWMClass=potatoes

Tadam! Alle Fenster sind jetzt gruppiert.
Aber hey, machen wir das jedes Mal manuell, wenn das Programm geöffnet wird? Natürlich nicht.

Wir können einfach ein Bash-Skript erstellen, das dies automatisch jede halbe Sekunde erledigt:

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

Und schließlich stellen Sie die von uns erstellte .sh-Datei so ein, dass sie bei jedem Start des Betriebssystems ausgeführt wird: Bildschirmfoto

Hoffe, meine Antwort ist hilfreich für alle, die diese Frage durchsuchen.

Misterio
quelle