J'ai essayé d'utiliser la wmctrl
commande à bascule, mais cela n'a pas fonctionné sur ma configuration Ubuntu. La bascule serait activée, mais pas désactivée. (Je pense que c'est peut-être parce que j'utilise l'environnement de bureau gnome, sur lequel wmctrl
AFAIK est légèrement cassé).
Quoi qu'il en soit, après beaucoup de recherches et de travail pour écrire le bon code en bash, j'ai créé une seule commande qui utilise les wmctrl
commandes dans une couche de logique pour basculer efficacement l'état `` toujours au top '' sur le bureau GNOME actuel. J'ai posté cette réponse sur Ask Unix / Linux, mais j'ai pensé la publier ici aussi au cas où quelqu'un aurait le même problème.
Voici la commande:
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'
Il vérifie la propriété d'état de la fenêtre active "_NET_WM_STATE" en utilisant xprops
, et s'il contient le texte "AU-DESSUS" cela signifie que l'option 'toujours au sommet' est active. Ensuite, il exécute simplement la wmctrl
commande avec le paramètre add
ou remove
selon le cas.
Répartition des commandes (chaque commande est insérée dans la suivante, en remplacement de l' ■
espace réservé):
Obtenir l'ID de la fenêtre active:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Obtenez l'état de la fenêtre en xprop
utilisant l'id:
xprop -id $(■) _NET_WM_STATE
Vérifiez si l'état contient "AU-DESSUS", indiquant que la fenêtre est définie sur "toujours en haut":
[[ $(■) =~ "ABOVE" ]]
Renvoyer "supprimer" si vrai, sinon retourner "ajouter":
■ && echo "remove" || echo "add"
exécuter la wmctrl
commande en utilisant la valeur renvoyée comme paramètre:
wmctrl -r :ACTIVE: -b $(■),above
Envoyez le tout à bash
afin que vous puissiez utiliser la substitution de commandes ${ ... }
, l'évaluation booléenne bash [[ ... ]]
et l'opérateur de correspondance d'expression régulière =~
:
bash -c '■'
Cette dernière étape en particulier m'a mis très longtemps à comprendre. Jusqu'à ce que je réalise que les raccourcis clavier ne s'exécutaient pas dans bash par défaut, je ne savais pas pourquoi les commandes fonctionnaient dans la console pendant que je les testais mais échouaient silencieusement lorsqu'elles étaient exécutées directement en tant que raccourci clavier. Cela m'a fait monter le mur pendant des siècles!
Remarque: parce que vous avez besoin de guillemets autour de la commande que vous envoyez à bash, j'ai dû faire attention lors de l'écriture de la commande que je ne suis jamais allé plus d'un niveau de plus (en utilisant des guillemets doubles). Toute imbrication supplémentaire de chaînes entre guillemets aurait nécessité de nombreuses barres obliques inverses pour échapper aux guillemets.