Stellen Sie die Anzahl der Arbeitsbereiche automatisch ein. Fügen Sie entsprechend Ihren Anforderungen Spalten und Zeilen hinzu und entfernen Sie sie
Unterhalb einer Version eines Backround-Skripts, das automatisch Arbeitsbereiche hinzufügt, wenn Sie die letzte Spalte oder Zeile Ihrer Arbeitsbereichsmatrix eingegeben haben.
So funktioniert es:
Wenn Sie an der letzten Spalte oder Zeile ankommen, werden zusätzliche Ansichtsfenster hinzugefügt:
Wenn Ihre Arbeitsbereiche 5-10 Sekunden lang nicht verwendet werden und keine Fenster angezeigt werden, werden die zusätzlichen Arbeitsbereiche wieder entfernt. Sie behalten jedoch immer eine zusätzliche Zeile darunter und eine zusätzliche Spalte rechts von Ihrem aktuellen Ansichtsfenster:
Das Drehbuch:
#!/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)
Wie benutzt man
- Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es unter
add_space.py
Bearbeiten Sie im Kopfteil des Skripts die Zeilen, wenn Sie andere Einstellungen möchten (maximale Anzahl von Arbeitsbereichen, Standardmatrix, z. B. 2x2):
# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10
Teste es mit dem Befehl:
python3 /path/to/add_space.py
Wenn alles in Ordnung ist, 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.
Erläuterung
Die folgende Geschichte ist etwas kompliziert und erklärt eher das Konzept und die Vorgehensweise als die Codierung. Lesen Sie nur, wenn Sie interessiert sind.
Berechnung der benötigten Arbeitsbereiche (Beispielspalten)
Die Ausgabe von wmctrl -d
sieht so aus:
0 * DG: 3360x2100 VP: 1680,1050 WA: 65,24 1615x1026 N/A
Gibt in der Ausgabe an, VP: 1680,1050
wo sich der übergreifende Arbeitsbereich befindet (die Matrix aller Ansichtsfenster). Diese Information ist nur dann nützlich, wenn wir auch die Bildschirmauflösung haben, da zB 1680
die Breite von zwei (unwahrscheinlich, aber immer noch) oder ein Mal der Bildschirm sein könnte.
Zum Glück können wir die Bildschirmauflösung aus dem Befehl herausfiltern xrandr
.
Wenn wir dann wissen, dass die Größe des Bildschirms x ist 1680
und wir gerade eingeschaltet sind VP: 1680,1050
, wissen wir, dass wir uns in der zweiten Spalte der Matrix des Arbeitsbereichs befinden. 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 enthält (3360/1680), und wir sind auf der "letzten".
Das Skript sendet dann eine Anweisung zum Hinzufügen einer Spalte zur Matrix mit dem folgenden Befehl:
dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>
Das ist das Prinzip.
Berechnung der zu entfernenden Arbeitsbereiche (Beispielspalten)
Das Skript führt alle 10 Sekunden den folgenden Befehl aus, um alle aktuell geöffneten Fenster aufzulisten:
wmctrl -lG
Dies gibt uns auch Informationen über die Position des Fensters, die so aussehen:
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 bezieht sich jedoch auf den aktuellen Arbeitsbereich (linke Seite). Um die absolute Position des Fensters (x-weise) in der Arbeitsbereichsmatrix zu kennen, müssen wir die erste Nummer der aktuellen Ansichtsfensterinformationen hinzufügen (z. B. VP: 1680,1050
aus der Ausgabe von wmctrl -d
).
Lassen Sie uns jedoch aus Vereinfachungsgründen nehmen wir auf Ansichtsfenster sind 1,1
(topleft Ansichtsfenster), so dass die relative Position des Fensters gleich seiner absoluten Position.
Aufgrund der Bildschirmauflösung 1680
wissen wir, dass sich das Fenster in einer Spalte befindet 3425/1680
, die aufgerundet ist, da sich alles dazwischen 3360 and 5040
in derselben Spalte in der Matrix befindet (zwischen dem 3- und 4-fachen der Auflösung). Für die korrekte Berechnung verwenden wir math.ceil()
( python
)
Da das Skript auch die Regel anwendet, um rechts / unten immer einen zusätzlichen Arbeitsbereich zu haben, müssen wir die Anzahl der Spalten auf den höchsten Wert setzen von:
- die aktuelle Arbeitsbereichspalte + 1
- die letzte Spalte mit einem Fenster darauf
- Die Standardanzahl der Spalten, wie im Kopf des Skripts festgelegt
Und so macht das Drehbuch :)
Die Zeilen werden in genau derselben Prozedur verwaltet.