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.).
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.).
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.pyW 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 -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”.
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ść:
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/applicationsfolderze lub gdziekolwiek chcesz.chmod 755 /path/to/scriptNa 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