Wykrywanie aktualnie aktywnego okna

52

Narzędzie linii komend linuxa wmctrlpozwala między innymi wyświetlić listę wszystkich okien lub wszystkich pulpitów. W trybie wyświetlania na pulpicie bieżący pulpit jest oznaczony gwiazdką.

Potrzebuję narzędzia, które może ustalić tytuł aktywnego okna. Niestety wmctrlnie ma pomocnika, który to robi - pomimo tego, że wie, które okno jest obecnie aktywne (patrz :ACTIVE:znacznik).

Czy istnieje inne narzędzie wiersza polecenia, które może podać identyfikator okna i / lub tytuł bieżącego okna?

Dave Vogt
źródło

Odpowiedzi:

56

Zainstaluj xdotool, a następnie uruchom

xdotool getwindowfocus getwindowname

Daje np. Dla bieżącej strony otwartej w Firefox:

linux - Detecting currently active window - Super User - Mozilla Firefox
Skippy le Grand Gourou
źródło
Potężne narzędzie! Oprócz uzyskania bieżącego aktywnego okna, ma również wiele innych przydatnych funkcji.
Searene
W porównaniu z odpowiedzią Jima Parisa ma to wadę polegającą na instalacji, ale wydaje się, że działa szybciej, szczególnie jeśli xdotool jest już w pamięci podręcznej dysku.
mc0e,
1
Jeśli chcesz manipulować bieżącym oknem wmctrl, możesz:: wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1gdzie -imówi wmctrl, aby oczekiwał identyfikatora okna zamiast tytułu okna.
fiedl
34

Jest to bardziej bezpośrednie i dotyczy tylko xpropi cut:

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

Te polecenia to tylko wyodrębnienie właściwości z okna głównego i okna aplikacji, ale na żądanie Lorenza von Matterhorna:

  • Pierwszy,

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    Wyodrębnia _NET_ACTIVE_WINDOWwłaściwość z katalogu głównego, co daje XID aktywnego okna. 32x '\t$0'Mówi xpropformatować dane wyjściowe w sposób, który cutmożna łatwo przetworzyć później.

  • Następnie wyodrębnij tylko XID z wyjścia za pomocą cut -f 2

  • Następnie przekaż XID jako parametr do

    xprop -id XID _NET_WM_NAME
    

Który wypisuje nazwę tego okna.

Jim Paris
źródło
1
cześć, czy możesz wyjaśnić argumenty i trochę składni? może to być pomocne dla QA i przyszłych czytelników.
Lorenzo Von Matterhorn
9

Nie ma krótkiej odpowiedzi ani rozwiązania.

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

wynik:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

W użyciu:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)
tao
źródło
1
To wygląda na dobre rozwiązanie, nie wiedziałem o narzędziu xprop. W międzyczasie poprawiłem wmctrl, aby zapewnić taką opcję, i wysłałem ją autorowi. Niestety nie otrzymałem jeszcze odpowiedzi.
Dave Vogt
1
+1 za skuteczność i „prostotę” w kodzie
Lorenzo Von Matterhorn
5

Oto, co zadziałało dla mnie:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME

Daje:

WM_NAME(STRING) = "~"

Więc może zrobiłbyś trochę brzydoty, aby uzyskać nazwę samemu:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

Daje:

~

Która jest moją aktualnie skoncentrowaną nazwą okna, sama w sobie.

Lub unikaj sed z nieco mniej brzydkimi:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'

Greg Bell
źródło
1
Lub odkąd wprowadzono cięcie, możesz użyć tego ponownie:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e
3

Stosunkowo krótki i poprawnie obsługuje nazwy okien zawierające cytaty:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
Ton van den Heuvel
źródło