Припустимо, я використовую 4 робочих простори, і мені, до речі, потрібно більше, чи є автоматизований процес або, якщо неможливо, простий спосіб випадково додати більше робочих просторів (замість установки Ubuntu tweak
тощо тощо).
Припустимо, я використовую 4 робочих простори, і мені, до речі, потрібно більше, чи є автоматизований процес або, якщо неможливо, простий спосіб випадково додати більше робочих просторів (замість установки Ubuntu tweak
тощо тощо).
Відповіді:
Нижче версії сценарію (()), що автоматично додає робочі простори, якщо ви ввели останній стовпець або рядок своєї матриці робочої області.
Ось як це працює:
Якщо ви потрапите в останній стовпець або рядок, додаються додаткові вікна перегляду:
Якщо ваші робочі простори не використовуються протягом 5-10 секунд і на ньому немає вікон, додаткові робочі простори будуть видалені знову. Однак ви завжди будете зберігати один додатковий рядок внизу та один додатковий стовпець праворуч від вашого поточного вікна перегляду:
#!/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
У головному розділі сценарію відредагуйте рядки, якщо вам подобаються інші налаштування (максимальна кількість робочих просторів, матриця за замовчуванням, наприклад, 2x2):
# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10
Тест - запустіть його командою:
python3 /path/to/add_space.py
Якщо все працює нормально, додайте його до своїх програм запуску: Dash> Applications for Startup> Add the command:
/bin/bash -c "sleep 15 && python3 /path/to/add_space.py`
Як завжди, сценарій надзвичайно "мало соку" і не додає помітного навантаження на ваш процесор.
Розповідь нижче трохи складніша і, головним чином, пояснення щодо концепції та процедури , а не кодування. Читайте лише, якщо вам цікаво.
Як обчислити необхідні робочі простори (приклади стовпців)
Вихід wmctrl -d
виглядає так:
0 * DG: 3360x2100 VP: 1680,1050 WA: 65,24 1615x1026 N/A
У виході VP: 1680,1050
дає нам інформацію про те, де ми перебуваємо на робочому просторі, що охоплює (матриця всіх вікон перегляду). Ця інформація корисна лише в тому випадку, якщо ми також маємо роздільну здатність екрана, оскільки, наприклад, 1680
може бути ширина двох (навряд чи, але все-таки) або один раз екрана.
На щастя, ми можемо розібрати роздільну здатність екрану з команди xrandr
.
Тоді, якщо ми знаємо, що розмір екрана x є, 1680
і ми зараз увімкнено VP: 1680,1050
, ми знаємо, що перебуваємо на другому стовпчику в матриці робочої області. Оскільки ми також знаємо розмір загальної матриці ( DG: 3360x2100
також з виводу wmctrl -d
), ми знаємо, що поточна матриця включає два стовпці (3360/1680), і ми знаходимося на "останньому".
Потім сценарій надішле інструкцію додати стовпчик до матриці командою:
dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>
Це принцип.
Як обчислити робочі простори для видалення (приклади стовпців)
Раз на 10 секунд сценарій виконує команду, щоб перелічити всі відкриті вікна, з командою:
wmctrl -lG
Це також дає нам інформацію про положення вікна, виглядає так:
0x04604837 0 3425 24 1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit
На виході 3425
- х-положення вікна. Однак ця цифра є відносно поточної робочої області (ліва частина). Щоб знати абсолютне положення вікна (x-мудрий) у матриці робочої області, ми повинні додати перше число поточної інформації про вікно перегляду (наприклад VP: 1680,1050
, з виводу wmctrl -d
).
Однак, для простоти припустимо, ми знаходимось у вікні перегляду 1,1
(топлефт-огляд), тому відносне положення вікна дорівнює його абсолютній позиції.
Оскільки роздільна здатність екрана є 1680
, ми знаємо, що вікно знаходиться на стовпчику 3425/1680
, округленому вгору, оскільки все між ними 3360 and 5040
знаходиться в тому ж стовпці в матриці (від 3 до 4 разів дозволу). Для правильного розрахунку використовуємо math.ceil()
( python
)
Оскільки сценарій також практикує правило завжди мати додаткову робочу область праворуч / знизу, нам потрібно встановити кількість стовпців найвищим значення:
І так робить сценарій :)
Рядки управляються точно такою ж процедурою.
Технічно не існує ярлика для зміни розміру робочих просторів, але ви можете використовувати простий сценарій нижче та прив’язати його до ярлика.
.local/share/applications
папці чи куди завгодно.chmod 755 /path/to/script
Наприклад, у мене є така настройка:
Сценарій зобов'язаний ShiftCtrlAltI. Але CtrlAltIтеж могло працювати. Я даю повний шлях до сценарію, який є
/home/xieerqi/resize-workspaces.sh
А ось як це має виглядати:
Сценарій
#!/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]}
Дуже простий у використанні, дуже простий у налаштуванні