Jak wyszukać nazwę bieżącego obszaru roboczego?

11

Czy jest jakiś sposób, aby skrypt bash sprawdził nazwę bieżącego obszaru roboczego (pulpit wirtualny)?

Wydaje się to bardzo przydatne w przypadku dostosowywania zachowań w moim pliku .bashrc na podstawie pulpitu, na którym utworzono powłokę.

DonGar
źródło
Jaki jest twój menedżer okien?
Jacob Vlijm,
Używam pulpitu Cinnamon zainstalowanego na Ubuntu. Myślałem, że powiedziałem, ale kiedy zredagowałem pytanie, musiałem wyciągnąć zbyt wiele.
DonGar,
1
Pod Cynamonem daje to ostatnie słowo w nazwie pulpitu. To wystarczy dla mojego przypadku użycia. pulpit =wmctrl -d | grep '*' | sed 's/.* //g'
DonGar

Odpowiedzi:

13

Możesz to zrobić, wmctrl -daby wyświetlić listę wszystkich obszarów roboczych. *Reprezentuje bieżący obszar roboczy:

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

Aby uzyskać tylko bieżący, grep dla *:

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

Mam nadzieję że to pomoże!

Terrance
źródło
Jeśli OP używa Unity, jest tylko jeden obszar roboczy :), również w danych wyjściowychwmctrl -d
Jacob Vlijm
@JacobVlijm Wtedy OP prawdopodobnie nie martwiłby się tym, gdyby istniał tylko jeden obszar roboczy. :)
Terrance
Oczywiście, że tak, ale wtedy są one nazywane rzutniami i nie można ich bezpośrednio odzyskać wmctrl -d.
Jacob Vlijm,
@JacobVlijm Cóż, jednym świecącym światłem jest to, że Unity nie będzie już domyślne i zniknie po wydaniu 18.04. : D
Terrance
Właściwie to mi się podoba i prawdopodobnie będzie rozwidlony.
Jacob Vlijm,
11

Rzutnie w Unity

Jeśli używasz Unity , bieżącej rzutni nie można pobrać bezpośrednio z

wmctrl -d

ponieważ Unity ma rzutnie, które nie są wykrywane bezpośrednio przez wmctrl -d. Dane wyjściowe pokażą tylko jeden obszar roboczy:

0  * DG: 5040x2100  VP: 1680,1050  WA: 59,24 1621x1026  N/A
  • gdzie moja rozdzielczość to 1680 x 1050 (od xrandr)
  • obejmujący obszar roboczy (wszystkie rzutnie) to 5040x2100. To znaczy rzutnie 3x2: 5040/1680 = 3 i 2100/1050 = 2.
  • Obecnie jestem na pozycji (rzutnia) 1680,1050(x, y)

Poniższy skrypt oblicza bieżącą rzutnię na podstawie tych informacji:

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

Używać:

  1. zainstalować wmctrl

    sudo apt install wmctrl
    
  2. Uruchom go za pomocą polecenia

    python3 /path/to/get_viewport.py
    

    Wygeneruje 1, 2, 3 lub cokolwiek w bieżącej rzutni. Automatycznie zlicza wiersze / kolumny, które może zawierać konfiguracja rzutni.

Wyjaśnienie

wprowadź opis zdjęcia tutaj

Scenariusz

  • pobiera rozmiar jednej rzutni (rozdzielczości) z xrandr, w tym możliwych dodatkowych monitorów.
  • pobiera bieżącą pozycję w obejmującym obszarze roboczym
  • oblicza liczbę kolumn / wierszy w konfiguracji rzutni
  • z tego oblicza bieżącą rzutnię
Jacob Vlijm
źródło
1
Niezależnie od tego, co sądzę o Unity, ten skrypt działa naprawdę dobrze! Ładnie wykonane! +1
Terrance
3

Przynajmniej w powłoce Gnome, ale prawdopodobnie także w innych WM, możesz zapytać Xserver bezpośrednio (jeśli w Wayland, nie masz pojęcia).

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

Zasadniczo polecenie xproppowróci

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

a następnie możesz trochę masować informacje, aby uzyskać to, czego potrzebujesz.

Rmano
źródło
To numer obszaru roboczego, a nie nazwa. Aby uzyskać nazwę, sprawdź numer we właściwości _NET_DESKTOP_NAMES.
Gilles 'SO - przestań być zły'