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

16

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

kernel_panic
источник
@JacobVlijm imgur.com/LaDYwGb Upvoted и Accepted, спасибо за действительно хороший ответ
kernel_panic
Связанный: Этот старый пост спрашивал на "Как создать / удалить больше Рабочих пространств Автоматически?" с двумя разными ответами. Опять же, старые ответы, вероятно, менее удовлетворены по сравнению с новыми ответами здесь.
Clearkimura

Ответы:

14

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

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

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

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

    введите описание изображения здесь

  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)

Как пользоваться

  1. Скопируйте приведенный ниже скрипт в пустой файл и сохраните его как add_space.py
  2. В разделе заголовка скрипта отредактируйте строки, если вам нравятся другие настройки (максимальное количество рабочих пространств, матрица по умолчанию, например, 2x2):

    # --- set default workspaces below (horizontally, vertically)
    hsize = 2
    vsize = 2
    # --- set the maximum number of workspaces below
    max_ws = 10
    
  3. Протестируйте его с помощью команды:

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

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

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

И так сценарий делает :)

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

Якоб Влейм
источник
1
Ничего себе, большой ответ, уже upvoted =)
AB
@AB Спасибо! :) Это то, что я люблю делать :)
Джейкоб Влейм,
2
@kernel_panic Wow, спасибо :) Я на самом деле думаю сделать из него ppa, вот так: askubuntu.com/a/608295/72216, и вот этот: askubuntu.com/a/560734/72216, наконец (в будущем) объединение всех трех в одно приложение "workspace_tools", где они могут быть заданы как опции или что-то в этом роде :).
Джейкоб Влейм
1
@JacobVlijm Я бы удалил старый ответ отсюда по соображениям краткости: он все равно будет виден в истории редактирования для тех, кто интересуется ...
Fabby
1
Не за что ... Вам следует заходить в чат и токсики чаще! : P
Fabby
6

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

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

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

введите описание изображения здесь

Сценарий связан с 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]}

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

Сергей Колодяжный
источник