Das ist kein großes Problem, aber ein wenig ärgerlich und vor allem faszinierend. Ich betreibe seit einiger Zeit eine stabile Debian-9-Maschine mit Xfce 4.12 und richte parallel dazu einen GNOME-Desktop ein, um es auszuprobieren.
Unter Xfce habe ich eine benutzerdefinierte Tastenkombination wmctrl -r :ACTIVE: -b toggle,above
, die seit jeher funktioniert, um fokussierte Fenster nach oben und auf die gleiche Ebene wie andere zu schalten.
Ich habe dasselbe unter GNOME 3.22 in den Systemeinstellungen / Tastatur versucht. Ich kann das fokussierte Fenster nur über andere legen, es lässt sich aber nicht auf dieselbe Ebene wie andere Fenster zurücklegen. Ich muss mit der rechten Maustaste auf den Fensterrahmen klicken und die Option „Immer im Vordergrund“ deaktivieren.
Hat jemand eine Idee, warum das passieren könnte?
Antwort1
Das ist mir im April 2016 auch aufgefallen. Meine Problemumgehung besteht darin, zum Umschalten zwei Tasten zu verwenden, z. B.:
wmctrl -r :ACTIVE: -b add,above
wmctrl -r :ACTIVE: -b remove,above
Antwort2
Nun, nach viel Recherche und dem Ausarbeiten, wie man richtigen Code in Bash schreibt, habe ich einen einzelnen Befehl erstellt, der die wmctrl-Befehle innerhalb einer Logikebene verwendet, um den Status „immer im Vordergrund“ auf dem aktuellen GNOME-Desktop effektiv umzuschalten! Siehe da:
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'
Es prüft die aktive Fensterstatuseigenschaft „_NET_WM_STATE“ mithilfe von xprops
, und wenn sie den Text „ABOVE“ enthält, bedeutet dies, dass die Option „immer im Vordergrund“ aktiviert ist. Dann führt es einfach den wmctrl
Befehl mit dem Parameter add
oder remove
entsprechend aus.
Befehlsaufschlüsselung (jeder Befehl wird in den nächsten eingefügt und ersetzt den ■
Platzhalter):
Aktive Fenster-ID abrufen:
xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}"
Holen Sie sich den Fensterstatus von xprop mithilfe der ID:
xprop -id $(■) _NET_WM_STATE
Überprüfen Sie, ob der Status „OBEN“ enthält, was darauf hinweist, dass das Fenster auf „immer im Vordergrund“ eingestellt ist:
[[ $(■) =~ "ABOVE" ]]
Gibt „remove“ zurück, wenn wahr, andernfalls „add“:
■ && echo "remove" || echo "add"
Führen Sie den Befehl wmctrl mit dem zurückgegebenen Wert als Parameter aus.
wmctrl -r :ACTIVE: -b $(■),above
Senden Sie das Ganze an,
bash
damit Sie Befehlssubstitution${ ... }
, Bash-Boolesche Auswertung[[ ... ]]
und den Regex-Match-Operator verwenden können.=~
bash -c '■'
Insbesondere dieser letzte Schritt hat sehr lange gedauert, bis ich ihn herausgefunden hatte. Bis ich merkte, dass die Tastaturkürzel standardmäßig nicht in Bash ausgeführt wurden, hatte ich keine Ahnung, warum die Befehle in der Konsole funktionierten, als ich sie testete, aber stillschweigend fehlschlugen, wenn sie direkt als Tastaturkürzel ausgeführt wurden. Das hat mich ewig in den Wahnsinn getrieben!
Hinweis: Da Sie den Befehl, den Sie an Bash senden, in Anführungszeichen setzen müssen, musste ich beim Schreiben des Befehls darauf achten, dass ich nie mehr als eine Ebene tiefer gehe (mit doppelten Anführungszeichen). Jede weitere Verschachtelung von Zeichenfolgen in Anführungszeichen hätte viele verwirrende Backslashes erfordert, um die Anführungszeichen zu umgehen.