有没有办法存储当前的桌面布局?

我希望能够保存我的应用程序的当前位置,所以当我打开相同的并运行某些东西时,它们会重新排列。

例如,如果我要打开一个崇高的和三个终端窗口,我希望能够以某种方式保存它。

在此处输入图像描述

我不在乎它是应用程序还是命令行工具,只要我可以轻松保存我的应用程序的位置。

我是Moom的忠实粉丝,不幸的是它仅适用于MacOS,而且在Ubuntu上我真的很想念它。 它支持更多的function,如果你知道一些接近它的东西,我的主要问题也很好。

注意

该脚本于2017年1月16日进行了修补/修复,修复了一些应用程序,其中进程名称运行应用程序命令不同。 可能这种情况偶尔发生在应用程序上。 如果有人找到,请发表评论。


用于记住和恢复窗口排列及其相应应用程序的脚本。

下面的脚本可以使用两个选项运行。 假设您有如下窗口排列:

在此处输入图像描述

读取 (记住)当前窗口排列及其应用程序,请使用以下选项运行脚本:

 

然后关闭所有窗口:

在此处输入图像描述

然后设置最后记住的窗口排列,使用以下选项运行它:

  

并将恢复最后记住的窗口安排:

在此处输入图像描述

这也将在重启后起作用。

将两个命令放在两个不同的快捷键下,您可以“记录”您的窗口排列,关闭计算机并在(例如)重启后调用相同的窗口排列。

脚本做什么,不做什么

使用选项-read运行

  • 该脚本使用wmctrl列出所有工作空间中的所有窗口,它们的位置,大小以及它们所属的应用程序
  • 然后,脚本将窗口位置从相对(转换到当前工作空间,如在wmctrl的输出中)“转换”到您的生成工作空间上的绝对位置。 因此,您想要记住的窗口是仅在一个工作区上还是分布在不同的工作区上并不重要。
  • 然后脚本“记住”当前窗口排列,将其写入主目录中的不可见文件。

使用选项-run

  • 该脚本读取最后记住的窗口排列; 它启动相应的应用程序,将窗口移动到记住的位置,也可以在wmctrl的帮助下

该脚本不记得可能在Windows中打开的文件, 也不记得(例如)在浏览器窗口中打开的网站。

问题

wmctrlUnity的组合有一些错误,例如:

  • wmctrl读取的窗口坐标与窗口定位命令略有不同,如此处所述。 因此,召回的窗口位置可能与原始位置略有不同。
  • 如果窗口的边缘非常接近Unity Launcher或面板,则wmctrl命令有点不可预测。
  • “记住的”窗口需要完全位于工作区边框内,以便wmctrl placement命令能够正常工作。

默认情况下,某些应用程序会在新选项卡(如gedit )的同一窗口中打开新窗口。 我为gedit修复了它,但如果你发现更多例外,请提及它。

剧本

 #!/usr/bin/env python3 import subprocess import os import sys import time 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 get_res(): # get resolution and the workspace correction (vector) xr = subprocess.check_output(["xrandr"]).decode("utf-8").split() pos = xr.index("current") res = [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )] vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split() curr_vpdata = [int(n) for n in vp_data[5].split(",")] return [res, curr_vpdata] app = lambda pid: subprocess.check_output(["ps", "-p", pid, "-o", "comm="]).decode("utf-8").strip() def read_windows(): res = get_res() w_list = [l.split() for l in get("wmctrl -lpG").splitlines()] relevant = [[w[2],[int(n) for n in w[3:7]]] for w in w_list if check_window(w[0]) == True] for i, r in enumerate(relevant): relevant[i] = app(r[0])+" "+str((" ").join([str(n) for n in r[1]])) with open(wfile, "wt") as out: for l in relevant: out.write(l+"\n") def open_appwindow(app, x, y, w, h): ws1 = get("wmctrl -lp"); t = 0 # fix command for certain apps that open in new tab by default if app == "gedit": option = " --new-window" else: option = "" # fix command if process name and command to run are different if "gnome-terminal" in app: app = "gnome-terminal" elif "chrome" in app: app = "/usr/bin/google-chrome-stable" subprocess.Popen(["/bin/bash", "-c", app+option]) # fix exception for Chrome (command = google-chrome-stable, but processname = chrome) app = "chrome" if "chrome" in app else app while t < 30: ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1] procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \ if app in p and w[2] in p] for w in ws2] if len(procs) > 0: time.sleep(0.5) w_id = procs[0][0][1] cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz" cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert" cmd3 = "wmctrl -ir "+procs[0][0][1]+" -e 0,"+x+","+y+","+w+","+h for cmd in [cmd1, cmd2, cmd3]: subprocess.call(["/bin/bash", "-c", cmd]) break time.sleep(0.5) t = t+1 def run_remembered(): res = get_res()[1] try: lines = [l.split() for l in open(wfile).read().splitlines()] for l in lines: l[1] = str(int(l[1]) - res[0]); l[2] = str(int(l[2]) - res[1] - 24) open_appwindow(l[0], l[1], l[2], l[3], l[4]) except FileNotFoundError: pass if arg == "-run": run_remembered() elif arg == "-read": read_windows() 

如何设置

在开始之前,请确保已安装wmctrl

 sudo apt-get install wmctrl 

然后:

  1. 将脚本复制到空文件中,将其保存为~/bin recall_windows 。 必要时创建目录。 如果该目录尚不存在,请在创建目录后运行source ~/.profile或注销/ in。 它现在将在$PATH
  2. 使脚本可执行(!)。
  3. 现在打开一些windows, geditfirefox或者其他任何东西,然后通过运行命令在终端上测试运行脚本(不需要路径前缀):

     recall_windows -read 
  4. 关上窗户。 现在在终端中运行:

     recall_windows -run 

现在应该恢复您的窗口设置

如果一切正常,请向快捷键添加两个命令:选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。 单击“+”并添加命令:

 recall_windows -read 

 recall_windows -run 

两个不同的快捷键

没有这样的程序。 你可以安装compiz cub:

sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-plugins

并按照这个方法

compiz是Unity / gnome最先进的桌面工具

我不知道实现这一目标的简单方法。

但是,我很少需要它,原因很简单:暂停。 暂停hibernate是你的朋友。 您不仅可以保存窗口位置,还可以保存系统的整个状态。 除了重新加载新的内核版本之外,我很少完全关闭计算机。

我写了一个小的库/命令行工具,它允许保存和恢复会话,并支持不同的监视器设置以及虚拟桌面。

安装

 npm install -g linux-window-session-manager 

用法

将当前会话保存到〜/ .lwsm / sessionData / DEFAULT.json

 lwsm save 

将当前会话保存到〜/ .lwsm / sessionData / my-session.json

 lwsm save my-session 

从〜/ .lwsm / sessionData / DEFAULT.json恢复会话

 lwsm restore 

从〜/ .lwsm / sessionData / my-session.json恢复会话

 lwsm restore my-session 

在开始会话之前,优雅地关闭所有正在运行的应用

 lwsm restore --closeAllOpenWindows 

看看: https : //github.com/johannesjo/linux-window-session-manager