Як я можу автоматично додавати робочі простори, лише якщо вони мені потрібні?


16

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



@JacobVlijm imgur.com/LaDYwGb Підтверджено та прийнято, дякую за дійсно гарну відповідь
kernel_panic

Пов’язано: Ця стара публікація запитала на тему "Як створити / видалити більше робочих просторів автоматично?" з двома різними відповідями. Потім знову старі відповіді, ймовірно, менш задоволені порівняно з новими відповідями тут.
клеаркімура

Відповіді:


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> Applications for Startup> Add the command:

    /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-мудрий) у матриці робочої області, ми повинні додати перше число поточної інформації про вікно перегляду (наприклад VP: 1680,1050, з виводу wmctrl -d).
Однак, для простоти припустимо, ми знаходимось у вікні перегляду 1,1(топлефт-огляд), тому відносне положення вікна дорівнює його абсолютній позиції.

Оскільки роздільна здатність екрана є 1680, ми знаємо, що вікно знаходиться на стовпчику 3425/1680, округленому вгору, оскільки все між ними 3360 and 5040знаходиться в тому ж стовпці в матриці (від 3 до 4 разів дозволу). Для правильного розрахунку використовуємо math.ceil()( python)

Оскільки сценарій також практикує правило завжди мати додаткову робочу область праворуч / знизу, нам потрібно встановити кількість стовпців найвищим значення:

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

І так робить сценарій :)

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


1
Ого, чудова відповідь, вже схвалено =)
AB

@AB Дякую! :) Це такі речі, які я люблю робити :)
Яків Влійм

2
@kernel_panic Вау, спасибі :) Я насправді думаю про те, щоб зробити його ppa, як цей: askubuntu.com/a/608295/72216, і цей: askubuntu.com/a/560734/72216, нарешті (у майбутньому) об'єднання всіх трьох в один додаток "робочий простір_тоолс", де їх можна встановити як параметри або щось подібне :).
Яків Влійм

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

Дуже простий у використанні, дуже простий у налаштуванні

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.