GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Wie füge ich Arbeitsbereiche automatisch hinzu, nur wenn ich sie brauche?

Angenommen, ich verwende 4 Arbeitsbereiche und benötige übrigens mehr, gibt es einen automatisierten Prozess oder, falls dies nicht möglich ist, eine einfache Möglichkeit, weitere Arbeitsbereiche hinzuzufügen (anstatt Ubuntu tweak zu installieren). usw. usw.).

Akzeptierte Antwort:

Automatisch die Anzahl der Arbeitsbereiche festlegen; je nach Bedarf Spalten und Zeilen hinzufügen und entfernen

Unten eine Version eines (des) Hintergrundskripts, das automatisch Arbeitsbereiche hinzufügt, wenn Sie die letzte Spalte oder Zeile Ihrer Arbeitsbereichsmatrix eingegeben haben.

So funktioniert es:

  1. Wenn Sie die letzte Spalte oder Zeile erreichen, werden zusätzliche Ansichtsfenster hinzugefügt:

  2. Wenn Ihre Arbeitsbereiche 5-10 Sekunden lang nicht verwendet werden und Befinden sich keine Fenster darauf, werden die zusätzlichen Arbeitsbereiche wieder entfernt. Sie behalten jedoch immer eine zusätzliche Zeile unterhalb und eine zusätzliche Spalte rechts von Ihrem aktuellen Darstellungsbereich:

Das Skript:

#!/usr/bin/env python3
import subprocess
import time
import math

# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10

def set_workspaces(size, axis):
    subprocess.Popen([
        "dconf", "write", "/org/compiz/profiles/unity/plugins/core/"+axis,
                str(size)
                ])

def get_res():
    resdata = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    curr = resdata.index("current")
    return (int(resdata[curr+1]), int(resdata[curr+3].replace(",", "")))

def wspace():
    try:
        sp = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
        return ([int(n) for n in sp[3].split("x")],
                [int(n) for n in sp[5].split(",")])

    except subprocess.CalledProcessError:
        pass


def clean_up(curr_col, curr_row):
    try:
        w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
        xpos = max([math.ceil((int(w[2])+span[1][0])/res[0]) for w in w_list])
        min_x = max(xpos, curr_col+1, hsize)
        if xpos >= hsize:
            set_workspaces(min_x, "hsize")
        else:
            set_workspaces(min_x, "hsize")
        ypos = max([math.ceil((int(w[3])+span[1][1])/res[1]) for w in w_list])
        min_y = max(ypos, curr_row+1, vsize)
        if ypos >= vsize:
            set_workspaces(min_y, "vsize")
        else:
            set_workspaces(min_y, "vsize")
    except subprocess.CalledProcessError:
        pass

res = get_res()
t = 0

while True:
    span = wspace()
    if span != None:
        cols = int(span[0][0]/res[0]); rows = int(span[0][1]/res[1])
        currcol = int((span[1][0]+res[0])/res[0])
        if all([currcol == cols, cols*rows < max_ws]):
            set_workspaces(cols+1, "hsize")
        currrow = int((span[1][1]+res[1])/res[1])
        if all([currrow == rows, cols*rows < max_ws]):
            set_workspaces(rows+1, "vsize")
        if t == 10:
            clean_up(currcol, currrow)
            t = 0
        else:
            t = t+1
        time.sleep(1)

Verwendung

  1. Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es als add_space.py
  2. Bearbeiten Sie im Kopfbereich des Skripts die Zeilen, wenn Sie andere Einstellungen wünschen (maximale Anzahl von Arbeitsbereichen, Standardmatrix z. B. 2×2):

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Testen Sie es mit dem Befehl:

    python3 /path/to/add_space.py
    
  4. Wenn alles funktioniert, fügen Sie es Ihren Startanwendungen hinzu:Dash> Startanwendungen> Fügen Sie den Befehl hinzu:

    /bin/bash -c "sleep 15 &&  python3 /path/to/add_space.py`
    

Hinweis

Wie immer ist das Skript extrem „saftarm“ und belastet Ihren Prozessor nicht merklich.

Erklärung

Die folgende Geschichte ist etwas kompliziert und hauptsächlich eine Erklärung des Konzepts und das Verfahren , und nicht die Codierung. Nur bei Interesse lesen.

So berechnen Sie die benötigten Arbeitsbereiche (Beispielspalten)

