Я часто использую Ctrl+Super+Arrow - Ключи для перемещения окон. Однако с настроенным монитором нескольких, ярлыки только перемещают окна в текущий экран.
** Пример моей ситуации:
У меня есть 3 монитора, и у меня есть экземпляр Chrome
открытый в моем центральном мониторе.
Что я хотел бы видеть, вместо этого это в [2.]
, окно перемещает к правильной половине левых большую часть монитора и так далее
Как я достигаю этого поведения?
Сценарий ниже делает точно, как Вы описываете. Это может использоваться на любом количестве экранов. Сценарий оптимизирован для Единицы, но может легко быть отредактирован для установки другим менеджерам окон.
Это оказалось немного более сложным, чем я думал, так как сценарий должен принять во внимание, что пользователь возможно установил средство запуска, чтобы только появиться на крайнем левом экране (или не). Целенаправленные положения (и предназначенные размеры окна) должны быть вычислены соответственно.
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
который должен переместить окно через Ваши экраны налево.
Если все хорошо работает, добавьте обе команды к сочетаниям клавиш: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команды к двум сочетаниям клавиш по Вашему выбору.
Ширина средства запуска установлена на 65px
(соответствие размеру значков 48px
+ 17px
границы, который является значением по умолчанию). Если ширина набора отличается, она должна быть установлена правильно в заголовке сценария, как обозначено в разделе:
# --- set set launcher width below (default = 65)
default_launcherwidth = 65
# ---
В headsection сценария существует, кроме того, строка:
marge = 0
который устанавливает пустой marge в правой стороне перемещенного экрана. Измените его, если Вам нравится к другому значению.