Предположите, что я использую 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
In head section of the script, отредактируйте строки, если вам нравятся другие настройки (максимальное количество рабочих пространств, матрица по умолчанию, например, 2x2):
# --- set default workspaces below (горизонтально, вертикально)
размер = 2
размер = 2
# --- установите максимальное количество рабочих пространств ниже.
max_ws = 10
Проверьте его командой:
python3 /path/to/add_space.py.
Если все работает нормально, добавьте его в свои приложения для запуска: Dash > Запустить приложения > Добавить команду:
/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
.
Тогда, если мы знаем, что размер экрана х - 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-позицией окна. Однако эта цифра относительно текущей рабочей области (слева). Для того, чтобы узнать абсолютное положение окна (x-wise) в рабочей области-матрице, мы должны добавить первый номер текущей информации в окне просмотра (например, VP: 1680,1050
, из вывода wmctrl -d
).
Однако, для простоты предположим, что мы находимся на смотровом экране 1,1
(левый верхний смотровой экран), поэтому относительное положение окна равно его абсолютному положению.
Поскольку разрешение экрана составляет 1680
, мы знаем, что окно находится в колонке 3425/1680
, округленной в большую сторону, так как все между 3360 и 5040
находится в той же колонке в матрице (между 3 и 4-кратным разрешением). Для правильного расчета мы используем математику. ceil()
(python
)
Поскольку сценарий также практикует правило всегда иметь дополнительное рабочее пространство справа/внизу, нам нужно установить число столбцов на наибольшее значение :
И так скрипт делает :)
Строки управляются в точности той же самой процедурой.
Технически, нет никакого ярлыка для изменения размеров рабочих пространств, но вы можете использовать простой скрипт, приведенный ниже, и привязать его к ярлыку.
.local/share/applications
, или в любом другом месте, которое вы предпочитаете. chmod 755 /path/to/script
Например, у меня есть эта настройка:
Скрипт привязан к ShiftCtrlAltI. Но CtrlAltI тоже может работать. Я даю полный путь к скрипту, который является
/home/xieerqi/resize-workspaces.sh
И вот как он должен выглядеть:
Script
#!/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]}
Очень простой в использовании, очень простой в настройке