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.