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

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

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

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

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

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

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

Любая помощь будет признательна!

6
задан 2 June 2015 в 23:40

3 ответа

Возьмите "снимок" расположения окна и восстановите его

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

Как объяснено здесь, с помощью wmctrl i.c.w. Единица имеет некоторые проблемы. Если это удовлетворяет в Вашей ситуации, должен решить.

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

Использование сценария 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()
7
ответ дан 2 June 2015 в 23:40

При установке wmctrl, можно использовать "wmctrl - Глоссарий" для получения списка всех окон с их текущими позициями и размерами. Вы могли тогда использовать эту информацию на шаге 4 для вызова wmctrl с-e опцией восстановить размер и положение. Например:

wmctrl -ir <id> -e 0,<x>,<y>,<w>,<h>
0
ответ дан 2 June 2015 в 23:40

Если Вы предпочитаете NodeJs: Я записал немного инструмента библиотеки/командной строки, которые позволяют сохранять и восстанавливать сессии, и имеет поддержку различных установок мониторов, а также виртуальных рабочих столов. Вы могли бы хотеть проверить реализацию связанных с окном функций: https://github.com/johannesjo/linux-window-session-manager/blob/master/lib/x11-wrapper.js

можно найти все это здесь: https://github.com/johannesjo/linux-window-session-manager

2
ответ дан 3 June 2015 в 09:40
  • 1
    Это - хорошая идея, начальная загрузка из установщика usb на Wi-Fi подключила компьютеры. Выполните команду и получите все пакеты... Я буду пробовать это, надеяться, что это работает! – an offer can't refuse 1 September 2016 в 03:09

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

Похожие вопросы: