Tentei usar o wmctrlcomando 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 wmctrlestá 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 wmctrlcomandos 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 xpropse se contiver o texto "ACIMA" que significa que a opção 'sempre no topo' está ativa. Depois, basta executar o wmctrlcomando com o parâmetro addou removeconforme 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 xpropusando 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 wmctrlcomando usando o valor retornado como parâmetro:
wmctrl -r :ACTIVE: -b $(■),above
Envie tudo para, bashpara 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.