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

16

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

    
задан kernel_panic 19.09.2015 в 18:02
источник

2 ответа

14

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

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

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

  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 > Приложения для запуска > Добавьте команду:

    /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 дает нам информацию о том, где мы находимся на рабочей области spanning (матрица всех видовых экранов). Эта информация полезна только в том случае, если у нас также есть разрешение экрана, так как, например, 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 ).
Однако для простоты предположим, что мы находимся в viewport 1,1 (topleft viewport), поэтому относительное положение окна равно его абсолютное положение.

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

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

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

И поэтому скрипт делает:)

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

    
ответ дан Jacob Vlijm 19.09.2015 в 20:50
источник
5

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

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

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

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

/home/xieerqi/resize-workspaces.sh

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

Сценарий

#!/bin/bash#Author:SergKolo#Date:Sept19,2015#Purpose:simplescripttoresize#unityworkspaces#Writtenfor:http://askubuntu.com/q/676046/295286HEIGHT=$(gsettingsgetorg.compiz.core:/org/compiz/profiles/unity/plugins/core/hsize)WIDTH=$(gsettingsgetorg.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]}

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

    
ответ дан Sergiy Kolodyazhnyy 19.09.2015 в 22:31