如何查找当前工作空间的名称?


11

bash脚本有什么方法可以查找当前工作空间(虚拟桌面)的名称?

这对于基于创建外壳程序的桌面自定义.bashrc文件中的行为之类的事情确实很有用。


您的窗口管理员是什么?
Jacob Vlijm

我正在使用在Ubuntu上安装的Cinnamon桌面。我以为我已经说过了,但是当我编辑下来的问题时,我肯定抽了太多。
DonGar

1
在Cinnamon下,这给出了桌面名称中的最后一个单词。这对于我的用例来说已经足够了。桌面=wmctrl -d | grep '*' | sed 's/.* //g'
DonGar

Answers:


13

您可以使用它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

希望这可以帮助!


如果OP使用Unity,则只有一个工作区:),在wmctrl -d
Jacob Vlijm

@JacobVlijm如果只有一个工作区,OP可能不会为此担心。:)
Terrance

他当然会的,但是后来它们被称为视口,并且不能直接从获取wmctrl -d
Jacob Vlijm'4

@JacobVlijm好吧,一个亮点是Unity将不再是默认值,并且在18.04版本发布后就消失了。:D
Terrance

我实际上很喜欢它,它可能会分叉。
Jacob Vlijm

11

Unity中的视口

如果您使用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())

使用方法:

  1. 安装 wmctrl

    sudo apt install wmctrl
    
  2. 通过命令运行

    python3 /path/to/get_viewport.py
    

    它将输出1、2、3或任何当前视口。它会自动计算视口配置可能包括的行/列。

说明

在此处输入图片说明

剧本

  • 从中获取一个视口的大小(分辨率)xrandr,包括可能的额外监视器。
  • 获取跨工作区上的当前位置
  • 计算视口设置中的列数/行数
  • 据此计算当前视口

1
无论我对Unity的看法如何,此脚本都可以很好地运行!做得很好!+1
Terrance

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

然后您可以按摩一些信息以获取所需的信息。


那是工作空间编号,而不是名称。要获得名称,您必须在属性中查找数字_NET_DESKTOP_NAMES
吉尔(Gilles)'所以
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.