Come posso cercare il nome dell'area di lavoro corrente?


11

Esiste un modo per uno script bash di cercare il nome dell'area di lavoro corrente (desktop virtuale)?

Questo sembra davvero utile per cose come la personalizzazione dei comportamenti nel mio file .bashrc basato sul desktop in cui è stata creata la shell.


Qual è il tuo gestore di finestre?
Jacob Vlijm,

Sto usando il desktop Cinnamon installato su Ubuntu. Pensavo di averlo detto, ma quando ho modificato la domanda, devo aver tirato fuori troppo.
DonGar

1
Sotto Cinnamon, questo dà l'ultima parola nel nome del desktop. È abbastanza buono per il mio caso d'uso. desktop =wmctrl -d | grep '*' | sed 's/.* //g'
DonGar

Risposte:


13

Puoi farlo con wmctrl -dper elencare tutte le aree di lavoro. Il *rappresenta lo spazio di lavoro corrente:

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

Quindi, per ottenere solo l'attuale, grep per *:

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

Spero che sia di aiuto!


Se OP utilizza Unity, esiste un solo spazio di lavoro :), anche nell'output diwmctrl -d
Jacob Vlijm,

@JacobVlijm Quindi OP probabilmente non si preoccuperebbe di questo se ci fosse un solo spazio di lavoro. :)
Terrance

Certo che lo farà, ma poi vengono chiamati viewport e non recuperabili direttamente da wmctrl -d.
Jacob Vlijm,

@JacobVlijm Bene, una luce brillante è che Unity non sarà più il default e scomparirà dopo il rilascio di 18.04. : D
Terrance

In realtà mi piace, e probabilmente sarà biforcuta.
Jacob Vlijm,

11

Viewport in Unity

Se si utilizza Unity , la finestra corrente non può essere recuperata direttamente da

wmctrl -d

poiché Unity ha viewport, che non vengono rilevati direttamente da wmctrl -d. L'output mostrerà solo uno spazio di lavoro:

0  * DG: 5040x2100  VP: 1680,1050  WA: 59,24 1621x1026  N/A
  • dove la mia risoluzione è 1680 x 1050 (da xrandr)
  • l'area di lavoro di spanning (tutte le finestre) è 5040x2100. Sono finestre 3x2: 5040/1680 = 3 e 2100/1050 = 2.
  • Sono attualmente in posizione (viewport-) 1680,1050(x, y)

Lo script seguente calcola la finestra corrente da queste informazioni:

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

Usare:

  1. Installare wmctrl

    sudo apt install wmctrl
    
  2. Eseguilo con il comando

    python3 /path/to/get_viewport.py
    

    Verrà emesso 1, 2, 3 o qualunque sia l'attuale viewport. Conta automaticamente le righe / colonne che la configurazione della finestra può includere.

Spiegazione

inserisci qui la descrizione dell'immagine

Il copione

  • ottiene la dimensione di un viewport (risoluzione) da xrandr, inclusi eventuali monitor extra.
  • ottiene la posizione corrente nell'area di lavoro di spanning
  • indica il numero di colonne / righe nella configurazione della finestra
  • da ciò, calcola la finestra corrente

1
Indipendentemente da come mi sento per Unity, questo script funziona davvero bene! Ben fatto! +1
Terranza

3

Almeno nella shell di Gnome, ma probabilmente anche in altri WM, puoi chiedere direttamente a Xserver (se in Wayland, non ne ho idea).

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

Fondamentalmente, il comando xproptornerà

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

e quindi puoi massaggiare un po 'le informazioni per ottenere ciò di cui hai bisogno.


Questo è il numero dell'area di lavoro, non il nome. Per ottenere il nome devi cercare il numero nella proprietà _NET_DESKTOP_NAMES.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.