Por que meu comando wmctrl -a não aumenta minha janela minimizada do Rhythmbox?

4

O problema

No momento, estou adicionando alguns atalhos personalizados.

Não consigo revelar uma janela minimizada do Rhythmbox. Eu uso wmctrl em um script de shell, veja abaixo, para esta tarefa. Quando pressiono a combinação de teclas, nada acontece (visualmente). Revelar o Firefox, por exemplo, usando uma versão adaptada do script de shell abaixo funciona sem problemas; por que o Rhythmbox não se comporta da mesma maneira?

Disse o script de shell:

sh -c "if pgrep -x rhythmbox > /dev/null; then wmctrl -a rhythmbox; else rhythmbox; fi"

Edição importante:

Aparentemente meu script funciona agora - sem ter alterado nada sobre isso. No entanto, eu corri killall rhythmbox . Depois disso, meu script de shell funcionou como esperado. Acho que apenas adicionando a correção em vez de excluir a pergunta, talvez eu possa ajudar alguém a tropeçar no mesmo problema. Se você acha que sabe por que isso aconteceu, sinta-se à vontade para compartilhar seu conteúdo.

Ainda outra edição:

Uau, ok ... Literalmente segundos depois de adicionar essa última edição, eu tentei usar o atalho novamente e não funcionou. Eu matei o processo e tudo funcionou novamente - o then AND o else body. Depois de clicar e sair de algumas outras janelas, ele parou de funcionar novamente. Depois que eu executei killall rhythmbox e o vi funcionar novamente perfeitamente, mesmo depois de não conseguir reproduzir o erro, cheguei à conclusão de que ele está agindo de forma aleatória. Bem, pseudoaleatório, claro. Se você quiser experimentar por si mesmo, você sabe como fazê-lo. Você pode obter o wmctrl executando sudo apt install wmctrl . Eu estou usando a versão 1.07 dele no Ubuntu 16.04 LTS e muito confuso.

Última edição (nunca diga a última):

Eu realmente fiz o Firefox se revelar agora ao pressionar a combinação de teclas. Isso é legal, só não é o que eu quero. Eu vou beber uma xícara de café agora e fazer outra coisa, nossa.

    
por Reum12 06.02.2017 / 12:07

1 resposta

2

O problema: o rhythmbox está mudando o nome da janela

O problema é que você está identificando a janela pelo nome , usando wmctrl -a . De man wmctrl :

-a <WIN>
    Switch to the desktop containing the window <WIN>, raise the window, and give it focus. 

<WIN> é uma cadeia de identificação no nome da janela.

Especialmente no seu caso, isso pode causar erros, já que o Rhythmbox altera o nome da janela, dependendo da música. Você precisa identificar a janela por sua janela classe ou seu id

O último pode ser feito usando:

wmctrl -ia

em que a opção -i significa id da janela:

   -i     Interpret window arguments (<WIN>) as  a  numeric  value  rather
          than  a  string name for the window. If the numeric value starts
          with the prefix '0x' it is assumed to be a hexadecimal number.

Tanto o id da janela quanto o pid a que uma janela pertence podem ser recuperados da lista de janelas, chamada pelo comando:

wmctrl -lp 

Um comando confiável para levantar a janela mais recente de, e. Rhythmbox então é:

wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

Explicação:

wmctrl -lp

lista todas as janelas, incluindo seus pids. Uma propriedade importante do comando é que ele lista as janelas na ordem em que foram criadas .

Portanto:

wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }'

irá:

  • liste todos os windows + pids aos quais eles pertencem:

    wmctrl -lp
    
  • encontre os que pertencem ao rhythmbox:

    grep "$(pgrep rhythmbox)"
    
  • encontre o último (que também é o último criado):

    tail -1
    
  • extraia a primeira string na linha (que é a janela -id):

    awk '{ print $1 }'
    

O comando:

wmctrl -ia

irá então levantar a janela mais recente do Rhythmbox pelo seu id.

Script

Por motivos de conveniência, e para evitar problemas com citações, eu faria um script minúsculo com o comando e executaria a partir de um atalho:

#!/bin/bash
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep rhythmbox)" | tail -1 | awk '{ print $1 }')"

Torne-o executável e adicione a tecla de atalho: escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:

/path/to/script.sh

Além disso

Parece que você está usando o comando / script para vários aplicativos. Em vez de criar scripts separados para cada aplicativo, você pode fazer o argumento do aplicativo para o script:

#!/bin/bash
app=$(pgrep $1)
wmctrl -ia "$(wmctrl -lp | grep "$app" | tail -1 | awk '{ print $1 }')"

Então

 /path/to/script.sh gedit

aumentará a janela gedit criada mais recentemente, enquanto

/path/to/script.sh rhythmbox

aumentará a janela rhythmbox criada mais recentemente e assim por diante.

    
por Jacob Vlijm 06.02.2017 / 13:08