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 tweak
itp.).
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 tweak
itp.).
Odpowiedzi:
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:
Jeśli dojdziesz do ostatniej kolumny lub wiersza, zostaną dodane dodatkowe rzutnie:
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:
#!/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)
add_space.py
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
Przetestuj - uruchom komendę:
python3 /path/to/add_space.py
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`
Jak zawsze skrypt ma bardzo niski poziom soku i nie dodaje zauważalnego obciążenia procesorowi.
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 -d
wygląda następująco:
0 * DG: 3360x2100 VP: 1680,1050 WA: 65,24 1615x1026 N/A
W wyniku VP: 1680,1050
daje 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. 1680
Moż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 1680
i 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: 3360x2100
również z danych wyjściowych wmctrl -d
), wiemy, że bieżąca macierz zawiera dwie kolumny (3360/1680) i jesteśmy na „ostatniej”.
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 3425
znajduje 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,1050
Z 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/1680
zaokrąglone w kolumnie , ponieważ wszystko pomiędzy 3360 and 5040
znajduje 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ść:
I tak robi skrypt :)
Wiersze są zarządzane w dokładnie tej samej procedurze.
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.
.local/share/applications
folderze lub gdziekolwiek chcesz.chmod 755 /path/to/script
Na przykład mam tę konfigurację:
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ć:
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