Как я могу автоматически добавить рабочие области, только если мне нужны они?

Предположите, что я использую 4 рабочих области, и мне случайно нужен больше, есть ли автоматизированный процесс или, если невозможный, простой способ случайно добавить больше рабочих областей (вместо установки Ubuntu tweak и т.д. и т.д.).

16
задан 22 September 2015 в 13:05

2 ответа

Автоматически устанавливать количество рабочих пространств; добавлять и удалять столбцы и строки, в зависимости от ваших потребностей

Ниже версии (скрипта), который будет автоматически добавлять рабочие пространства, если вы ввели последний столбец или строку вашей рабочей области-матрицы.

Вот как это работает:

  1. Если Вы попадаете в последний столбец или строку, добавляются дополнительные вьюпорты:

    enter image description here

  2. Если Ваши рабочие пространства не используются в течение 5-10 секунд и на них нет окон, то дополнительные рабочие пространства будут снова удалены. Однако Вы всегда будете держать один дополнительный ряд внизу, и одну дополнительную колонку справа от вашего текущего окна просмотра:

    enter image description here

The script:

#!/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)

How to use

  1. Copy the script below in a empty file, save it as add_space.py
  2. In head section of the script, отредактируйте строки, если вам нравятся другие настройки (максимальное количество рабочих пространств, матрица по умолчанию, например, 2x2):

    # --- set default workspaces below (горизонтально, вертикально)
    размер = 2
    размер = 2
    # --- установите максимальное количество рабочих пространств ниже.
    max_ws = 10
    
  3. Проверьте его командой:

    python3 /path/to/add_space.py.
    
  4. Если все работает нормально, добавьте его в свои приложения для запуска: 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), и мы находимся на "последней".

enter image description here

Затем скрипт пошлёт команду:

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)

Поскольку сценарий также практикует правило всегда иметь дополнительное рабочее пространство справа/внизу, нам нужно установить число столбцов на наибольшее значение :

  • текущий столбец рабочей области + 1
  • последний столбец с окном на нем
  • количество столбцов по умолчанию, как установлено в заголовке скрипта

И так скрипт делает :)

Строки управляются в точности той же самой процедурой.

14
ответ дан 23 November 2019 в 02:34

Технически, нет никакого ярлыка для изменения размеров рабочих пространств, но вы можете использовать простой скрипт, приведенный ниже, и привязать его к ярлыку.

  1. Возьмите скрипт, приведенный ниже, сохраните его в папке .local/share/applications, или в любом другом месте, которое вы предпочитаете.
  2. Убедитесь, что скрипт исполняется с помощью chmod 755 /path/to/script
  3. Привяжите его к ярлыку в Системных настройках -> Клавиатура -> Shortcuts -> Custom Shortcuts

Например, у меня есть эта настройка:

enter image description here

Скрипт привязан к ShiftCtrlAltI. Но CtrlAltI тоже может работать. Я даю полный путь к скрипту, который является

/home/xieerqi/resize-workspaces.sh

И вот как он должен выглядеть:

enter image description here

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]}

Очень простой в использовании, очень простой в настройке

6
ответ дан 23 November 2019 в 02:34

Другие вопросы по тегам:

Похожие вопросы: