GNOME 3-Tastaturkürzel „Immer im Vordergrund“ lässt sich nicht deaktivieren

GNOME 3-Tastaturkürzel „Immer im Vordergrund“ lässt sich nicht deaktivieren

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 wmctrlBefehl mit dem Parameter addoder removeentsprechend 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, bashdamit 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.

verwandte Informationen