假设我正在使用 4 个工作区,而我偶然需要更多工作区,是否有一个自动化过程,或者,如果不可能的话,是否有一种简单的方法来偶然添加更多工作区(而不是安装Ubuntu tweak
等等)。
答案1
自动设置工作区的数量;根据需要添加和删除列和行
下面是一个背景脚本的版本,如果您输入了工作区矩阵的最后一列或行,它将自动添加工作区。
工作原理如下:
如果您到达最后一列或最后一行,则会添加额外的视口:
如果你的工作空间 5-10 秒内没有使用和如果上面没有窗口,则将再次删除附加工作区。但是,您将始终在当前视口下方保留一行额外行,并在其右侧保留一列额外列:
剧本:
#!/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
,我们知道窗口位于列上3425/1680
,四舍五入,因为介于之间的所有内容3360 and 5040
都位于矩阵中的同一列上(介于分辨率的 3 到 4 倍之间)。为了正确计算,我们使用math.ceil()
( python
)
由于剧本还为了遵循在右侧/下方始终留有额外工作空间的规则,我们需要将列数设置为最高的价值:
- 这当前的工作区列 + 1
- 这最后的有窗户的柱子
- 默认列数,在脚本头部设置
脚本确实如此:)
行的管理遵循完全相同的程序。
答案2
从技术上讲,没有调整工作区大小的快捷方式,但您可以使用下面的简单脚本并将其绑定到快捷方式。
- 获取下面的脚本,将其保存在
.local/share/applications
文件夹中,或者您喜欢的任何位置。 - 确保脚本可执行
chmod 755 /path/to/script
- 在系统设置 -> 键盘 -> 快捷方式 -> 自定义快捷方式中将其绑定到快捷方式
例如,我有这样的设置:
该脚本已绑定到ShiftCtrlAltI。但CtrlAltI也可以工作。我给出了脚本的完整路径,即
/home/xieerqi/resize-workspaces.sh
它看起来应该是这样的:
脚本
#!/bin/bash
# Author : Serg Kolo
# Date: Sept 19, 2015
# Purpose: simple script to resize
# unity workspaces
# Written for: http://askubuntu.com/q/676046/295286
HEIGHT=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize)
WIDTH=$(gsettings get org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize)
NEWSIZE=$(zenity --entry --text="Current desktop set-up $HEIGHT x $WIDTH. Enter new setup in HEIGHTxWIDTH format" --width=250 | tr 'x' ' ' )
ARRAY=( $NEWSIZE )
[ -z ${ARRAY[1]} ] && exit
gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize ${ARRAY[0]}
gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize ${ARRAY[1]}
使用非常简单,设置非常简单