保存和恢复窗口位置

保存和恢复窗口位置

我遇到了一个错误,当机器从待机状态恢复时,通过显示端口(MST)连接的显示器不会重新启动,但是如果它重新启动了,窗口仍然在它覆盖的区域。

除了重新启动之外,恢复的唯一方法是禁用并重新启用显示,现在我可以通过命令行很好地执行此操作,但是当显示被禁用时,所有窗口都会重新排列到剩余的屏幕上。

有没有办法保留窗口位置并恢复它们,以便我的脚本可以执行以下序列:-

  1. 枚举窗口,存储位置
  2. 显示关闭(弄乱位置)
  3. 显示(使显示器再次工作,耶!)
  4. 恢复窗口的位置

我可以顺利完成第 2 步和第 3 步,但我不知道第 1 步和第 4 步

我知道我可以强制每个应用程序一个位置,但这不是我想要的,因为我可以做不同的事情,并在不同的位置有相同的应用程序,我也有多个终端打开,我需要以某种方式存储当前位置并恢复。

任何帮助,将不胜感激!

答案1

拍摄窗口布局的“快照”并恢复它

下面的脚本可用于获取所有“正常”窗口的当前窗口位置(使用参数运行-get),或恢复最后的窗口排列(使用参数运行-restore)。

正如解释的那样这里,使用wmctrlicw 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()

答案2

如果您安装了 wmctrl,则可以使用“wmctrl -Gl”获取所有窗口及其当前位置和大小的列表。然后您可以在步骤 4 中使用此信息使用 -e 选项调用 wmctrl 来恢复大小和位置。例如:

wmctrl -ir <id> -e 0,<x>,<y>,<w>,<h>

答案3

如果您更喜欢 NodeJs:我编写了一个小型库/命令行工具,它允许保存和恢复会话,并支持不同的显示器设置以及虚拟桌面。您可能想查看窗口相关功能的实现:https://github.com/johannesjo/linux-window-session-manager/blob/master/lib/x11-wrapper.js

你可以在这里找到完整内容:https://github.com/johannesjo/linux-window-session-manager

相关内容