Jak mogę automatycznie dodawać obszary robocze, tylko jeśli ich potrzebuję?

16

Załóżmy, że korzystam z 4 obszarów roboczych i przypadkowo potrzebuję więcej, czy istnieje zautomatyzowany proces lub, jeśli to niemożliwe, łatwy sposób, aby przypadkowo dodać więcej obszarów roboczych (zamiast instalować Ubuntu tweakitp.).

kernel_panic
źródło
@JacobVlijm imgur.com/LaDYwGb Pozytywne i zaakceptowane, dzięki za naprawdę miłą odpowiedź
kernel_panic
Powiązane: W tym starym poście zapytano „Jak automatycznie tworzyć / usuwać więcej obszarów roboczych?” z dwiema różnymi odpowiedziami. Z drugiej strony starsze odpowiedzi są prawdopodobnie mniej zadowolone w porównaniu z nowszymi odpowiedziami tutaj.
clearkimura,

Odpowiedzi:

14

Automatycznie ustaw liczbę obszarów roboczych; dodawaj i usuwaj kolumny i wiersze, w zależności od potrzeb

Poniżej wersji backround skryptu, który automatycznie doda obszary robocze, jeśli wprowadzisz ostatnią kolumnę lub wiersz matrycy obszaru roboczego.

Tak to działa:

  1. Jeśli dojdziesz do ostatniej kolumny lub wiersza, zostaną dodane dodatkowe rzutnie:

    wprowadź opis zdjęcia tutaj

  2. Jeśli przestrzenie robocze są nieużywane przez 5-10 sekund i nie ma w nich okien, dodatkowe przestrzenie robocze zostaną ponownie usunięte. Zawsze jednak będziesz mieć jeden dodatkowy wiersz poniżej i jedną dodatkową kolumnę po prawej stronie bieżącego widoku:

    wprowadź opis zdjęcia tutaj

Scenariusz:

#!/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)

Jak używać

  1. Skopiuj poniższy skrypt do pustego pliku i zapisz go jako add_space.py
  2. W sekcji nagłówka skryptu edytuj linie, jeśli chcesz inne ustawienia (maksymalna liczba obszarów roboczych, domyślna macierz, np. 2x2):

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Przetestuj - uruchom komendę:

    python3 /path/to/add_space.py
    
  4. Jeśli wszystko działa poprawnie, dodaj go do aplikacji startowych: Dash> Aplikacje startowe> Dodaj polecenie:

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

Uwaga

Jak zawsze skrypt ma bardzo niski poziom soku i nie dodaje zauważalnego obciążenia procesorowi.

Wyjaśnienie

Poniższa historia jest nieco skomplikowana i zawiera głównie wyjaśnienie koncepcji i procedury , a nie kodowania. Czytaj tylko, jeśli jesteś zainteresowany.

Jak obliczyć potrzebne obszary robocze (przykładowe kolumny)

Wyjście wmctrl -dwygląda następująco:

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

W wyniku VP: 1680,1050daje nam informacje o tym, gdzie jesteśmy w rozpiętym obszarze roboczym (macierz wszystkich rzutni). Ta informacja jest przydatna tylko wtedy, gdy mamy również rozdzielczość ekranu, ponieważ np. 1680Może to być szerokość dwóch (mało prawdopodobne, ale nadal) lub jeden raz ekranu.
Na szczęście możemy odczytać rozdzielczość ekranu z polecenia xrandr.

Następnie, jeśli wiemy, że rozmiar x ekranu jest 1680i obecnie jesteśmy włączeni VP: 1680,1050, wiemy, że jesteśmy w drugiej kolumnie macierzy obszaru roboczego. Ponieważ znamy również rozmiar macierzy całkowitej ( DG: 3360x2100również z danych wyjściowych wmctrl -d), wiemy, że bieżąca macierz zawiera dwie kolumny (3360/1680) i jesteśmy na „ostatniej”.

wprowadź opis zdjęcia tutaj

