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


29

我希望能够保存应用程序的当前位置,因此,当我要打开相同的应用程序并运行某些内容时,它们将按原样重新排列。

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

在此处输入图片说明

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

我是Moom的忠实拥护者,但不幸的是,它仅适用于MacOS,而在Ubuntu上我真的很想念它。它支持更多功能,如果您最了解我的主要问题,那还可以。


@VitaliusKuchalskis 窗口布局可以吗,还是应该是相应的打开文件?您的窗口管理器是什么?(团结?)
Jacob Vlijm

我不知道您在说什么窗口布局?我认为有或将有一个工具可以保存和加载每个工作区的窗口位置和大小。到目前为止,我发现了[wmctrl](en.wikipedia.org/wiki/Wmctrl)。但这需要编写脚本或更改配置才能实现此功能。因此,我想知道是否有人已经做到了这一点,并且乐于分享。
Qualphey

@VitaliusKuchalskis您可以看一看吗:askubuntu.com/questions/631392/…这假定窗口保持打开状态,但是我想您想在还原后关闭计算机并重新放置窗口位置大小和位置(布局)。然后,一个重要的问题是,您是在引用应用程序窗口,还是在窗口内部打开的文件。
Jacob Vlijm

当然只有应用程序窗口。
Qualphey

从屏幕快照中,您似乎喜欢/使用窗口的平铺形式。您绝对应该尝试平铺WM,例如i3。
nixpower 2015年

Answers:


26

注意

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


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

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

在此处输入图片说明

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

<script> -read

然后关闭所有窗口:

在此处输入图片说明

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

<script> -run

最后记忆的窗口排列将恢复:

在此处输入图片说明

重新启动后也可以使用。

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

该脚本做什么,什么不做什么

使用选项运行 -read

  • 该脚本用于wmctrl列出所有工作区中的所有窗口,它们的位置,大小,所属的应用程序
  • 然后,脚本将跨工作区上的窗口位置从相对(相对于当前工作区,如的输出wmctrl)“转换” 为绝对位置。因此,要记住的窗口是仅在一个工作区上还是分布在不同的工作区上都没有关系。
  • 然后,脚本“记住”当前的窗口排列,将其写入主目录中的不可见文件中。

使用选项运行 -run

  • 脚本读取最后记住的窗口排列;它会启动相应的应用程序,还将窗口移动到记住的位置,同时借助wmctrl

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

问题

的组合wmctrl,并Unity有一些错误,几个例子:

  • 窗口坐标系,如通过阅读wmctrl不同略微形成命令到定位的窗口,如所提到这里。因此,调用的窗口位置可能与原始位置略有不同。
  • wmctrl命令工作的比特不可预知的,如果窗口的边缘非常接近任一Unity Launcher或面板。
  • “记住的”窗口必须完全位于工作空间边界内,以便wmctrl放置命令正常运行。

默认情况下,某些应用程序会在新标签(例如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. 脚本复制到一个空文件,将其保存为recall_windows~/bin。如有必要,创建目录。如果目录尚不存在,source ~/.profile请在创建目录后运行任一目录或注销/登录。现在它将在$PATH
  2. 使脚本可执行(!)。
  3. 现在打开几个窗口,geditfirefox或什么的,并通过运行命令(没有路径前缀需要)试运行在终端的脚本:

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

    recall_windows -run
    

现在应恢复您的窗口设置

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

recall_windows -read

recall_windows -run

到两个不同的快捷键


2
哈哈!只要阅读第一段,我就知道那是你的!(已投票)
Fabby 2015年

@Fabby并庆祝我的假期:)
Jacob Vlijm

看起来很棒!现在,您可以轻松地为设置名称添加第二个参数,然后存储/恢复不同的环境,clientA,clientB,home,..很酷!
巴基2015年

不同的版本会很棒,如果可以关闭程序,那就更好了。想想当妻子进来时屏幕上是否有任何东西,我可以轻松地使它看起来像我在工作!
Jamie Hutber '16


4

我写了一个小的库/命令行工具,它可以保存和还原会话,并支持不同的显示器设置以及虚拟桌面。

安装

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


1
很棒!这应该是最佳答案。
user3751385 '18

2

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

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

并遵循此方法

compiz是用于unity / gnome的最先进的桌面工具


1

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

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


嗯,我不切换它或任何..但我打开你知道新的终端,另一个项目,该浏览器是越来越封闭或什么的,等等。截图只是一个例子..
拉立卑

嗯,是。我有几周没有接触过的台式机,其中包含几个与特定项目相关的终端窗口,浏览器窗口,R图形显示窗口。
1

挂起是我在笔记本电脑上使用的解决方案,但是,对于台式机来说,它要复杂一些,因为必须要有一个零头。
cantoni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.