Сохранение и восстановление позиций окна
Я обнаружил ошибку, из-за которой, когда машина возвращается из режима ожидания, монитор, подключенный через DisplayPort (MST), не возвращается, однако окна все еще находятся в той области, которую он закрывал, если он все же включился.
Единственный способ восстановиться после этого перезапуска - это отключить и снова включить дисплей, теперь я могу сделать это через командную строку, но когда дисплей отключен, все окна переставляются на оставшийся экран.
Есть ли способ сохранить позиции окна и восстановить их, чтобы мой сценарий мог выполнить эту последовательность:-
- перечислять окна, хранить позиции
- выключить дисплей (испортить позиции)
- дисплей включен (заставить дисплей работать снова, ууу!)
- восстановить положение окон
Я могу сделать шаг 2 и 3 просто отлично, но я потерян для шага 1 и 4
Я знаю, что могу форсировать позицию для каждого приложения, но это не то, что я хочу, потому что я могу делать разные вещи и иметь одни и те же приложения в разных позициях, у меня также открыто несколько терминалов, мне нужно как-то сохранять текущие позиции и восстанавливать их.
Любая помощь будет оценена!
3 ответа
Сделайте "снимок" расположения окон и восстановите его
Сценарий, приведенный ниже, можно использовать для получения текущей позиции окна всех "обычных" окон (запускается с аргументом -get
) или восстановите последнее расположение окон (запустите с аргументом -restore
).
Как объяснено здесь, используя wmctrl
У icw Unity есть некоторые проблемы. Если это удовлетворительно в вашей ситуации, это решить.
Как пользоваться
Скрипт использует wmctrl
:
sudo apt-get install wmctrl
Затем:
- Скопируйте скрипт в пустой файл, сохраните его как
window_arrange.py
Запустите его:
python3 /path/to/window_arrange.py -get
"записать" текущее расположение окон и
python3 /path/to/window_arrange.py -restore
восстановить последнее "записанное" расположение окон
Сценарий:
#!/usr/bin/env python3
import subprocess
import os
import sys
wfile = os.environ["HOME"]+"/.windowlist"
arg = sys.argv[1]
def get(command):
return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
def check_window(w_id):
w_type = get("xprop -id "+w_id)
if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
return True
else:
return False
def read_windows():
w_list = [l.split()[:6] for l in get("wmctrl -lG").splitlines()]
relevant = [(" ").join(w) for w in w_list if check_window(w[0]) == True]
with open(wfile, "wt") as out:
for item in relevant:
out.write(item+"\n")
def restore_windows():
try:
wlist = [l.split() for l in open(wfile).read().splitlines()]
except FileNotFoundError:
pass
else:
for w in wlist:
try:
cmd = "wmctrl -ir "+w[0]+" -e 0,"+(",").join(w[2:])
subprocess.Popen(["/bin/bash", "-c", cmd])
except:
pass
if arg == "-restore":
restore_windows()
elif arg == "-get":
read_windows()
Если вы устанавливаете wmctrl, вы можете использовать "wmctrl -Gl", чтобы получить список всех окон с их текущими позициями и размерами. You could then use this information in step 4 to call wmctrl with the -e option to restore the size and position. Например:
wmctrl -ir <id> -e 0,<x>,<y>,<w>,<h>
Если вы предпочитаете NodeJ: я написал небольшой инструмент библиотеки / командной строки, который позволяет сохранять и восстанавливать сессии и поддерживает различные настройки мониторов, а также виртуальные рабочие столы. Возможно, вы захотите проверить реализацию связанных с окном функций: https://github.com/johannesjo/linux-window-session-manager/blob/master/lib/x11-wrapper.js
Вы можете найти все это здесь: https://github.com/johannesjo/linux-window-session-manager