¿Cómo busco el nombre del espacio de trabajo actual?

11

¿Hay alguna forma de que un script bash busque el nombre del espacio de trabajo actual (escritorio virtual)?

Esto parece realmente útil para cosas como personalizar comportamientos en mi archivo .bashrc en función del escritorio en el que se creó el shell.

DonGar
fuente
¿Cuál es tu administrador de ventanas?
Jacob Vlijm
Estoy usando el escritorio Cinnamon instalado en Ubuntu. Pensé que había dicho, pero cuando edité la pregunta, debo haberme retirado demasiado.
DonGar
1
Bajo Cinnamon, esto le da la última palabra en el nombre del escritorio. Eso es lo suficientemente bueno para mi caso de uso. escritorio =wmctrl -d | grep '*' | sed 's/.* //g'
DonGar

Respuestas:

13

Puede hacerlo wmctrl -dpara enumerar todos los espacios de trabajo. El *representa el espacio de trabajo actual:

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

Entonces, para obtener solo la corriente, grep para *:

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

¡Espero que esto ayude!

Terrance
fuente
Si OP usa Unity, solo hay un espacio de trabajo :), también en la salida dewmctrl -d
Jacob Vlijm
@JacobVlijm Entonces OP probablemente no se preocuparía por esto si hubiera un solo espacio de trabajo. :)
Terrance
Por supuesto que lo hará, pero luego se llaman ventanas gráficas, y no se pueden recuperar directamente desde wmctrl -d.
Jacob Vlijm
@JacobVlijm Bueno, una luz brillante es que Unity ya no será la predeterminada y se habrá ido después del lanzamiento de 18.04. : D
Terrance
De hecho, me gusta, y probablemente será bifurcado.
Jacob Vlijm
11

Viewports en Unity

Si está utilizando Unity , la ventana gráfica actual no se puede recuperar directamente de

wmctrl -d

dado que Unity tiene viewports, que no son detectados directamente por wmctrl -d. La salida mostrará solo un espacio de trabajo:

0  * DG: 5040x2100  VP: 1680,1050  WA: 59,24 1621x1026  N/A
  • donde mi resolución es 1680 x 1050 (desde xrandr)
  • el espacio de trabajo que abarca (todas las ventanas gráficas) es 5040x2100. Eso es 3x2 viewports: 5040/1680 = 3 y 2100/1050 = 2.
  • Actualmente estoy en la posición (viewport-) 1680,1050(x, y)

El siguiente script calcula la ventana gráfica actual a partir de esta información:

#!/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 en pc wmctrl

    sudo apt install wmctrl
    
  2. Ejecútalo por el comando

    python3 /path/to/get_viewport.py
    

    Producirá 1, 2, 3 o lo que sea la ventana gráfica actual. Cuenta automáticamente las filas / columnas que puede incluir la configuración de su ventana gráfica.

Explicación

ingrese la descripción de la imagen aquí

La secuencia de comandos

  • obtiene el tamaño de una ventana gráfica (resolución) xrandr, incluidos los posibles monitores adicionales.
  • obtiene la posición actual en el espacio de trabajo que abarca
  • galcula el número de columnas / filas en la configuración de su ventana gráfica
  • a partir de eso, calcula la ventana gráfica actual
Jacob Vlijm
fuente
1
¡Independientemente de cómo me sienta acerca de Unity, este script funciona muy bien! ¡Bien hecho! +1
Terrance
3

Al menos en el shell Gnome, pero probablemente también en otros WM, puede preguntar directamente al Xserver (si está en Wayland, no tengo idea).

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

Básicamente, el comando xpropvolverá

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

y luego puedes masajear un poco la información para obtener lo que necesitas.

Rmano
fuente
Ese es el número del espacio de trabajo, no el nombre. Para obtener el nombre, debe buscar el número en la propiedad _NET_DESKTOP_NAMES.
Gilles 'SO- deja de ser malvado'