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ę.


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!


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ę

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.


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'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.