Defina vários valores para StartupWMClass (para agrupar sob o mesmo iniciador no Unity)

20

Este é um exemplo específico de um problema genérico em que ainda não consegui encontrar uma solução.

Eu tenho um programa (Android Virtual Device Manager) que lança "sub-programas" (ou seja, emuladores ou dispositivos virtuais) de dentro de si mesmo (também pode ser iniciado a partir de outro lugar onde). Eu quero que qualquer instância de OURO desses programas seja agrupada sob o mesmo ícone do Unity.

Eu criei um arquivo .desktop para tentar realizar isso, mas não sei exatamente como fazer isso. O arquivo da área de trabalho é o seguinte:

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

Pelo que entendi, StartupWMClass é o que preciso definir para conseguir isso corretamente. Eu obtive os dois nomes de classe ('Android Virtual Device Manager' e 'emulator64-arm') usando xprop WM_CLASS nas janelas da repsetiva. Ambos funcionam individualmente (o ícone do lançador é corretamente anexado ao programa, não importa o modo como ele é iniciado), mas não consigo fazer com que ele funcione para ambos.

Estou assumindo que de alguma forma preciso definir dois valores para StartupWMClass , mas não consegui fazer isso corretamente (ou sei se é uma operação válida). Eu tentei, separados por dois pontos como variáveis ​​de ambiente, separados por vírgulas, citações, etc, e não consigo encontrar nenhuma dica no documentação oficial .

Alguma sugestão?

EDITAR:

Outro exemplo, mais pedante, mas provavelmente mais identificável, é com Matlab . Estou executando 2013a e a tela inicial que mostra inicialmente e o programa tem valores WM_CLASS completamente diferentes. Isso significa que, quando eu clico no meu lançador com StartupWMClass=com-mathworks-util-PostVMInit , a tela inicial aparece com um ícone diferente (padrão Desconhecido) Unity , enquanto o restante aparece agrupado sob o meu lançador.

Usando xprop WMCLASS e clicando primeiro na tela inicial, em seguida, repetindo com uma sessão Matlab ativa, recebo a seguinte saída 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"

Se eu pudesse especificar algo ao longo das linhas:

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

Isso funcionaria perfeitamente (como ambos funcionam separadamente), mas não tenho idéia da sintaxe, se ela existir. Eu apenas não sei que nada que tentei funcionou até agora.

Qualquer ajuda ou uma resposta definitiva de qualquer forma seria ótima, pois acredito que este é um elemento fundamental de um desktop que funcione bem.

    
por B T 29.01.2013 / 02:17

2 respostas

8

O mesmo problema para mim com o Starcraft II lançou o throw playonlinux. Existe primeiro um lançador de aplicativos:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") e depois o jogo em si:

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

Eu acho que o vinho está definindo a classe com o executável binário.

Eu dei uma olhada no código bamf (método bamf_matcher.c, insert_desktop_file_class_into_table ()):

  • Existe um mapa que faz a associação entre um arquivo da área de trabalho e uma e somente uma classe,
  • A chave StartupWMClass é lida com g_key_file_get_string () que não é projetado para retornar uma lista de strings,
  • g_key_file_get_string_list () poderia fazer isso, mas os desenvolvedores da bamf não projetaram a estrutura para poder associar várias classes a um único arquivo da área de trabalho.

No meu caso, eu trapaceio criando dois arquivos de área de trabalho com as mesmas chaves, mas StartupWMClass. Isso não é perfeito porque eu ainda tenho 2 ícones Uniy quando no lançador, mas o importante é que eu sei o porquê: -).

    
por gotrunk 12.05.2013 / 14:15
1

Eu sei que esta questão é muito velho, mas depois de passar pelo mesmo problema, eu acho que finalmente criou uma solução para este, e decidiu compartilhar com ninguém ter esse problema:

Como não podemos definir vários WMClasses para um único arquivo .desktop, por que não definir todas as janelas para um único WMClass?

Nós podemos fazer algo assim (Obviamente, substitua Window 1 , Window 2 e potatoes com seus nomes janelas e WMClass desejado):

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 no arquivo .desktop podemos fazer isso: StartupWMClass=potatoes

Tadam! Todas as janelas estão agrupadas agora.
Mas, ei, estamos fazendo isso manualmente toda vez que o programa é aberto? Claro que não.

Nós podemos apenas fazer um script bash que faça isso automaticamente a cada meio 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

E finalmente, defina o .sh que criamos para ser executado toda vez que o sistema operacional for iniciado:

Espero que minha resposta seja útil para qualquer pessoa que esteja navegando nesta pergunta.

    
por Misterio7 25.03.2016 / 17:15