Автоматически измените размер окон в compiz

Этот ответ не отвечает на мой question:.

Я хочу изменить размер двух или больше окон автоматически, так, чтобы они заняли долю целого экрана, рядом. Таким образом, 2 окна, которые занимают 1/2, 3, которые занимают 1/3 каждый и так далее.

Я могу сделать это вручную прямо сейчас, но просто изменение размеров окон с клавиатурой индивидуально является трудоемким. Например, ctrl + Супер + стрелка и left/right/up/вниз для каждого окна. Однако это вынудило бы меня пойти окно окном, изменяющим размер их.

1
задан 13 April 2017 в 15:24

1 ответ

В то время как в этом ответе, вопрос шел, как к (пере-) располагают специализированные окна в сетку, отредактированная версия ниже перестраивает все "нормальные" окна в сетку:

#!/usr/bin/env python3
import subprocess
import getpass
import sys

#--- set your preferences below: padding between windows, margin(s)
cols = int(sys.argv[1]); rows = int(sys.argv[2]); padding = 10; left_margin = 70; top_margin = 30
#---

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_res():
    xr = get("xrandr").split(); pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def check_window(w_id):
    w_type = get("xprop -id "+w_id)
    if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
        return True
    else:
        return False

# get resolution
res = get_res()
# define (calculate) the area to divide
area_h = res[0] - left_margin; area_v = res[1] - top_margin
# create a list of calculated coordinates
x_coords = [int(left_margin+area_h/cols*n) for n in range(cols)]
y_coords = [int(top_margin+area_v/rows*n) for n in range(rows)]
coords = sum([[(cx, cy) for cx in x_coords] for cy in y_coords], [])
# calculate the corresponding window size, given the padding, margins, columns and rows
w_size = [str(int(area_h/cols - padding)), str(int(area_v/rows - padding))]
# find windows of the application, identified by their pid
wlist = [w.split()[0] for w in get("wmctrl -lp").splitlines()]
w_list = [w for w in wlist if check_window(w) == True][:cols*rows]
print(w_list)

# remove possibly maximization, move the windows
for n, w in enumerate(w_list):
    data = (",").join([str(item) for item in coords[n]])+","+(",").join(w_size)
    cmd1 = "wmctrl -ir "+w+" -b remove,maximized_horz"
    cmd2 = "wmctrl -ir "+w+" -b remove,maximized_vert"
    cmd3 = "wmctrl -ir "+w+" -e 0,"+data
    for cmd in [cmd1, cmd2, cmd3]:
        subprocess.Popen(["/bin/bash", "-c", cmd])

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

  • Удостоверьтесь, что wmctrl установлен:

    sudo apt-get install wmctrl
    
  • Скопируйте сценарий в пустой файл, сохраните его как rearrange_windows.py

  • В главном разделе сценария, устанавливает Ваше предпочтенное дополнение, если Вам нравится:

    #--- set your preferences below: padding between windows, margin(s)
    cols = 3; rows = 2; padding = 10; left_margin = 70; top_margin = 30
    #---
    

    Из-за некоторых ошибок в использовании (комбинация) Единица / wmctrl, Я уехал бы left_margin = 70; top_margin = 30 как есть

  • Выполните его командой:

    python3 /path/to/rearrange_windows.py <cols> <rows>
    

    например:

    python3 /path/to/rearrange_windows.py 3 2 
    

    установить сетку 3 collums / 2 строки окон.

Если все работы как ожидалось, добавляет это к сочетанию клавиш: Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

 python3 /path/to/rearrange_windows.py <cols> <rows>

Если требуется использовать различные сетки (седла/строки), просто создайте несколько ярлыков с различными сетками.

Примечание:

Если количество окон превышает количество (возможных) окон в сетке, сетках сценария четыре "самых старых" окна.

Примеры

python3 /path/to/rearrange_windows.py 3 2 

enter image description here

python3 /path/to/rearrange_windows.py 2 3

enter image description here

1
ответ дан 7 December 2019 в 16:14

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

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