Как восстановить закадровое окно после отключения второго монитора?

Я использую Ubuntu 14.04 на своем ноутбуке за столом со вторым монитором. Когда я отключаюсь от второго монитора - в обязательном порядке - мое окно для Emacs выходит за пределы экрана.

Я могу использовать Alt-TAB, чтобы сделать Emacs активным окном, и, работая вслепую, остановить Emacs, чтобы я мог перезапустить его, что приведет к его повторному появлению на экране. Но, как мне кажется, в Ubuntu должен быть способ вернуть на экран закадровое окно. Есть ли?

Конечно, лучшим решением было бы предотвратить отключение окон в ответ на отключение монитора, и я бы принял решение этой проблемы.

ОБНОВЛЕНИЕ:

Выход xrandr при подключении ко второму монитору:

Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+1280+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080      60.0*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
   1280x1024      60.0*+   75.0  
   1280x960       60.0  
   1152x864       75.0  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   640x480        75.0     72.8     66.7     60.0  
   720x400        70.1  
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Выход xrandr после отключения от второго monitor:

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 382mm x 215mm
   1920x1080      60.0*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

Также я попытался поменять местами левое и правое окна моего терминала и окна Emacs, а затем отключиться. Это позволяет окну Emacs оставаться на экране после отключения от второго монитора. И окно Терминала выживает в позиции, которая уничтожила Emacs. Таким образом, кажется, что приложение как-то связано с этим.

7
задан 26 August 2015 в 09:26

2 ответа

Переместите все окна в видимую область

Как предложил/запросил в комментарии, сценарий ниже переместит все "нормальные" окна в видимую область на текущей рабочей области.

Решением является обходное решение; информация об экране обновлена правильно, дана различие в выводе xrandr, прежде и и после разъединения. Причина, почему окна не перемещаются собой (в настоящее время) неизвестна, если другой ответ не решает проблему.

Сценарий

#!/usr/bin/env python3
import subprocess

# get the resolution of the screen (+0+0)
res = [
    int(n) for n in [
        s.split("+")[0].split("x")\
        for s in subprocess.check_output(["xrandr"]).decode("utf-8").split()\
        if "+0+0" in s][0]
    ]
# create list of windows
w_list = [w.split() for w in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
# filter only "normal" ones
valid = [
    w for w in w_list if "_NET_WM_WINDOW_TYPE_NORMAL" in\
    subprocess.check_output(["xprop", "-id", w[0]]).decode("utf-8")
    ]
# get the number of valid windows and calculate a targeted position
# the targeted position is a hunch, it will be exact if the window fits completely inside the resolution
# it will work anyway
parts = len(valid)+2
positions = [(int(n*res[0]/parts), int(n*res[1]/parts)) for n in list(range(parts))[1:-1]]
# unmaximaize, move the windows to the visible area (current workspace)
for i, w in enumerate(valid):
    subprocess.Popen(["wmctrl", "-ir", w[0], "-b", "remove,maximized_vert,remove,maximized_horz"])
    # weird, but sometimes wmctrl refuses to move a window if it is not resized first (?)
    subprocess.Popen(["wmctrl", "-ir", w[0], "-e", "0,200,200,200,200"])      
    subprocess.Popen(["wmctrl", "-ir", w[0], "-e", (",").join(["0", str(positions[i][0]), str(positions[i][1]),w[4],w[5]])])

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

  1. Потребности сценария wmctrl:

    sudo apt-get install wmctrl
    
  2. Скопируйте сценарий в пустой файл, безопасный это как move_windows.py

  3. Тестовый прогон это: откройте много окон, разместите их в различные рабочие области и т.д. или попытайтесь разъединить второй монитор. Затем выполните команду:

    python3 /path/to/move_windows.py
    

    Все "нормальные" окна должны переместиться в видимую область текущей рабочей области.

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

    python3 /path/to/move_windows.py
    

Теперь необходимо смочь переместить все окна в видимую область на текущей рабочей области с сочетанием клавиш.

6
ответ дан 26 August 2015 в 19:26
  • 1
    я установил libnl3 как то, как Вы сказали мне, но у меня есть проблема со второй командой, и это говорит:------------------sudo: неспособный разрешить хост ananubunto: Соединение приведенный к таймауту ln: не удалось создать символьную ссылку '/lib/arm-linux-gnueabihf/libnl-genl-3.so': Никакой такой файл или каталог – Anan Amer 17 November 2016 в 03:26

Простое решение, которое работало на меня в восстановлении окон, оставленных на "экранах" разъединенных мониторов (не совсем та же проблема как OP, но имел отношение) использует сочетание клавиш для увеличения окна: Ctrl + Super + в † ‘.

[N.B. Super ключ с символом "Windows" на нем, обычно между Fn и Alt. На Mac это соответствует Command = вЊ ˜. На более старых версиях Ubuntu, чем мой (16.04) Вы, возможно, не должны были бы включать Ctrl.]

0
ответ дан 1 October 2019 в 13:10

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

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