Сохранение и восстановление позиций окна

Я обнаружил ошибку, из-за которой, когда машина возвращается из режима ожидания, монитор, подключенный через DisplayPort (MST), не возвращается, однако окна все еще находятся в той области, которую он закрывал, если он все же включился.

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

Есть ли способ сохранить позиции окна и восстановить их, чтобы мой сценарий мог выполнить эту последовательность:-

  1. перечислять окна, хранить позиции
  2. выключить дисплей (испортить позиции)
  3. дисплей включен (заставить дисплей работать снова, ууу!)
  4. восстановить положение окон

Я могу сделать шаг 2 и 3 просто отлично, но я потерян для шага 1 и 4

Я знаю, что могу форсировать позицию для каждого приложения, но это не то, что я хочу, потому что я могу делать разные вещи и иметь одни и те же приложения в разных позициях, у меня также открыто несколько терминалов, мне нужно как-то сохранять текущие позиции и восстанавливать их.

Любая помощь будет оценена!

3 ответа

Решение

Сделайте "снимок" расположения окон и восстановите его

Сценарий, приведенный ниже, можно использовать для получения текущей позиции окна всех "обычных" окон (запускается с аргументом -get) или восстановите последнее расположение окон (запустите с аргументом -restore).

Как объяснено здесь, используя wmctrl У icw Unity есть некоторые проблемы. Если это удовлетворительно в вашей ситуации, это решить.

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

Скрипт использует wmctrl:

sudo apt-get install wmctrl

Затем:

  1. Скопируйте скрипт в пустой файл, сохраните его как window_arrange.py
  2. Запустите его:

    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

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