Este não é um grande problema, mas é um pouco chato e, acima de tudo, intrigante. Eu executo uma máquina estável Debian 9 com Xfce 4.12 por um tempo e estou configurando um desktop GNOME em paralelo para testá-lo.
No Xfce, tenho um atalho de teclado personalizado wmctrl -r :ACTIVE: -b toggle,above
que funciona para alternar as janelas em foco na parte superior e no mesmo nível das outras.
Eu tentei o mesmo no GNOME 3.22 em System settings / Keyboard , só consigo alternar a janela em foco sobre outras, mas não a alterna de volta para o mesmo nível das outras janelas. Tenho que clicar com o botão direito na moldura da janela e desmarcar a opção "Sempre visível".
Alguém tem alguma ideia de por que isso pode acontecer?
Responder1
Percebi isso também em abril de 2016, minha solução alternativa é usar 2 teclas para alternar, por exemplo:
wmctrl -r :ACTIVE: -b add,above
wmctrl -r :ACTIVE: -b remove,above
Responder2
Bem, depois de muita pesquisa e de descobrir como escrever código adequado no bash, criei um único comando que usa os comandos wmctrl dentro de uma camada de lógica para alternar efetivamente o estado 'sempre no topo' na área de trabalho GNOME atual! Contemplar:
bash -c 'wmctrl -r :ACTIVE: -b $([[ $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") _NET_WM_STATE) =~ "ABOVE" ]] && echo "remove" || echo "add"),above'
Ele verifica a propriedade de estado da janela ativa "_NET_WM_STATE" usando xprops
e, se contiver o texto "ABOVE", significa que a opção 'sempre visível' está ativa. Depois é só executar o wmctrl
comando com o parâmetro add
ou remove
conforme apropriado.
Divisão de comandos (cada comando é inserido no próximo, substituindo o ■
espaço reservado):
Obtenha o ID da janela ativa:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Obtenha o estado da janela do xprop usando o id:
xprop -id $(■) _NET_WM_STATE
Verifique se o estado contém 'ABOVE', indicando que a janela está definida como 'sempre visível':
[[ $(■) =~ "ABOVE" ]]
Retorne "remove" se for verdadeiro, caso contrário retorne "add":
■ && echo "remove" || echo "add"
execute o comando wmctrl usando o valor retornado como parâmetro
wmctrl -r :ACTIVE: -b $(■),above
Envie tudo para
bash
que você possa usar a substituição de comando${ ... }
, a avaliação booleana do bash[[ ... ]]
e o operador de correspondência regex=~
bash -c '■'
Este último passo em particular levou muito tempo para descobrir. Até perceber que os atalhos de teclado não estavam sendo executados no bash por padrão, eu não tinha ideia de por que os comandos estavam funcionando no console enquanto os testava, mas falhavam silenciosamente quando executados diretamente como um atalho de teclado. Isso me deixou louco por muito tempo!
Nota: como você precisa de aspas em torno do comando que está enviando para o bash, tive que ter cuidado ao escrever o comando para nunca ter mais de um nível de profundidade (usando aspas duplas). Qualquer aninhamento adicional de strings entre aspas exigiria muitas barras invertidas confusas para escapar das aspas.