Comment rechercher le nom de l'espace de travail actuel?

11

Existe-t-il un moyen pour un script bash de rechercher le nom de l'espace de travail actuel (bureau virtuel)?

Cela semble vraiment utile pour des choses comme la personnalisation des comportements dans mon fichier .bashrc en fonction du bureau sur lequel le shell a été créé.

DonGar
la source
Quel est votre gestionnaire de fenêtres?
Jacob Vlijm
J'utilise le bureau Cinnamon installé sur Ubuntu. Je pensais l'avoir dit, mais quand j'ai édité la question, j'ai dû trop me retirer.
DonGar
1
Sous Cinnamon, cela donne le dernier mot du nom du bureau. C'est assez bon pour mon cas d'utilisation. desktop =wmctrl -d | grep '*' | sed 's/.* //g'
DonGar

Réponses:

13

Vous pouvez le faire avec wmctrl -dpour répertorier tous les espaces de travail. Le *représente l'espace de travail actuel:

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

Donc, pour obtenir uniquement le courant, grep pour le *:

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

J'espère que cela t'aides!

Terrance
la source
Si OP utilise Unity, il n'y a qu'un seul espace de travail :), également dans la sortie dewmctrl -d
Jacob Vlijm
@JacobVlijm Alors OP ne s'inquiéterait probablement pas de cela s'il n'y avait qu'un seul espace de travail. :)
Terrance
Bien sûr qu'il le fera, mais alors ils sont appelés des fenêtres, et non directement récupérables à partir de wmctrl -d.
Jacob Vlijm du
@JacobVlijm Eh bien, une lumière brillante est que Unity ne sera plus la valeur par défaut et disparaîtra après la sortie du 18.04. : D
Terrance
Je l'aime vraiment, et il sera probablement fourchu.
Jacob Vlijm
11

Fenêtres dans Unity

Si vous utilisez Unity , la fenêtre actuelle ne peut pas être récupérée directement à partir de

wmctrl -d

car Unity possède des fenêtres qui ne sont pas détectées directement par wmctrl -d. La sortie n'affichera qu'un seul espace de travail:

0  * DG: 5040x2100  VP: 1680,1050  WA: 59,24 1621x1026  N/A
  • où ma résolution est de 1680 x 1050 (à partir de xrandr)
  • l'espace de travail s'étendant (toutes les fenêtres) est 5040x2100. Soit des fenêtres 3x2: 5040/1680 = 3 et 2100/1050 = 2.
  • Je suis actuellement en (vue-) position 1680,1050(x, y)

Le script ci-dessous calcule la fenêtre actuelle à partir de ces informations:

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

Utiliser:

  1. Installer wmctrl

    sudo apt install wmctrl
    
  2. Exécutez-le par la commande

    python3 /path/to/get_viewport.py
    

    Il affichera 1, 2, 3 ou quelle que soit la fenêtre courante. Il compte automatiquement les lignes / colonnes que votre configuration de fenêtre peut inclure.

Explication

entrez la description de l'image ici

Le scénario

  • obtient la taille d'une fenêtre (résolution) xrandr, y compris les éventuels moniteurs supplémentaires.
  • obtient la position actuelle sur l'espace de travail s'étendant
  • calcule le nombre de colonnes / lignes dans la configuration de votre fenêtre
  • à partir de cela, il calcule la fenêtre courante
Jacob Vlijm
la source
1
Peu importe ce que je ressens pour Unity, ce script fonctionne très bien! Bien fait! +1
Terrance
3

Au moins dans le shell Gnome, mais probablement dans d'autres WM aussi, vous pouvez demander directement au Xserver (si dans Wayland, aucune idée).

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

Fondamentalement, la commande xpropretournera

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

puis vous pouvez masser un peu les informations pour obtenir ce dont vous avez besoin.

Rmano
la source
C'est le numéro de l'espace de travail, pas le nom. Pour obtenir le nom, vous devez rechercher le numéro dans la propriété _NET_DESKTOP_NAMES.
Gilles 'SO- arrête d'être méchant'