Переместитесь полу - максимизируемые окна приблизительно через (2 или больше) мониторы

Я часто использую Ctrl+Super+Arrow - Ключи для перемещения окон. Однако с настроенным монитором нескольких, ярлыки только перемещают окна в текущий экран.

** Пример моей ситуации:

У меня есть 3 монитора, и у меня есть экземпляр Chrome открытый в моем центральном мониторе.

  1. Когда я поразил Ctrl+Super+Arrow (слева), окно разделяет к левой половине моего центрального монитора.
  2. Когда я повторяюсь, окно не перемещается.

Что я хотел бы видеть, вместо этого это в [2.], окно перемещает к правильной половине левых большую часть монитора и так далее

Как я достигаю этого поведения?

5
задан 14 December 2015 в 09:13

1 ответ

Переместите Ваш полу - максимизируемые окна через несколько экранов ("аэро - снимок" одинаково)

Сценарий ниже делает точно, как Вы описываете. Это может использоваться на любом количестве экранов. Сценарий оптимизирован для Единицы, но может легко быть отредактирован для установки другим менеджерам окон.

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


enter image description here

Примечания

  • Сценарий перемещает окна через все связанные экраны, впоследствии переключающиеся через "половины" экранов, слева направо и наоборот.
  • Сценарий читает размеры экранов и устанавливает размер окна к половине размера экрана соответственно.
  • Сценарий читает настройки на средстве запуска (если средство запуска появляется только на первом экране или на всех), и вычисляет целенаправленные размеры окна соответственно.
  • Сценарий не принимает во внимание возможно, набор автоскрывает опцию для средства запуска. Причина состоит в том, что, обновляя windowsize, после того как средство запуска скрывается или обнаруживается, взял бы фоновый сценарий и вполне другую историю для кодирования.
  • Окна перемещены и изменены комбинацией xdotool и wmctrl - команды. Так как эти команды могут иметь некоторое "характерное поведение" в сочетании с Единицей, существует, possiblility незначительные изменения могут быть полезными в Вашей системе. Я протестировал его в двух (очень отличающихся) системах однако, хорошо работая на обоих.

Сценарий

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

# --- set possibly wanted marge (on the right side of the window) below
marge = 0
# --- set set launcher width below (default = 65)
default_launcherwidth = 65
# ---

move = sys.argv[1]
get = lambda cmd: subprocess.check_output(
    ["/bin/bash", "-c", cmd]).decode("utf-8")

screendata = [l for l in get("xrandr").splitlines() if " connected" in l]
# get the primary screen's position
pr = [l.split() for l in screendata if "primary" in l][0]
i = pr.index("primary"); s = pr[i+1]
primary= [int(s.split("x")[0]), int(s.split("+")[-2])]
# general screen list
screendata = [
    [s for s in l.split() if s.count("+") == 2][0] for l in screendata
    ]
screendata = [
    [int(s.split("x")[0]),int(s.split("+")[-2])] for s in screendata
    ]
screendata.sort(key=lambda x: x[1]); primary = screendata.index(primary)

def launcher_size():
    launcherset = get(
        "dconf read /org/compiz/profiles/unity/plugins/unityshell/num-launchers"
        ).strip()
    l_size_0 = 65; l_size_1 = l_size_0 if launcherset == "0" else 0
    return [l_size_0, l_size_1]

def magnets(index):
    l_size = l_sizes[0] if index == primary else l_sizes[1]
    screen = screendata[index]
    screenwidth = screen[0]; shift = screen[1]
    parts = (screenwidth - l_size)/2; virtual_mid = screenwidth - parts + shift
    left_trigger = shift + l_size
    return [left_trigger, int(virtual_mid), int(parts)]

def find_screen(x_loc):
    scr_index = len([scr for scr in screendata if x_loc >= scr[1]])-1
    scr_index = scr_index if scr_index >= 0 else 0
    screen = screendata[scr_index]
    return [scr_index, screen]

def get_active():
    active = hex(int(get("xdotool getactivewindow").strip()))
    active = active[:2]+(10-len(active))*"0"+active[2:] 
    x_pos = int([l.split()[2] for l in get("wmctrl -lG").splitlines() \
                 if l.startswith(active)][0])
    return [active, x_pos]

def decide(x_loc, active):
    current_scr = find_screen(x_loc)
    triggers = magnets(current_scr[0])
    width = triggers[2]
    index = current_scr[0]
    if move == "left":
        if x_loc <= triggers[1]:
            if x_loc == triggers[0]:
                if index != 0:
                    alter = magnets(index-1) 
                    width = alter[-1]
                    target = alter[1]
                else:
                    target = triggers[0]
            else:
                target = triggers[0]
        elif x_loc > triggers[1]:
            target = triggers[1]        
    elif move == "right":
        if x_loc >= triggers[1]:
            if index != len(screendata)-1:
                alter = magnets(index+1)
                width = alter[-1]
                target = alter[0]
            else:
                target = triggers[1]
        elif x_loc < triggers[1]:
            target = triggers[1]
    subprocess.call([
        "wmctrl", "-r", ":ACTIVE:","-b", "remove,maximized_vert,maximized_horz"
        ])
    subprocess.call(["wmctrl", "-ir", active, "-e", "0,"+str(target)+",400,"+\
                      str(int(width)-marge)+",200"])
    subprocess.call([
        "wmctrl", "-ir", active, "-b", "toggle,maximized_vert"
        ])

l_sizes = launcher_size()
w_data = get_active()
active = w_data[0]
x_loc = w_data[1]

decide(x_loc, active)

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

  • scrpt нужны оба wmctrl и xdotool:

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

  • Тестовый прогон сценарий из окна терминала (неоднократно) командой:

    python3 /path/to/move_window.py right
    

    который должен переместить окно через Ваши экраны к праву, и:

    python3 /path/to/move_window.py left
    

    который должен переместить окно через Ваши экраны налево.

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

Важные примечания

  1. Ширина средства запуска установлена на 65px (соответствие размеру значков 48px + 17px границы, который является значением по умолчанию). Если ширина набора отличается, она должна быть установлена правильно в заголовке сценария, как обозначено в разделе:

    # --- set set launcher width below (default = 65)
    default_launcherwidth = 65
    # ---
    
  2. В headsection сценария существует, кроме того, строка:

    marge = 0
    

    который устанавливает пустой marge в правой стороне перемещенного экрана. Измените его, если Вам нравится к другому значению.

3
ответ дан 23 November 2019 в 10:27

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

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