Předpokládejme, že používám 4 pracovní prostory a mimochodem potřebuji další, existuje automatizovaný proces nebo, pokud to není možné, snadný způsob, jak náhodně přidat další pracovní prostory (místo instalace Ubuntu tweak
atd. atd.).
Přijatá odpověď:
Automaticky nastavit počet pracovních ploch; přidat a odebrat sloupce a řádky v závislosti na vašich potřebách
Níže je verze (the) backround skriptu, který automaticky přidá pracovní prostory, pokud zadáte poslední sloupec nebo řádek matice pracovního prostoru.
Funguje to takto:
-
Pokud se dostanete na poslední sloupec nebo řádek, přidají se další výřezy:
-
Pokud se vaše pracovní prostory 5–10 sekund nepoužívají a nejsou na něm žádná okna, další pracovní plochy budou opět odstraněny. Vždy si však ponecháte jeden řádek navíc níže a jeden sloupec navíc vpravo od vašeho aktuálního výřezu:
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)
Jak používat
- Zkopírujte níže uvedený skript do prázdného souboru a uložte jej jako
add_space.py
-
V sekci head skriptu upravte řádky, pokud chcete další nastavení (maximální počet pracovních ploch, výchozí matice, např. 2×2):
# --- set default workspaces below (horizontally, vertically) hsize = 2 vsize = 2 # --- set the maximum number of workspaces below max_ws = 10
-
Test- spusťte jej příkazem:
python3 /path/to/add_space.py
-
Pokud vše funguje dobře, přidejte jej do spouštěcích aplikací:Dash> Startup Applications> Add the command:
/bin/bash -c "sleep 15 && python3 /path/to/add_space.py`
Poznámka
Jako vždy je skript extrémně „málo šťávy“ a nezatěžuje váš procesor.
Vysvětlení
Níže uvedený příběh je trochu komplikovaný a většinou jde o vysvětlení konceptu a postup , spíše než kódování. Čtěte pouze v případě, že vás to zajímá.
Jak vypočítat potřebné pracovní prostory (příklady sloupců)
Výstup wmctrl -d
vypadá takto:
0 * DG: 3360x2100 VP: 1680,1050 WA: 65,24 1615x1026 N/A
Ve výstupu VP: 1680,1050
nám dává informace o tom, kde se nacházíme na pracovní ploše (matice všech výřezů). Tato informace je užitečná pouze v případě, že máme k dispozici i rozlišení obrazovky, protože např. 1680
může být šířka dvou (nepravděpodobné, ale přesto) nebo jednorázové obrazovky.
Naštěstí můžeme analyzovat rozlišení obrazovky příkazem xrandr
.
Pokud tedy víme, že velikost x obrazovky je 1680
a aktuálně jsme na VP: 1680,1050
, víme, že jsme na druhém sloupci v matici pracovního prostoru. Protože známe také velikost celkové matice (DG: 3360x2100
, také z výstupu wmctrl -d
), víme, že aktuální matice obsahuje dva sloupce (3360/1680) a my jsme na „posledním“.
Skript poté odešle pokyn k přidání sloupce do matice příkazem:
dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>
Toto je princip.
Jak vypočítat pracovní prostory k odstranění (příklady sloupců)
Jednou za 10 sekund skript spustí příkaz pro výpis všech aktuálně otevřených oken s příkazem:
wmctrl -lG
To nám také poskytuje informace o poloze okna, které vypadají takto:
0x04604837 0 3425 24 1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit
Ve výstupu 3425
je poloha x okna. Tento údaj se však vztahuje k aktuálnímu pracovnímu prostoru (levá strana). Abychom poznali absolutní polohu okna (po směru x) v matici pracovního prostoru, musíme přidat první číslo aktuální informace o výřezu (např. VP: 1680,1050
, z výstupu wmctrl -d
).
Předpokládejme však pro jednoduchost, že se nacházíme ve výřezu 1,1
(výřez vlevo nahoře), takže relativní poloha okna rovná se jeho absolutní pozice.
Protože rozlišení obrazovky je 1680
, víme, že okno je ve sloupci 3425/1680
, zaokrouhleno nahoru, protože vše mezi 3360 and 5040
je ve stejném sloupci v matici (mezi 3 a 4 násobkem rozlišení). Pro správný výpočet používáme math.ceil()
(python
)
Protože skript také praktikuje pravidlo, aby byl vždy vpravo/dole pracovní prostor navíc, musíme nastavit počet sloupců na nejvyšší hodnota:
- aktuální sloupec pracovního prostoru + 1
- poslední sloupec s oknem
- výchozí počet sloupců, jak je nastaveno v záhlaví skriptu
A tak to scénář dělá 🙂
Řádky jsou spravovány přesně stejným postupem.