Чи є спосіб запобігти переміщенню ваших вікон під час підключення зовнішнього монітора?


9

Отже, я використовую Ubuntu 14.10 на своєму ноутбуці і періодично підключаю його до свого телевізора на другий екран. Мій телевізор знаходиться зліва від мого столу. Коли я вмикаю його як зовнішній монітор зліва від екрана ноутбука, всі вікна, які були на екрані мого ноутбука, переходять на екран телевізора. Я можу перенести їх назад, але це насправді прикро, що потрібно робити це кожен раз, особливо коли відкрито кілька вікон.

Телевізор зліва

Однак вікна не рухаються, якщо я встановив екран телевізора праворуч від екрана ноутбука (практично). Але це зрозуміло заплутано у використанні, оскільки це протилежне фізичному налаштуванню. Крім того, я не хочу пересувати свій стіл.

Телевізор справа

Схоже, що Ubuntu або сервер відображення просто припускає, що головний монітор є лівим і де мають бути всі вікна. Чи є спосіб відключити цю поведінку?

Я перевіряв ці форуми, але насправді не бачив, щоб хтось писав про це. Найближча тема, яку я знайшов, була ця, хоча це не зовсім та сама проблема.

Отримайте Ubuntu НЕ переміщати вікна при відключенні одного з декількох моніторів

У когось є якісь ідеї? Будь ласка, дайте мені знати, якщо ви це зробите. Дякую!

Відповіді:


2

Я не знайшов "секретної" настройки змінити поведінку, як здається, задуманої поведінки. Це виглядає так, ніби лівий екран вважається "базовим" екраном.

Однак, цілком можливо, можна створити обхідне рішення з фактично однаковим результатом. Ви можете створити сценарій, який під час підключення другого екрана перераховує всі вікна. Згодом усі вікна, які спочатку переміщуються на лівий екран, переміщуються назад на екран праворуч, протягом секунди чи двох. Розмір усіх вікон буде збережений.
Ось що робить сценарій нижче.

Дві версії

Можна відновити влаштовані вікна двома способами:

  • Інколи за допомогою клавіші швидкого доступу, яку потрібно запустити після підключення другого екрана.
  • Автоматично запускаючи сценарій у фоновому режимі, чекаючи підключення екрана.

Як користуватись

препарати

  • Встановити 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

Серйозно хворі навички, Якобе!
don.joey

@ K0j0 Ви встигли?
Яків Влійм

@JacobVlijm Не впевнений, чи найкращим рішенням є опитування кожні 5 секунд (чи немає можливості, орієнтованої на події?). У будь-якому випадку, якщо вам цікаво перетворити цей скрипт на показник Unity ( наприклад, тут ), будь ласка, зв’яжіться з нами.
Петріно

@Peterino Якщо сигнал, керований подіями, буде моїм першим вибором. У той же час: Якщо фоновий сценарій добре написаний, його додаткове навантаження має (і може) бути практично жодним, і я завжди тестую свої сценарії саме на цьому. Я сам запускаю мінливу кількість фонових сценаріїв. Навіть всі разом не мають жодного помітного ефекту. Пам'ятайте, що численні цикли працюють за визначенням у вашій системі. Про пропозицію індикатора Unity: Мені, безумовно, цікаво навчитися створювати індикатор для цієї чи іншої ситуації :).
Яків Влійм

@JacobVlijm Схоже, що автоматичне розміщення Windows відбудеться автоматично, починаючи з одного з наступних випусків Ubuntu ("незавершене виробництво"), повідомляє джерело компанії Canonical . Мабуть, не варто вкладати кошти в решту кількох місяців на поточний реліз. Я все-таки перевірте разом із розробниками Mir на IRC # ubuntu-mir @ freenode.
Петерино
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.