我遇到了一个错误,当机器从待机状态恢复时,通过显示端口(MST)连接的显示器不会重新启动,但是如果它重新启动了,窗口仍然在它覆盖的区域。
除了重新启动之外,恢复的唯一方法是禁用并重新启用显示,现在我可以通过命令行很好地执行此操作,但是当显示被禁用时,所有窗口都会重新排列到剩余的屏幕上。
有没有办法保留窗口位置并恢复它们,以便我的脚本可以执行以下序列:-
- 枚举窗口,存储位置
- 显示关闭(弄乱位置)
- 显示(使显示器再次工作,耶!)
- 恢复窗口的位置
我可以顺利完成第 2 步和第 3 步,但我不知道第 1 步和第 4 步
我知道我可以强制每个应用程序一个位置,但这不是我想要的,因为我可以做不同的事情,并在不同的位置有相同的应用程序,我也有多个终端打开,我需要以某种方式存储当前位置并恢复。
任何帮助,将不胜感激!
答案1
拍摄窗口布局的“快照”并恢复它
下面的脚本可用于获取所有“正常”窗口的当前窗口位置(使用参数运行-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()
答案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