假设我正在使用4个工作空间,并且我偶然需要更多工作空间,是否有一个自动化的流程,或者,如果不可能的话,是否有一种简便的方法来偶然地添加更多工作空间(而不是安装Ubuntu tweak
等)。
在backround脚本版本的下面,如果您输入了工作区矩阵的最后一列或最后一行,它将自动添加工作区。
它是这样工作的:
#!/usr/bin/env python3
import subprocess
import time
import math
# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10
def set_workspaces(size, axis):
subprocess.Popen([
"dconf", "write", "/org/compiz/profiles/unity/plugins/core/"+axis,
str(size)
])
def get_res():
resdata = subprocess.check_output(["xrandr"]).decode("utf-8").split()
curr = resdata.index("current")
return (int(resdata[curr+1]), int(resdata[curr+3].replace(",", "")))
def wspace():
try:
sp = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
return ([int(n) for n in sp[3].split("x")],
[int(n) for n in sp[5].split(",")])
except subprocess.CalledProcessError:
pass
def clean_up(curr_col, curr_row):
try:
w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
xpos = max([math.ceil((int(w[2])+span[1][0])/res[0]) for w in w_list])
min_x = max(xpos, curr_col+1, hsize)
if xpos >= hsize:
set_workspaces(min_x, "hsize")
else:
set_workspaces(min_x, "hsize")
ypos = max([math.ceil((int(w[3])+span[1][1])/res[1]) for w in w_list])
min_y = max(ypos, curr_row+1, vsize)
if ypos >= vsize:
set_workspaces(min_y, "vsize")
else:
set_workspaces(min_y, "vsize")
except subprocess.CalledProcessError:
pass
res = get_res()
t = 0
while True:
span = wspace()
if span != None:
cols = int(span[0][0]/res[0]); rows = int(span[0][1]/res[1])
currcol = int((span[1][0]+res[0])/res[0])
if all([currcol == cols, cols*rows < max_ws]):
set_workspaces(cols+1, "hsize")
currrow = int((span[1][1]+res[1])/res[1])
if all([currrow == rows, cols*rows < max_ws]):
set_workspaces(rows+1, "vsize")
if t == 10:
clean_up(currcol, currrow)
t = 0
else:
t = t+1
time.sleep(1)
add_space.py
如果您喜欢其他设置(最大工作空间数,默认矩阵,例如2x2),请在脚本的开头部分中编辑行:
# --- set default workspaces below (horizontally, vertically)
hsize = 2
vsize = 2
# --- set the maximum number of workspaces below
max_ws = 10
通过以下命令对其进行测试:
python3 /path/to/add_space.py
如果一切正常,请将其添加到启动应用程序:Dash>启动应用程序>添加命令:
/bin/bash -c "sleep 15 && python3 /path/to/add_space.py`
与往常一样,该脚本极其“耗时”,并且不会给处理器增加任何明显的负载。
下面的故事有点复杂,主要是对概念和过程的解释,而不是对代码的解释。仅在有兴趣时阅读。
如何计算所需的工作空间(示例列)
输出wmctrl -d
如下:
0 * DG: 3360x2100 VP: 1680,1050 WA: 65,24 1615x1026 N/A
在输出中,VP: 1680,1050
向我们提供有关跨越工作空间(所有视口矩阵)的位置的信息。仅当我们也具有屏幕的分辨率时,此信息才有用,因为例如1680
,宽度可能是屏幕的两倍(不太可能,但仍然)或一倍。
幸运的是,我们可以从命令中解析出屏幕的分辨率xrandr
。
然后,如果我们知道屏幕的x尺寸为1680
且当前为VP: 1680,1050
,则知道我们位于工作区矩阵的第二列中。由于我们还知道了总矩阵(的大小DG: 3360x2100
,也来自的输出wmctrl -d
),因此我们知道当前矩阵包括两列(3360/1680),位于“最后”一列上。
然后,脚本将发送一条指令,以通过以下命令在矩阵中添加一列:
dconf write /org/compiz/profiles/unity/plugins/core/hsize <current_viewport_column+1>
这就是原理。
如何计算要删除的工作空间(示例列)
该脚本每10秒运行一次,使用以下命令运行命令以列出所有当前打开的窗口:
wmctrl -lG
这也为我们提供了有关窗口位置的信息,如下所示:
0x04604837 0 3425 24 1615 1026 jacob-System-Product-Name Niet-opgeslagen document 2 - gedit
在输出中,3425
是窗口的x位置。但是,此图相对于当前工作空间(左侧)。为了知道窗口在工作区矩阵中的绝对位置(x方向),我们必须添加当前视口信息的第一个数字(例如VP: 1680,1050
,从的输出wmctrl -d
)。
但是,出于简单原因,让我们假设我们在视口1,1
(左上视口)上,因此窗口的相对位置等于其绝对位置。
由于屏幕的分辨率为1680
,因此我们知道窗口在column上是3425/1680
向上舍入的,因为之间的所有内容都在3360 and 5040
矩阵的同一列上(分辨率在3到4倍之间)。为了进行正确的计算,我们使用math.ceil()
(python
)
由于脚本还遵循该规则,因此始终在右/下具有一个额外的工作区,因此我们需要将列数设置为以下最高值:
脚本也是如此:)
这些行以完全相同的过程进行管理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句