Impostare più valori per StartupWMClass (per raggruppare sotto lo stesso programma di avvio in Unity)


20

Questo è un esempio specifico di un problema generico per il quale non sono stato ancora in grado di trovare una soluzione.

Ho un programma (Android Virtual Device Manager) che avvia "sottoprogrammi" (ovvero emulatori o dispositivi virtuali) dall'interno (può anche essere avviato da un'altra posizione). Voglio che qualsiasi istanza di OGNI di questi programmi sia raggruppata sotto la stessa icona Unity.

Ho creato un .desktopfile per provare a farlo, ma non so esattamente come procedere. 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 quello che ho capito, StartupWMClassè quello che devo impostare per raggiungere questo obiettivo correttamente. Ho ottenuto i due nomi di classe ('Android Virtual Device Manager' e 'emulator64-arm') usando xprop WM_CLASSsulle finestre repsective. Entrambi funzionano individualmente (l'icona del programma di avvio è correttamente collegata al programma, indipendentemente dal modo in cui viene avviata), ma non riesco a farlo funzionare per entrambi.

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

Eventuali suggerimenti?

MODIFICARE:

Un altro esempio più pedante, ma probabilmente più identificabile è con Matlab. Sto eseguendo il 2013a e la schermata iniziale che inizialmente mostra e il programma ha WM_CLASSvalori completamente diversi . Ciò significa che, quando faccio clic sul mio launcher con StartupWMClass=com-mathworks-util-PostVMInital suo interno, la schermata iniziale viene visualizzata con Unityun'icona diversa (predefinita sconosciuta) , mentre il resto viene raggruppato sotto il mio launcher.

Usando xprop WMCLASSe facendo clic prima sulla schermata iniziale, quindi ripetendo con una Matlabsessione attiva ottengo il seguente output del terminale:

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"

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. So solo che nulla di ciò che ho provato ha funzionato finora.

Qualsiasi aiuto o una risposta definitiva in entrambi i casi sarebbe eccezionale in quanto credo che questo sia un elemento piuttosto fondamentale di un desktop ben funzionante.


1
Saresti in grado di ottenere alcuni suggerimenti dai cassetti ?

1
Ho guardato i video di Drawersquel link e da quello che mostrano, raggruppa semplicemente i link, quando fai clic su un elemento secondario, viene comunque creato con una propria icona nel programma di Unityavvio che è ciò che sto cercando di fermare
BT

Risposte:


8

Lo stesso problema per me con Starcraft II lanciato su 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")

Immagino 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 rende l'associazione tra un file desktop e una 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, baro creando 2 file desktop con le stesse chiavi ma StartupWMClass. Questo non è perfetto perché ho ancora 2 icone Uniy quando sono in avvio ma l'importante è che io sappia perché :-).


Sembra molto promettente, ho fatto una domanda per cercare di ottenere conferma da loro, ma ancora nessuna risposta ancora ...
BT

1
Questa non è proprio una risposta. La risposta è "impossibile" perché la specifica del file desktop rende questo valore una stringa singola e non un elenco di stringhe (motivo per cui bamfdaemon utilizza get_string () e non get_string_list () per quel valore).
dobey

1

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

Dato che non possiamo impostare più WMClasses per un singolo file .desktop, perché non impostare tutte le finestre su una singola WMClass?

Siamo in grado di fare qualcosa di simile (ovviamente, sostituire Window 1, Window 2e potatoescon il tuo Windows nomi e WMClass desiderata):

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 hey, lo facciamo manualmente ogni volta che si apre il programma? Ovviamente no.

Possiamo solo andare a creare uno script bash che lo fa 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

E infine, imposta il .sh che abbiamo creato per essere eseguito ogni volta che il sistema operativo si avvia: Immagine dello schermo

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.