Como eu procuro o nome da área de trabalho atual?

10

Existe alguma maneira de um script bash procurar o nome do espaço de trabalho atual (área de trabalho virtual)?

Isso parece realmente útil para coisas como personalizar comportamentos no meu arquivo .bashrc baseado na área de trabalho na qual o shell foi criado.

    
por DonGar 06.04.2017 / 23:37

3 respostas

13

Você pode fazer isso com wmctrl -d para listar todos os espaços de trabalho. O * representa a área de trabalho atual:

~$ 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

Portanto, para obter apenas o atual, grep para o * :

~$ wmctrl -d | grep -w '*'
0  * DG: 3840x1080  VP: 0,0  WA: 0,25 3840x1055  1

Espero que isso ajude!

    
por Terrance 06.04.2017 / 23:49
9

Viewports na unidade

Se você estiver usando o Unity , a viewport atual não poderá ser recuperada diretamente de

wmctrl -d

pois o Unity tem viewports, que não são detectadas diretamente por wmctrl -d . A saída mostrará apenas uma área de trabalho:

0  * DG: 5040x2100  VP: 1680,1050  WA: 59,24 1621x1026  N/A
  • onde minha resolução é 1680 x 1050 (de xrandr )
  • a área de trabalho de abrangência (todas as viewports) é 5040x2100 . Isso é 3x2 viewports: 5040/1680 = 3 e 2100/1050 = 2.
  • No momento, estou na posição (viewport-) 1680,1050 (x, y)

O script abaixo calcula a viewport atual a partir dessas informações:

#!/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())

Para usar:

  1. Instale wmctrl

    sudo apt install wmctrl
    
  2. Execute-o pelo comando

    python3 /path/to/get_viewport.py
    

    Ele produzirá 1, 2, 3 ou qualquer que seja a viewport atual. Ele conta automaticamente as linhas / colunas que sua configuração de viewport pode incluir.

Explicação

O script

  • obtém o tamanho de uma viewport (resolução) de xrandr , incluindo possíveis monitores extras.
  • obtém a posição atual na área de trabalho de abrangência
  • calcula o número de colunas / linhas na configuração da sua janela de visualização
  • a partir disso, calcula a viewport atual
por Jacob Vlijm 07.04.2017 / 00:13
3

Pelo menos no shell do Gnome, mas provavelmente em outro WM também, você pode perguntar ao Xserver diretamente (se estiver no Wayland, não tem ideia).

[romano:~/tmp] % desktop=$(xprop -root -notype  _NET_CURRENT_DESKTOP | perl -pe 's/.*?= (\d+)//') 
[romano:~/tmp] % echo $desktop
1

Basicamente, o comando xprop retornará

 [romano:~/tmp] % xprop -root -notype  _NET_CURRENT_DESKTOP
 _NET_CURRENT_DESKTOP = 1

e então você pode massagear um pouco a informação para conseguir o que precisa.

    
por Rmano 07.04.2017 / 09:42