Я не знайшов "секретної" настройки змінити поведінку, як здається, задуманої поведінки. Це виглядає так, ніби лівий екран вважається "базовим" екраном.
Однак, цілком можливо, можна створити обхідне рішення з фактично однаковим результатом. Ви можете створити сценарій, який під час підключення другого екрана перераховує всі вікна. Згодом усі вікна, які спочатку переміщуються на лівий екран, переміщуються назад на екран праворуч, протягом секунди чи двох. Розмір усіх вікон буде збережений.
Ось що робить сценарій нижче.
Дві версії
Можна відновити влаштовані вікна двома способами:
- Інколи за допомогою клавіші швидкого доступу, яку потрібно запустити після підключення другого екрана.
- Автоматично запускаючи сценарій у фоновому режимі, чекаючи підключення екрана.
Як користуватись
препарати
Встановити wmctrl
sudo apt-get install wmctrl
Знайдіть імена двох екранів за допомогою xrandr
, імена екранів будуть безпосередньо перед словом "підключено".
Скопіюйте Будь-який із сценаріїв, наведених нижче, у розділі голов, замініть у цих двох рядках назви екрана правильними:
screen_1 = "LVDS1" # your main screen (laptop)
screen_2 = "VGA1" # secundary screen (on the left)
збережіть сценарій як move_windows.py
Переконайтеся, що в налаштуваннях дисплея знаходиться ваш додатковий екран зліва. Верхні рядки двох екранів повинні відповідати (як на першому зображенні вашого запитання).
Запуск сценарію
- якщо ви використовуєте цей, щоб запускати його час від часу, запустіть його після підключення другого екрана.
python3 /path/to/move_windows.py
Ви можете додати його до комбінації клавіш, якщо ви вважаєте, що він робить те, що повинен робити, виберіть: Налаштування системи> "Клавіатура"> "Ярлики"> "Спеціальні ярлики". Клацніть "+" і додайте команду:
Якщо ви використовуєте цей для запуску у фоновому режимі, також запустіть його командою:
python3 /path/to/move_windows.py
Якщо він працює так, як ви задумали, додайте його до своїх програм запуску: Dash> Startup Applications> Add
Я протестував сценарій зі своїм ноутбуком (праворуч) та двома різними екранами (зліва). Результат був таким самим.
екран ноутбука
підключення без сценарію
підключення до запущеного сценарію
Після того, як сценарій зробив свою роботу, вікна будуть «залишені в спокої» (звичайно), і ви зможете влаштувати свої вікна по-своєму.
Сценарій (и)
1. "Ручна" версія для запуску після підключення екрана
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
shift_windows(get_shift(get("xrandr")))
2. Автоматична версія для запуску у фоновому режимі
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
while True:
try:
screen_info1 = get("xrandr")
time.sleep(5)
screen_info2 = get("xrandr")
check = screen_2+" connected"
if (check in screen_info1, check in screen_info2) == (False, True):
time.sleep(5)
shift_windows(get_shift(screen_info2))
except:
pass