web-dev-qa-db-fra.com

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

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, par exemple pour personnaliser les comportements dans mon fichier .bashrc en fonction du bureau sur lequel le shell a été créé.

10
DonGar

Vous pouvez le faire avec wmctrl -d pour 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!

13
Terrance

Fenêtres dans Unity

Si vous utilisez Unity , la fenêtre d'affichage actuelle ne peut pas être extraite directement de

wmctrl -d

depuis que Unity a des fenêtres, qui ne sont pas détectées directement par wmctrl -d. La sortie ne montrera 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 (de xrandr)
  • l'espace de travail couvrant (toutes les fenêtres) est 5040x2100. Cela correspond à 3 vues sur 2: 5040/1680 = 3 et 2100/1050 = 2.
  • Je suis actuellement sur (viewport-) position 1680,1050 (x, y)

Le script ci-dessous calcule la fenêtre d'affichage 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écuter par la commande

    python3 /path/to/get_viewport.py
    

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

Explication

enter image description here

Le scénario

  • obtient la taille d'une fenêtre d'affichage (résolution) de xrandr, y compris les moniteurs supplémentaires possibles.
  • obtient la position actuelle sur l'espace de travail couvrant
  • calcule le nombre de colonnes/lignes dans la configuration de votre fenêtre
  • à partir de cela, il calcule la fenêtre actuelle
10
Jacob Vlijm

Au moins dans Gnome Shell, mais probablement dans d’autres WM, vous pouvez demander directement au serveur X (si vous êtes dans Wayland, aucune idée).

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

En gros, la commande xprop retournera

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

et puis vous pouvez masser un peu l'information pour obtenir ce dont vous avez besoin.

3
Rmano