Imposta più valori per StartupWMClass (per raggruppare sotto lo stesso launcher in Unity)

20

Questo è un esempio specifico di un problema generico. Non sono ancora riuscito a trovare una soluzione.

Ho un programma (Android Virtual Device Manager) che lancia "sottoprogrammi" (ovvero emulatori o dispositivi virtuali) dal suo interno (può anche essere lanciato da altrove dove). Voglio che tutte le istanze di EITHER di questi programmi siano raggruppate sotto la stessa icona Unity.

Ho creato un file .desktop per provare a farlo ma non so esattamente come farlo. Il file desktop è il seguente:

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

Da quanto ho capito, StartupWMClass è ciò di cui ho bisogno per essere impostato correttamente. Ho ottenuto i due nomi di classe ('Android Virtual Device Manager' e 'emulator64-arm') usando xprop WM_CLASS nelle finestre repsective. Entrambi funzionano individualmente (l'icona di avvio è correttamente collegata al programma indipendentemente dal modo in cui è stata avviata), ma non riesco a farla funzionare per entrambi.

Sto assumendo che in qualche modo ho bisogno di impostare due valori per StartupWMClass ma non sono stato in grado di farlo correttamente (o sapere se è un'operazione valida). Ho provato, due punti separati come variabili d'ambiente, separati da virgole, virgolette, ecc. E non riesco a trovare alcun suggerimento nel documentazione ufficiale .

Qualche suggerimento?

Modifica

Un altro esempio più pedante, ma probabilmente più identificabile, è con Matlab . Sono in esecuzione 2013a e la schermata iniziale che inizialmente mostra e il programma ha valori WM_CLASS completamente diversi. Ciò significa che quando faccio clic sul mio launcher con StartupWMClass=com-mathworks-util-PostVMInit in esso, la schermata iniziale presenta un'icona diversa (predefinita sconosciuta) Unity , mentre il resto viene raggruppato sotto il mio programma di avvio.

Usando xprop WMCLASS e facendo clic su prima sulla schermata iniziale, quindi ripetendo con una sessione Matlab attiva, ottengo il seguente output del terminale:

[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"

Se potessi specificare qualcosa sulla falsariga di:

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

Funzionerebbe perfettamente (poiché entrambi funzionano separatamente) ma non ho idea della sintassi, se esiste anche. So solo che nulla di ciò che ho provato ha funzionato fino ad ora.

Qualsiasi aiuto o una risposta definitiva in entrambi i casi sarebbe grandioso, poiché ritengo che questo sia un elemento piuttosto fondamentale di un desktop ben funzionante.

    
posta B T 29.01.2013 - 02:17

2 risposte

8

Lo stesso problema per me con Starcraft II ha lanciato playonlinux. C'è prima un lanciatore di applicazioni:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") e poi il gioco stesso:

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

Credo che wine stia impostando la classe con l'eseguibile binario.

Ho dato un'occhiata al codice bamf (metodo bamf_matcher.c, insert_desktop_file_class_into_table ()):

  • Esiste una mappa che crea l'associazione tra un file desktop e una sola classe,
  • La chiave StartupWMClass viene letta con g_key_file_get_string () che non è progettato per restituire un elenco di stringhe,
  • g_key_file_get_string_list () potrebbe farlo ma gli sviluppatori di bamf non hanno progettato il framework per poter associare più classi a un singolo file desktop.

Nel mio caso imbroglio creando 2 file desktop con le stesse chiavi ma StartupWMClass. Questo non è perfetto perché ho ancora 2 icone Uniy quando si è nel launcher, ma l'importante è che io sappia perché: -).

    
risposta data gotrunk 12.05.2013 - 14:15
1

So che questa domanda è davvero vecchia, ma dopo aver affrontato lo stesso problema, penso di aver finalmente creato una soluzione alternativa e ho deciso di condividere con chiunque avesse questo problema:

Poiché non possiamo impostare più WMClass per un singolo file .desktop, perché non impostare tutte le finestre su un singolo WMClass?

Possiamo fare qualcosa del genere (Ovviamente, sostituire Window 1 , Window 2 e potatoes con i nomi di Windows e WMClass desiderati):

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

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

E sul file .desktop possiamo fare questo: StartupWMClass=potatoes

tadam! Tutte le finestre sono raggruppate ora.
Ma ciao, lo facciamo manualmente ogni volta che si apre il programma? Certo che no.

Possiamo solo andare a creare uno script bash che lo faccia automagicamente ogni mezzo secondo:

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

Infine, imposta il file .sh che abbiamo creato per essere eseguito ogni volta che si avvia il sistema operativo:

Spero che la mia risposta sia utile per chiunque stia consultando questa domanda.

    
risposta data Misterio7 25.03.2016 - 17:15

Leggi altre domande sui tag