保存和恢复窗口位置
我遇到一个错误,当机器从待机状态返回时,通过displayport(MST)连接的监视器不会重新启动,但是如果窗口确实亮起,窗口仍然在它所覆盖的区域内。
从这个短暂的重启中恢复的唯一方法是禁用并重新启用显示现在我可以通过命令行就可以了,但是当显示被禁用时,所有的窗口都会被重新排列到剩余的屏幕上。
有没有办法保持窗口位置并恢复它们,以便我的脚本可以执行以下顺序: –
- 枚举窗口,存储位置
- 炫耀(搞乱位置)
- 显示(让显示再次工作,耶!)
- 恢复窗口的位置
我可以做第2步和第3步就好了,但我已经输掉了第1步和第4步
我知道我可以强制每个应用程序的位置,但这不是我想要的,因为我可以做不同的事情,并在不同的位置有相同的应用程序,我也有多个终端打开,我需要以某种方式存储和恢复的当前位置。
任何帮助,将不胜感激!
拍摄窗口排列的“快照”并恢复它
下面的脚本可用于获取所有“普通”窗口的当前窗口位置(使用参数-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()
如果您安装wmctrl,您可以使用“wmctrl -Gl”获取所有窗口的列表及其当前位置和大小。 然后,您可以在步骤4中使用此信息来使用-e选项调用wmctrl以恢复大小和位置。 例如:
wmctrl -ir -e 0,,,,
如果你更喜欢NodeJs:我写了一个小的库/命令行工具,它允许保存和恢复会话,并支持不同的监视器设置和虚拟桌面。 您可能想要查看窗口相关function的实现: https : //github.com/johannesjo/linux-window-session-manager/blob/master/lib/x11-wrapper.js
你可以在这里找到整件事: https : //github.com/johannesjo/linux-window-session-manager