Tentei usar o wmctrl
comando toggle, mas não funcionou na minha configuração do Ubuntu. A alternância ativaria, mas não desativaria. (Eu acho que pode ser porque estou usando o ambiente de área de trabalho gnome, no qual wmctrl
está um AFAIK levemente quebrado).
De qualquer forma, depois de muita pesquisa e elaboração de como escrever código adequado no bash, criei um único comando que usa os wmctrl
comandos dentro de uma camada de lógica para alternar o estado 'sempre no topo' efetivamente na área de trabalho atual do GNOME. Publiquei esta resposta no Ask Unix / Linux, mas pensei em publicá-la aqui também, caso alguém tivesse o mesmo problema.
Aqui está o comando:
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 "ACIMA" que significa que a opção 'sempre no topo' está ativa. Depois, basta executar o wmctrl
comando com o parâmetro add
ou remove
conforme apropriado.
Divisão de comando (cada comando é inserido no próximo, substituindo o ■
espaço reservado):
Obter ID da janela ativa:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Obtenha o estado da janela xprop
usando o ID:
xprop -id $(■) _NET_WM_STATE
Verifique se o estado contém "ACIMA", indicando que a janela está definida como "sempre no topo":
[[ $(■) =~ "ABOVE" ]]
Retorne "remove" se verdadeiro, caso contrário, retorne "add":
■ && echo "remove" || echo "add"
execute o wmctrl
comando usando o valor retornado como parâmetro:
wmctrl -r :ACTIVE: -b $(■),above
Envie tudo para, bash
para que você possa usar a substituição de comandos ${ ... }
, 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é que eu percebi que os atalhos de teclado não estavam sendo executados no bash por padrão, eu não fazia ideia do porquê dos comandos estarem funcionando no console enquanto eu os estava testando, mas silenciosamente falhando quando executados diretamente como um atalho de teclado. Isso me levou à parede por séculos!
Nota: porque você precisa de aspas ao redor do comando que está enviando para o bash, tive que ter cuidado ao escrever o comando, para nunca mais do que um nível a mais (usando aspas duplas). Qualquer aninhamento adicional de seqüências de caracteres entre aspas exigiria muitas barras invertidas confusas para escapar das aspas.