Establecer múltiples valores para StartupWMClass (para agrupar en el mismo iniciador en Unity)

20

Este es un ejemplo específico de un problema genérico para el que aún no he podido encontrar una solución.

Tengo un programa (Android Virtual Device Manager) que lanza 'subprogramas' (es decir, emuladores o dispositivos virtuales) desde dentro (también se puede iniciar desde otro lugar). Quiero que cualquier instancia de CUALQUIERA de estos programas se agrupe bajo el mismo ícono de Unity.

He creado un .desktoparchivo para intentarlo, pero no sé exactamente cómo hacerlo. El archivo de escritorio es el siguiente:

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

Por lo que entiendo, StartupWMClasses lo que necesito configurar para lograr esto correctamente. He obtenido los dos nombres de clase ('Android Virtual Device Manager' y 'emulator64-arm') usando xprop WM_CLASSen las ventanas reactivas. Ambos funcionan individualmente (el ícono del iniciador está conectado correctamente al programa sin importar de qué manera se inicie), pero no puedo hacer que funcione para ambos.

Supongo que de alguna manera necesito establecer dos valores, StartupWMClasspero no he podido hacerlo correctamente (o saber si es una operación válida). Lo he intentado, separados por dos puntos como variables de entorno, separados por comas, comillas, etc. y no puedo encontrar ninguna pista en la documentación oficial .

¿Alguna sugerencia?

EDITAR:

Otro ejemplo más pedante, pero probablemente más identificable es con Matlab. Estoy ejecutando 2013a y la pantalla de inicio que muestra inicialmente y el programa tiene WM_CLASSvalores completamente diferentes . Esto significa que, cuando hago clic en mi iniciador StartupWMClass=com-mathworks-util-PostVMInit, la pantalla de bienvenida aparece con un Unityícono diferente (desconocido) , mientras que el resto aparece agrupado debajo de mi iniciador.

Al usar xprop WMCLASSy hacer clic primero en la pantalla de inicio, luego repitiendo con una Matlabsesión activa obtengo la siguiente salida de terminal:

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 pudiera especificar algo en la línea de:

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

Eso funcionaría perfectamente (ya que ambos funcionan por separado) pero no tengo idea de la sintaxis, si es que existe. Solo sé que nada de lo que he intentado ha funcionado hasta ahora.

Cualquier ayuda o una respuesta definitiva de cualquier manera sería genial, ya que creo que este es un elemento bastante fundamental para un escritorio que funcione bien.

BT
fuente
1
¿Serías capaz de obtener algunas pistas de Drawers ?
1
He visto los videos de Drawersese enlace y, por lo que muestran, simplemente agrupa los enlaces, cuando haces clic en cualquier elemento secundario, todavía se crea con su propio icono en el Unityiniciador, que es lo que estoy tratando de detener
BT

Respuestas:

8

El mismo problema para mí con Starcraft II lanzó throw playonlinux. Primero hay un lanzador de aplicaciones:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") y luego el juego en sí:

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

Supongo que el vino está estableciendo la clase con el ejecutable binario.

Observé el código bamf (método bamf_matcher.c, insert_desktop_file_class_into_table ()):

  • Hay un mapa que establece la asociación entre un archivo de escritorio y una y solo una clase,
  • La clave StartupWMClass se lee con g_key_file_get_string () que no está diseñada para devolver una lista de cadenas,
  • g_key_file_get_string_list () podría hacer eso, pero los desarrolladores de bamf no diseñaron el marco para poder asociar múltiples clases a un solo archivo de escritorio.

En mi caso, hago trampa creando 2 archivos de escritorio con las mismas claves pero StartupWMClass. Esto no es perfecto porque todavía tengo 2 iconos Uniy cuando estoy en el iniciador, pero lo importante es que sé por qué :-).

emborrachado
fuente
Esto parece muy prometedor, he hecho una pregunta para intentar obtener la confirmación de ellos, pero aún no hay respuesta ...
BT
1
Esto no es una respuesta. La respuesta es "no se puede" porque la especificación del archivo de escritorio hace que este valor sea una sola cadena y no una lista de cadenas (es por eso que bamfdaemon usa get_string () y no get_string_list () para ese valor).
dobey
1

Sé que esta pregunta es muy antigua, pero después de pasar por el mismo problema, creo que finalmente he creado una solución para esto, y decidí compartir con cualquiera que tenga este problema:

Como no podemos configurar múltiples WMClasses para un único archivo .desktop, ¿por qué no configurar todas las ventanas en un único WMClass?

Podemos hacer algo como esto (Obviamente, sustituir Window 1, Window 2y potatoescon sus nombres y ventanas WMClass desea):

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

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

Y en el archivo .desktop podemos hacer esto: StartupWMClass=potatoes

Tadam! Todas las ventanas están agrupadas ahora.
Pero bueno, ¿estamos haciendo esto manualmente cada vez que se abre el programa? Por supuesto no.

Podemos ir y hacer un script bash que lo haga automáticamente cada medio segundo:

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

Y finalmente, configure el .sh que creamos para ejecutarse cada vez que se inicie el sistema operativo: Captura de pantalla

Espero que mi respuesta sea útil para cualquiera que explore esta pregunta.

Misterio
fuente