有没有什么方法可以让 bash 脚本查找当前工作区(虚拟桌面)的名称?
这对于根据创建 shell 的桌面在我的 .bashrc 文件中自定义行为之类的事情似乎非常有用。
答案1
您可以使用wmctrl -d
列出所有工作区。*
代表当前工作区:
~$ wmctrl -d
0 * DG: 3840x1080 VP: 0,0 WA: 0,25 3840x1055 1
1 - DG: 3840x1080 VP: N/A WA: 0,25 3840x1055 2
2 - DG: 3840x1080 VP: N/A WA: 0,25 3840x1055 3
3 - DG: 3840x1080 VP: N/A WA: 0,25 3840x1055 4
因此,为了仅获取当前,请 grep *
:
~$ wmctrl -d | grep -w '*'
0 * DG: 3840x1080 VP: 0,0 WA: 0,25 3840x1055 1
希望这可以帮助!
答案2
Unity 中的视口
如果你正在使用统一,无法直接从中检索当前视口
wmctrl -d
因为 Unity 有视口,无法被直接检测到wmctrl -d
。输出将仅显示一个工作区:
0 * DG: 5040x2100 VP: 1680,1050 WA: 59,24 1621x1026 N/A
- 我的分辨率是 1680 x 1050 (来自
xrandr
) - 跨越工作空间(所有视口)为
5040x2100
。即 3x2 视口:5040/1680 = 3 和 2100 / 1050 = 2。 - 我当前位于(视口)位置
1680,1050
(x,y)
下面的脚本根据这些信息计算当前视口:
#!/usr/bin/env python3
import subprocess
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
def current():
# get the resolution (viewport size)
res = get_res()
# read wmctrl -d
vp_data = subprocess.check_output(
["wmctrl", "-d"]
).decode("utf-8").split()
# get the size of the spanning workspace (all viewports)
dt = [int(n) for n in vp_data[3].split("x")]
# calculate the number of columns
cols = int(dt[0]/res[0])
# calculate the number of rows
rows = int(dt[1]/res[1])
# get the current position in the spanning workspace
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
# current column (readable format)
curr_col = int(curr_vpdata[0]/res[0])
# current row (readable format)
curr_row = int(curr_vpdata[1]/res[1])
# calculate the current viewport
return curr_col+curr_row*cols+1
print(current())
使用方法:
安装
wmctrl
sudo apt install wmctrl
通过命令运行
python3 /path/to/get_viewport.py
它将输出 1、2、3 或当前视口的任何值。它会自动计算视口配置可能包含的行/列。
解释
剧本
- 从 获取一个视口的大小(分辨率)
xrandr
,包括可能的额外显示器。 - 获取当前位置在跨越工作空间上
- 计算视口设置中的列数/行数
- 由此计算出当前视口
答案3
至少在 Gnome shell 中,但可能在其他 WM 中也是如此,您可以直接询问 Xserver(如果在 Wayland 中,则不知道)。
[romano:~/tmp] % desktop=$(xprop -root -notype _NET_CURRENT_DESKTOP | perl -pe 's/.*?= (\d+)/$1/')
[romano:~/tmp] % echo $desktop
1
基本上,命令xprop
将返回
[romano:~/tmp] % xprop -root -notype _NET_CURRENT_DESKTOP
_NET_CURRENT_DESKTOP = 1
然后您可以稍微调整一下信息来获得您需要的信息。