Como procuro o nome do espaço de trabalho atual?

11

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, com base na área de trabalho na qual o shell foi criado.

DonGar
fonte
Qual é o seu gerenciador de janelas?
Jacob Vlijm
Estou usando o Cinnamon desktop instalado no Ubuntu. Eu pensei que tinha dito, mas quando editei a pergunta, devo ter desistido demais.
Dongar
1
Em Canela, isso fornece a última palavra no nome da área de trabalho. Isso é bom o suficiente para o meu caso de uso. área de trabalho =wmctrl -d | grep '*' | sed 's/.* //g'
Dongar

Respostas:

13

Você pode fazer isso com wmctrl -dpara listar todos os espaços de trabalho. O *representa o espaço 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 isto ajude!

Terrance
fonte
Se OP usa Unidade, há apenas um espaço de trabalho :), também na saídawmctrl -d
Jacob Vlijm
@JacobVlijm Então o OP provavelmente não se preocuparia com isso se houvesse apenas um espaço de trabalho. :)
Terrance
Claro que sim, mas então eles são chamados de viewports, e não podem ser recuperados diretamente de wmctrl -d.
Jacob Vlijm
@JacobVlijm Bem, uma luz brilhante é que o Unity não será mais o padrão e desapareceu após o lançamento do 18.04. : D
Terrance
Na verdade, eu gosto e provavelmente será bifurcada.
Jacob Vlijm
11

Viewports no Unity

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

wmctrl -d

desde que o Unity tenha viewports, que não são detectados diretamente por wmctrl -d. A saída mostrará apenas um espaço de trabalho:

0  * DG: 5040x2100  VP: 1680,1050  WA: 59,24 1621x1026  N/A
  • onde minha resolução é 1680 x 1050 (de xrandr)
  • o espaço de trabalho de abrangência (todas as viewports) é 5040x2100. Ou seja, viewports 3x2: 5040/1680 = 3 e 2100/1050 = 2.
  • Atualmente, estou na posição 1680,1050( janela de visualização) (x, y)

O script abaixo calcula a viewport atual com essas 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())

Usar:

  1. Instalar 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 linhas / colunas que sua configuração da janela de exibição pode incluir.

Explicação

insira a descrição da imagem aqui

O script

  • obtém o tamanho de uma viewport (resolução) xrandr, incluindo possíveis monitores extras.
  • obtém a posição atual na área de trabalho de abrangência
  • galcula o número de colunas / linhas na configuração da janela de visualização
  • a partir disso, calcula a viewport atual
Jacob Vlijm
fonte
1
Independentemente de como eu me sinta sobre o Unity, esse script funciona muito bem! Bem feito! 1
Terrance
3

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

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

Basicamente, o comando xpropretornará

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

e então você pode massagear um pouco as informações para obter o que precisa.

Rmano
fonte
Esse é o número da área de trabalho, não o nome. Para obter o nome, você deve procurar o número na propriedade _NET_DESKTOP_NAMES.
Gilles 'SO- stop be evil'