Предположим, я использую 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> Startup Applications> Добавить команду:
/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-позиция окна. Однако эта цифра относительно текущего рабочего пространства (левая сторона). Чтобы узнать абсолютную позицию окна (по оси x) в матрице рабочей области, мы должны добавить первое число текущей информации о окне просмотра (например VP: 1680,1050
, из выходных данных wmctrl -d
).
Однако для простоты предположим, что мы находимся в области просмотра 1,1
(topleft viewport), поэтому относительная позиция окна равна его абсолютной позиции.
Поскольку разрешение экрана равно 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]}
Очень прост в использовании, очень прост в настройке