Die Ausgabe von wmctrl -d sieht so aus:

0  * DG: 3360x2100  VP: 1680,1050  WA: 65,24 1615x1026  N/A

In der Ausgabe VP: 1680,1050 gibt uns Auskunft darüber, wo wir uns auf dem Spanning Workspace (der Matrix aller Viewports) befinden. Diese Information ist nur sinnvoll, wenn uns auch die Auflösung des Bildschirms bekannt ist, da z.B. 1680 könnte die Breite von zwei (unwahrscheinlich, aber immer noch) oder einem Mal des Bildschirms sein.
Glücklicherweise können wir die Auflösung des Bildschirms aus dem Befehl xrandr herauslesen .

Dann, wenn wir wissen, dass die X-Größe des Bildschirms 1680 ist und wir sind derzeit auf VP: 1680,1050 , wissen wir, dass wir uns in der zweiten Spalte befinden in der Matrix des Arbeitsbereichs. Da wir auch die Größe der Gesamtmatrix kennen (DG: 3360x2100 , auch aus der Ausgabe von wmctrl -d ), wissen wir, dass die aktuelle Matrix zwei Spalten (3360/1680) enthält, und wir befinden uns auf der „letzten“.

Siehe auch:Linux – Wie füge ich Boot-Parameter zum Kernel mit bcfg aus der EFI-Shell hinzu?

Das Skript sendet dann eine Anweisung zum Hinzufügen einer Spalte zur Matrix durch den Befehl:

dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>

Das ist das Prinzip.

So berechnen Sie die zu entfernenden Arbeitsbereiche (Beispielspalten)

Einmal alle 10 Sekunden führt das Skript den Befehl aus, um alle derzeit geöffneten Fenster aufzulisten, mit dem Befehl:

wmctrl -lG

Dies gibt uns auch Informationen über die Position des Fensters und sieht so aus:

0x04604837  0 3425 24   1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit

In der Ausgabe 3425 ist die x-Position des Fensters. Diese Zahl ist jedoch relativ zum aktuellen Arbeitsbereich (linke Seite). Um die absolute Position des Fensters (in x-Richtung) in der Workspace-Matrix zu erfahren, müssen wir die erste Zahl der aktuellen Viewport-Informationen hinzufügen (z. B. VP: 1680,1050 , aus der Ausgabe von wmctrl -d ).
Nehmen wir jedoch der Einfachheit halber an, wir befinden uns im Ansichtsfenster 1,1 (Ansichtsfenster oben links), sodass die relative Position des Fensters gleich ist seine absolute Position.

Da die Bildschirmauflösung 1680 ist , wissen wir, dass sich das Fenster in Spalte 3425/1680 befindet , aufgerundet, da alles zwischen 3360 and 5040 befindet sich in der Matrix in derselben Spalte (zwischen 3- und 4-facher Auflösung). Für die richtige Berechnung verwenden wir math.ceil() (python )

Da das Skript auch praktiziert, immer einen zusätzlichen Arbeitsbereich rechts/unten zu haben, müssen wir die Anzahl der Spalten auf die höchste setzen Wert von:

  • die aktuelle Arbeitsbereichsspalte + 1
  • der letzte Spalte mit einem Fenster darauf
  • die Standardanzahl von Spalten, wie im Kopf des Skripts festgelegt

Und das tut das Skript auch 🙂

Die Zeilen werden genauso verwaltet.


Ubuntu
  1. So fügen Sie eine Auslagerungsdatei unter Ubuntu hinzu

  2. So fügen Sie einen Drucker in Ubuntu 11.10 hinzu | Drucker in Ubuntu hinzufügen

  3. So fügen Sie ein Yum-Repository hinzu

  4. Wie werden Programme in bestimmten Arbeitsbereichen beim Start automatisch gestartet?

  5. Wie füge ich Ppa-Repositories hinzu?

So fügen Sie Ubuntu einen Drucker hinzu

So fügen Sie einen MX-Eintrag in cPanel hinzu

Wie füge ich mehrere Arbeitsbereiche in Unity 2d hinzu?

Wie wird die Swap-Partition automatisch gemountet?

Wie füge ich eine neue Domain nur für E-Mails hinzu?

So fügen Sie Benutzer zu Sudoers auf Ubuntu 22.04 hinzu