Я не нашел «секретной» настройки, которая бы изменяла поведение, как кажется, разработанного поведения. Это действительно выглядит так, как будто левый экран считается «базовым» экраном.
Однако вполне возможно создать обходной путь, по сути, с тем же результатом. Вы можете создать скрипт, который при подключении второго экрана выводит список всех окон. Впоследствии все окна, которые изначально перемещены на левый экран, смещаются назад на экран справа, в течение секунды или двух. Размер всех окон будет сохранен.
Вот что делает скрипт ниже.
Две версии
Вы можете восстановить расположенные окна двумя способами:
- Иногда с помощью сочетания клавиш запускается после подключения второго экрана.
- Автоматически запускает скрипт в фоновом режиме, ожидая подключения вашего экрана.
Как пользоваться
препараты
устанавливать wmctrl
sudo apt-get установить 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