Skrypt wyśle ​​następnie instrukcję dodania kolumny do macierzy za pomocą polecenia:

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

To jest zasada.

Jak obliczyć obszary robocze do usunięcia (przykładowe kolumny)

Raz na 10 sekund skrypt uruchamia polecenie, aby wyświetlić listę wszystkich aktualnie otwartych okien, za pomocą polecenia:

wmctrl -lG

Daje nam to również informacje o położeniu okna, wyglądając następująco:

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

Na wyjściu 3425znajduje się pozycja x okna. Liczba ta dotyczy jednak bieżącego obszaru roboczego (lewa strona). Aby poznać bezwzględną pozycję okna (x-mądro) w macierzy obszaru roboczego, musimy dodać pierwszą liczbę bieżących informacji o rzutni (np. VP: 1680,1050Z danych wyjściowych wmctrl -d).
Załóżmy jednak, ze względów uproszczenia, załóżmy, że jesteśmy w rzutni 1,1(rzutnia w lewym górnym rogu), więc względna pozycja okna jest równa jego pozycji bezwzględnej.

Ponieważ rozdzielczość ekranu wynosi 1680, wiemy, że okno jest 3425/1680zaokrąglone w kolumnie , ponieważ wszystko pomiędzy 3360 and 5040znajduje się w tej samej kolumnie w matrycy (między 3 a 4-krotnością rozdzielczości). Do poprawnych obliczeń używamy math.ceil()( python)

Ponieważ skrypt stosuje również regułę, aby zawsze mieć dodatkowy obszar roboczy po prawej / poniżej, musimy ustawić liczbę kolumn na najwyższą wartość:

  • prąd kolumna roboczy + 1
  • ostatnia kolumna z oknem na nim
  • domyślna liczba kolumn, ustawiona w nagłówku skryptu

I tak robi skrypt :)

Wiersze są zarządzane w dokładnie tej samej procedurze.

Jacob Vlijm
źródło
1
Wow, świetna odpowiedź, już przegłosowane =)
AB
@AB Dzięki! :) Tego rodzaju rzeczy lubię robić :)
Jacob Vlijm,
2
@ kernel_panic Wow, dzięki :) Właściwie myślę o zrobieniu z niego ppa, takiego jak ten: askubuntu.com/a/608295/72216, a ten: askubuntu.com/a/560734/72216, wreszcie (w przyszłości) łączenie wszystkich trzech w jedną aplikację „workspace_tools”, w której można je ustawić jako opcje lub coś w tym stylu :).
Jacob Vlijm
1
@JacobVlijm Chciałbym usunąć starą odpowiedź stąd ze względu na zwięzłość: nadal będzie widoczna w historii edycji dla zainteresowanych ...
Fabby
1
Nie ma za co ... Powinieneś wpadać do pokoju rozmów i częściej trwać! : P
Fabby,
6

Technicznie nie ma skrótu do zmiany rozmiaru obszarów roboczych, ale możesz użyć prostego skryptu poniżej i powiązać go ze skrótem.

  1. Weź skrypt poniżej, zapisz go w .local/share/applicationsfolderze lub gdziekolwiek chcesz.
  2. Upewnij się, że skrypt jest wykonywalny za pomocą chmod 755 /path/to/script
  3. Powiąż go ze skrótem w Ustawieniach systemu -> Klawiatura -> Skróty -> Skróty niestandardowe

Na przykład mam tę konfigurację:

wprowadź opis zdjęcia tutaj

Skrypt jest związany z ShiftCtrlAltI. Ale CtrlAltImoże też działać. Podaję pełną ścieżkę do skryptu, który jest

/home/xieerqi/resize-workspaces.sh

A oto jak powinno to wyglądać:

wprowadź opis zdjęcia tutaj

Scenariusz

#!/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]}

Bardzo prosty w użyciu, bardzo prosty w konfiguracji

Sergiy Kolodyazhnyy
źródło