我希望能够保存应用程序的当前位置,因此,当我要打开相同的应用程序并运行某些内容时,它们将按原样重新排列。
例如,如果我要打开一个崇高色和三个终端窗口,我希望能够以某种方式保存它。
我不在乎它是应用程序还是命令行工具,只要我可以轻松保存应用程序的位置即可。
我是Moom的忠实拥护者,但不幸的是,它仅适用于MacOS,而在Ubuntu上我真的很想念它。它支持更多功能,如果您最了解我的主要问题,那还可以。
我希望能够保存应用程序的当前位置,因此,当我要打开相同的应用程序并运行某些内容时,它们将按原样重新排列。
例如,如果我要打开一个崇高色和三个终端窗口,我希望能够以某种方式保存它。
我不在乎它是应用程序还是命令行工具,只要我可以轻松保存应用程序的位置即可。
我是Moom的忠实拥护者,但不幸的是,它仅适用于MacOS,而在Ubuntu上我真的很想念它。它支持更多功能,如果您最了解我的主要问题,那还可以。
Answers:
该脚本于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
然后:
recall_windows
在~/bin
。如有必要,创建目录。如果目录尚不存在,source ~/.profile
请在创建目录后运行任一目录或注销/登录。现在它将在$PATH
现在打开几个窗口,gedit
,firefox
或什么的,并通过运行命令(没有路径前缀需要)试运行在终端的脚本:
recall_windows -read
关闭窗户。现在在终端中运行:
recall_windows -run
现在应恢复您的窗口设置
如果一切正常,请向快捷键添加两个命令:选择:“系统设置”>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加命令:
recall_windows -read
和
recall_windows -run
到两个不同的快捷键
我写了一个小的库/命令行工具,它可以保存和还原会话,并支持不同的显示器设置以及虚拟桌面。
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
没有这样的程序。您可以安装compiz cub:
sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-plugins
并遵循此方法
compiz是用于unity / gnome的最先进的桌面工具