Я использую 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. Таким образом, кажется, что приложение как-то связано с этим.
Как предложил/запросил в комментарии, сценарий ниже переместит все "нормальные" окна в видимую область на текущей рабочей области.
Решением является обходное решение; информация об экране обновлена правильно, дана различие в выводе 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]])])
Потребности сценария wmctrl
:
sudo apt-get install wmctrl
Скопируйте сценарий в пустой файл, безопасный это как move_windows.py
Тестовый прогон это: откройте много окон, разместите их в различные рабочие области и т.д. или попытайтесь разъединить второй монитор. Затем выполните команду:
python3 /path/to/move_windows.py
Все "нормальные" окна должны переместиться в видимую область текущей рабочей области.
Если все хорошо работает, добавьте его к сочетанию клавиш: выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:
python3 /path/to/move_windows.py
Теперь необходимо смочь переместить все окна в видимую область на текущей рабочей области с сочетанием клавиш.
Простое решение, которое работало на меня в восстановлении окон, оставленных на "экранах" разъединенных мониторов (не совсем та же проблема как OP, но имел отношение) использует сочетание клавиш для увеличения окна: Ctrl
+ Super
+ в † ‘.
[N.B. Super
ключ с символом "Windows" на нем, обычно между Fn
и Alt
. На Mac это соответствует Command
= вЊ . На более старых версиях Ubuntu, чем мой (16.04) Вы, возможно, не должны были бы включать Ctrl
.]