Я обнаружил ошибку, из-за которой, когда машина возвращается из режима ожидания, монитор, подключенный через DisplayPort (MST), не возвращается, однако окна все еще находятся в той области, которую он закрывал, если он включился.
Единственный способ восстановиться после этого перезапуска - это отключить и снова включить дисплей, теперь я могу сделать это через командную строку, но когда дисплей отключен, все окна переставляются на оставшийся экран.
Есть ли способ сохранить позиции окон и восстановить их, чтобы мой сценарий мог выполнить следующую последовательность действий: -
Я могу сделать шаги 2 и 3 просто отлично, но я Я потерян для шагов 1 и 4
Я знаю, что могу форсировать позицию для приложения, но это не то, чего я хочу, потому что я могу делать разные вещи и иметь одни и те же приложения в разных позициях, у меня также есть несколько терминалов открыть, мне нужно как-то сохранить и восстановить текущие позиции.
Любая помощь будет признательна!
Сценарий ниже может использоваться для получения текущих положений окна всех "нормальных" окон (выполненный с аргументом -get
), или восстановление последнее расположение окна (выполненный с аргументом -restore
).
Как объяснено здесь, с помощью wmctrl
i.c.w. Единица имеет некоторые проблемы. Если это удовлетворяет в Вашей ситуации, должен решить.
Использование сценария 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 - Глоссарий" для получения списка всех окон с их текущими позициями и размерами. Вы могли тогда использовать эту информацию на шаге 4 для вызова wmctrl с-e опцией восстановить размер и положение. Например:
wmctrl -ir <id> -e 0,<x>,<y>,<w>,<h>
Если Вы предпочитаете NodeJs: Я записал немного инструмента библиотеки/командной строки, которые позволяют сохранять и восстанавливать сессии, и имеет поддержку различных установок мониторов, а также виртуальных рабочих столов. Вы могли бы хотеть проверить реализацию связанных с окном функций: https://github.com/johannesjo/linux-window-session-manager/blob/master/lib/x11-wrapper.js
можно найти все это здесь: https://github.com/johannesjo/linux-window-session-manager