Establecer varios valores para StartupWMClass (agrupar bajo el mismo iniciador en Unity)

20

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

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

Creé un archivo .desktop para intentar y lograr esto, 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, StartupWMClass es lo que necesito establecer para lograr esto correctamente. Obtuve los dos nombres de clase ('Android Virtual Device Manager' y 'emulator64-arm') usando xprop WM_CLASS en las ventanas de respuesta. Ambos funcionan de forma individual (el icono del iniciador está conectado correctamente al programa, sin importar de qué manera se lance), pero no puedo hacer que funcione para ambos.

Supongo que de alguna manera necesito establecer dos valores para StartupWMClass pero no he podido hacerlo correctamente (o sé si es una operación válida). Lo he intentado, con dos puntos separados como variables de entorno, separados por comas, comillas, etc. y no puedo encontrar ninguna pista en 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 se muestra inicialmente y el programa tiene valores de WM_CLASS completamente diferentes. Esto significa que cuando hago clic en mi selector con StartupWMClass=com-mathworks-util-PostVMInit en él, la pantalla de bienvenida aparece con un icono diferente (predeterminado predeterminado) Unity , mientras que el resto aparece agrupado en mi iniciador.

Al usar xprop WMCLASS y al hacer clic primero en la pantalla de inicio, luego repitiendo con una sesión activa de Matlab 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 como:

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. Simplemente sé que nada de lo que he intentado ha funcionado hasta ahora.

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

    
pregunta B T 29.01.2013 - 01:17

2 respuestas

8

El mismo problema para mí con Starcraft II lanzado 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 ese vino está configurando la clase con el ejecutable binario.

Eché un vistazo al código bamf (método bamf_matcher.c, insert_desktop_file_class_into_table ()):

  • Hay un mapa que hace 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 teclas pero StartupWMClass. Esto no es perfecto porque todavía tengo 2 íconos de Uniy cuando estoy en el iniciador, pero lo importante es que sé por qué: -).

    
respondido por el gotrunk 12.05.2013 - 12:15
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í compartirla con cualquiera que tenga este problema:

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

Podemos hacer algo como esto (Obviamente, reemplace Window 1 , Window 2 y potatoes con sus nombres de Windows y WMClass deseados):

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, ¿lo estamos haciendo de forma manual cada vez que se abre el programa? Por supuesto que no.

Podemos ir y crear un script bash que automaticamente haga eso 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, por último, configure el .sh que creamos para que se ejecute cada vez que se inicie el sistema operativo:

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

    
respondido por el Misterio7 25.03.2016 - 16:15

Lea otras preguntas en las etiquetas