Как я могу автоматически добавлять рабочие пространства, только если они мне нужны?
Предположим, я использую 4 рабочих пространства и мне, кстати, нужно больше, есть ли автоматизированный процесс или, если невозможно, простой способ случайно добавить больше рабочих пространств (вместо установки Ubuntu tweak
и тд и тп).
2 ответа
Автоматически устанавливать количество рабочих пространств; добавлять и удалять столбцы и строки, в зависимости от ваших потребностей
Ниже приведена версия () фонового скрипта, который будет автоматически добавлять рабочие пространства, если вы ввели последний столбец или строку вашей матрицы рабочего пространства.
Вот как это работает:
Если вы прибываете в последний столбец или строку, добавляются дополнительные видовые окна:
Если ваши рабочие пространства не используются в течение 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
,
Тогда, если мы знаем, что размер х экрана 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
)
Поскольку скрипт также применяет правило, чтобы всегда иметь дополнительное рабочее пространство справа / внизу, нам нужно установить для числа столбцов самое высокое значение:
- текущий столбец рабочей области + 1
- последний столбец с окном на нем
- количество столбцов по умолчанию, указанное в заголовке скрипта
И так сценарий делает:)
Строки управляются точно так же.
Технически, здесь нет ярлыка для изменения размера рабочих пространств, но вы можете использовать простой скрипт ниже и привязать его к ярлыку.
- Возьмите приведенный ниже сценарий и сохраните его в
.local/share/applications
папку, или где вы предпочитаете. - Убедитесь, что скрипт сделан исполняемым с
chmod 755 /path/to/script
- Свяжите это с ярлыком в Системных настройках -> Клавиатура -> Ярлыки -> Пользовательские ярлыки
Например, у меня есть эта настройка:
Скрипт привязан к Shift Ctrl Alt I. Но Ctrl Alt Я тоже мог работать. Я даю полный путь к сценарию, который
/home/xieerqi/resize-workspaces.sh
А вот как это должно выглядеть:
скрипт
#!/bin/bash
# Author : Serg Kolo
# Date: Sept 19, 2015
# Purpose: simple script to resize
# unity workspaces
# Written for: http://Ask-ubuntu.ru/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]}
Очень прост в использовании, очень прост в настройке