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

7

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

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

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

UPDATE:

Выход 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 после отсоединения от второго монитора:

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. Итак, похоже, что приложение имеет какое-то отношение к этому.

    
задан David Charles 25.08.2015 в 16:43
источник

1 ответ

6

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

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

Решение является обходным решением; информация о экране обновляется правильно, учитывая разницу в выходе 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. Если все работает нормально, добавьте его в комбинацию клавиш: выберите: System Settings > «Клавиатура» > «Ярлыки» > «Пользовательские ярлыки». Нажмите «+» и добавьте команду:

    python3 /path/to/move_windows.py
    

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

    
ответ дан Jacob Vlijm 26.08.2015 в 06:12
источник