Wie kann ich Arbeitsbereiche nur dann automatisch hinzufügen, wenn ich sie benötige?

16

Angenommen, ich verwende 4 Arbeitsbereiche und benötige im Übrigen mehr. Gibt es einen automatisierten Prozess oder, falls nicht möglich, eine einfache Möglichkeit, im Übrigen mehr Arbeitsbereiche hinzuzufügen (anstatt zu installieren Ubuntu tweakusw. usw.) ?

kernel_panic
quelle
@JacobVlijm imgur.com/LaDYwGb Upvoted and Accepted, danke für die wirklich nette Antwort
kernel_panic
Verwandte Themen : In diesem alten Beitrag wurde gefragt, wie weitere Arbeitsbereiche automatisch erstellt / entfernt werden sollen. mit zwei verschiedenen Antworten. Andererseits sind die älteren Antworten im Vergleich zu den neueren Antworten hier wahrscheinlich weniger zufrieden.
Clearkimura

Antworten:

14

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:

  1. Wenn Sie an der letzten Spalte oder Zeile ankommen, werden zusätzliche Ansichtsfenster hinzugefügt:

    Bildbeschreibung hier eingeben

  2. 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:

    Bildbeschreibung hier eingeben

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

  1. Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es unter add_space.py
  2. 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
    
  3. Teste es mit dem Befehl:

    python3 /path/to/add_space.py
    
  4. 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 -dsieht so aus:

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

Gibt in der Ausgabe an, VP: 1680,1050wo 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 1680die 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 1680und 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: 3360x2100auch aus der Ausgabe von wmctrl -d), wissen wir, dass die aktuelle Matrix zwei Spalten enthält (3360/1680), und wir sind auf der "letzten".

Bildbeschreibung hier eingeben

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 3425ist 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,1050aus 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 1680wissen wir, dass sich das Fenster in einer Spalte befindet 3425/1680, die aufgerundet ist, da sich alles dazwischen 3360 and 5040in 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.

Jacob Vlijm
quelle
1
Wow, tolle Antwort, bereits upvoted =)
AB
@AB Danke! :) Dies ist die Art von Sachen, die ich gerne mache :)
Jacob Vlijm
2
@kernel_panic Wow, danke :) Ich denke tatsächlich darüber nach, es zu einem ppa zu machen, wie dieses: askubuntu.com/a/608295/72216 und dieses: askubuntu.com/a/560734/72216, endlich (in Zukunft) Zusammenführen aller drei zu einer "workspace_tools" -Anwendung, in der sie als Optionen oder ähnliches festgelegt werden können :).
Jacob Vlijm
1
@JacobVlijm Ich würde die alte Antwort aus Gründen der Kürze von hier streichen: Sie wird in der Bearbeitungshistorie weiterhin für diejenigen sichtbar sein, die interessiert sind ...
Fabby
1
Gern geschehen ... Du solltest öfter im Chatroom vorbeischauen und Tox spielen! : P
Fabby
6

Technisch gibt es keine Verknüpfung zum Ändern der Größe von Arbeitsbereichen, aber Sie können den einfachen Skript-Balg verwenden und ihn an eine Verknüpfung binden.

  1. Nehmen Sie das Skript unten, speichern Sie es in der .local/share/applications Ordner oder wo immer Sie möchten.
  2. Stellen Sie sicher, dass das Skript mit ausführbar gemacht wird chmod 755 /path/to/script
  3. Binden Sie es an eine Verknüpfung in den Systemeinstellungen -> Tastatur -> Verknüpfungen -> Benutzerdefinierte Verknüpfungen

Zum Beispiel habe ich dieses Setup:

Bildbeschreibung hier eingeben

Das Skript ist gebunden an ShiftCtrlAltI. Könnte CtrlAltIaber auch funktionieren. Ich gebe den vollständigen Pfad zum Skript an

/home/xieerqi/resize-workspaces.sh

Und so sollte es aussehen:

Bildbeschreibung hier eingeben

Skript

#!/bin/bash
# Author : Serg Kolo
# Date: Sept 19, 2015
# Purpose: simple script to resize 
# unity workspaces
# Written for: http://askubuntu.com/q/676046/295286

HEIGHT=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize)
WIDTH=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize)
NEWSIZE=$(zenity --entry --text="Current desktop set-up $HEIGHT x $WIDTH. Enter new setup in HEIGHTxWIDTH format"  --width=250 | tr 'x' ' ' )

ARRAY=( $NEWSIZE )
[ -z ${ARRAY[1]}  ] && exit
    gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize ${ARRAY[0]}
    gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize ${ARRAY[1]}

Sehr einfach zu bedienen, sehr einfach einzurichten

Sergiy Kolodyazhnyy
quelle