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

20

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

Eu tenho um programa (Android Virtual Device Manager) que inicia 'subprogramas' (emuladores ou dispositivos virtuais) de dentro de si (também pode ser iniciado de outro lugar). Quero que quaisquer instâncias desses programas sejam agrupadas no mesmo ícone do Unity.

Eu criei um .desktoparquivo para tentar fazer isso, mas não sei exatamente como fazê-lo. 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_CLASSnas janelas repsectivas. Ambos funcionam individualmente (o ícone do iniciador está corretamente anexado ao programa, não importa como ele é iniciado), mas não consigo fazê-lo funcionar para ambos.

Estou assumindo que, de alguma forma, preciso definir dois valores para, StartupWMClassmas não consegui fazê-lo corretamente (ou saber se é uma operação válida). Eu tentei, separados por dois pontos como variáveis ​​de ambiente, separados por vírgula, aspas, etc. e não consigo encontrar nenhuma dica na documentação oficial .

Alguma sugestão?

EDITAR:

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

Usando xprop WMCLASSe clicando primeiro na tela inicial, e depois repetindo com uma Matlabsessão ativa , obtenho a seguinte saída do 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 de:

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

Isso funcionaria perfeitamente (pois ambos funcionam separadamente), mas eu não tenho idéia da sintaxe, se é que ela existe. Só sei que nada do que tentei funcionou até agora.

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

BT
fonte
11
Você seria capaz de obter algumas dicas das gavetas ?
11
Eu vi os vídeos Drawersdesse link e, pelo que eles mostram, ele simplesmente agrupa os links. Quando você clica em qualquer subitem, ele ainda é criado com seu próprio ícone no Unityiniciador, que é o que estou tentando parar
BT

Respostas:

8

Mesmo problema para mim com Starcraft II lançado jogar playonlinux. Primeiro, o iniciador de aplicativos:

  • (WM_CLASS(STRING) = "Blizzard Launcher.exe", "Wine") e então o próprio jogo:

  • (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 ()):

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

No meu caso, trapaceio criando 2 arquivos da área de trabalho com as mesmas chaves, mas com o StartupWMClass. Isso não é perfeito porque ainda tenho 2 ícones Uniy no iniciador, mas o importante é que sei por que :-).

embaraçado
fonte
Isso parece muito promissor, eu tenho uma pergunta para tentar obter a confirmação a partir deles, mas ainda sem resposta até o momento ...
BT
11
Esta não é uma resposta. A resposta é "você não pode" porque a especificação do arquivo da área de trabalho transforma esse valor em uma única string e não em uma lista de strings (é por isso que o bamfdaemon usa get_string () e não get_string_list () para esse valor).
Dobey
1

Eu sei que essa pergunta é muito antiga, mas depois de passar pelo mesmo problema, acho que finalmente criei uma solução alternativa para isso e decidi compartilhar com qualquer pessoa com esse problema:

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

Nós podemos fazer algo assim (Obviamente, substituir Window 1, Window 2e potatoescom 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 o seguinte: 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.

Podemos apenas criar 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 executar sempre que o sistema operacional for inicializado: Captura de tela

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

Misterio
fonte