Wie schließe ich alle Anwendungen in einem Arbeitsbereich?

7

Gibt es eine Gnome 3-Erweiterung oder eine Fedora 25-Verknüpfung, um alle geöffneten Anwendungen in einem Arbeitsbereich zu schließen? (Schließen Sie den Arbeitsbereich selbst, indem Sie beispielsweise ein X drücken.)

Ich habe diese Funktionalität vor langer Zeit irgendwo gesehen und vergessen, wo, aber sie ist standardmäßig nicht in Fedora verfügbar.

Lynob
quelle

Antworten:

3

Die folgende Antwort wurde auf Gnome3 / Ubuntu geschrieben und getestet. Bitte erwähnen Sie, wenn beim Ausführen auf Fedora / Gnome Probleme auftreten.


Skript zum Schließen aller Anwendungsfenster in einem bestimmten Arbeitsbereich in Gnome

Das folgende Skript schließt alle Fenster in einem bestimmten Arbeitsbereich mit zwei Optionen:

  1. Wenn es ohne Argumente ausgeführt wird, werden alle Fenster im aktuellen Arbeitsbereich geschlossen, z.

    python3 /path/to/script.py
    
  2. Wenn es mit einem bestimmten Arbeitsbereich als Argument ausgeführt wird, werden alle Fenster in diesem Arbeitsbereich geschlossen, z.

    python3 /path/to/script.py 0 
    

    schließt alle Anwendungen im Arbeitsbereich 1. Beachten Sie, dass der erste Arbeitsbereich den Index 0 hat

Das Skript

#!/usr/bin/env python3
import subprocess
import sys

arg = sys.argv[1:]

def check_close(w_id):
    w_data = get(["xprop", "-id", w_id])
    if "_NET_WM_WINDOW_TYPE_NORMAL" in w_data:
        subprocess.call(["wmctrl", "-ic", w])

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8")

wlist = [l.split() for l in get(["wmctrl", "-lG"]).splitlines()]

arg = arg[0] if arg else [
    l.split()[0] for l in get(["wmctrl", "-d"]).splitlines() if '*' in l
    ][0]

for w in [w[0] for w in wlist if w[1] == arg]:
    check_close(w)

Wie benutzt man

  1. Das Skript benötigt wmctrl , das installiert werden sollte, wenn es nicht auf Ihrem System vorhanden ist.
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter close_wins.py
  3. Testen Sie nun das Skript in einem Terminalfenster mit dem Zielarbeitsbereich als Argument, z. B.:

    python3 /path/to/close_wins.py 2
    

    um alle Fenster in Arbeitsbereich 3 ordnungsgemäß zu schließen (0 = Arbeitsbereich 1)

    Führen Sie es ohne Argumente aus, um alle Fenster im aktuellen Arbeitsbereich zu schließen :

    python3 /path/to/close_wins.py
    
  4. Wenn alles einwandfrei funktioniert, fügen Sie es einer Tastenkombination hinzu: Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Benutzerdefinierte Tastenkombinationen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

    python3 /path/to/close_wins.py
    

... oder führen Sie es auf eine andere Weise aus, die Sie bevorzugen.

Erläuterung

Der Befehl wmctrl -lG gibt uns Informationen zu den aktuell geöffneten Fenstern. Die Ausgabe sieht aus wie:

0x018000f9  0 135  206  650  500  jacob-System-Product-Name pscript_6.py (1,6 GB Volume /media/jacob/6C08-F637) - gedit
0x01600a09  1 283  275  724  443  jacob-System-Product-Name jacob@jacob-System-Product-Name: ~
0x018018be  1 152  407  650  500  jacob-System-Product-Name Untitled Document 1 - gedit
0x0140008c  2 0    101  1280 960  jacob-System-Product-Name gnome - Can I have a countdown window show the time until next suspend? - Ask Ubuntu - Mozilla Firefox
0x01600a49  2 47   146  724  443  jacob-System-Product-Name jacob@jacob-System-Product-Name: ~

In der zweiten Spalte können wir den Standort des Fensters abrufen:

0x0140008c  2 0    101  1280 960  jacob-System-Product-Name gnome - Can I have a countdown window show the time until next suspend? - Ask Ubuntu - Mozilla Firefox

Das 2bedeutet, dass sich das Fenster in Arbeitsbereich 3 befindet, da es 0sich auf den ersten Arbeitsbereich bezieht.

Wenn das Skript mit dem Arbeitsbereich als Argument ausgeführt wird , analysiert das Skript die entsprechenden Fenster-IDs und schließt sie anschließend ordnungsgemäß mit dem Befehl (z. B.):

wmctrl -ic 0x0140008c

Wenn das Skript ohne den Arbeitsbereich als Argument ausgeführt wird , ruft das Skript den aktuellen Arbeitsbereich aus dem Befehl ab:

wmctrl -d

und verwendet anschließend den aktuellen Arbeitsbereich intern als Argument.

Jacob Vlijm
quelle
Beachten Sie, dass dies in einer Wayland-Sitzung nicht funktioniert.
Mattdm
@mattdm Sie sind sich nicht sicher, welches OP verwendet wird, aber ist Gnome nicht auf X?
Jacob Vlijm
In Fedora 25 ist die Standard-GNOME-Sitzung auf Wayland mit X als Fallback.
Mattdm
1
@JacobVlijm nein nein es funktioniert super! Der aktuelle Arbeitsbereich ist 0, nicht 1, der zweite ist 1. Wenn ich also den zweiten Arbeitsbereich schließen möchte, habe script.py 1ich gerade bemerkt, dass nach dem Lesen der Ausgabe vonwmctrl -lG
Lynob
1
@ DanielAlder die Sprache ist Python, nicht so sehr Perl :)
Jacob Vlijm