Erkennen des aktuell aktiven Fensters

52

Mit dem Linux-Kommandozeilen-Tool wmctrlkönnen Sie unter anderem alle Fenster oder alle Desktops auflisten. Im Desktop-Listenmodus ist der aktuelle Desktop mit einem Stern markiert.

Ich benötige ein Tool, mit dem ich den Titel des derzeit aktiven Fensters ermitteln kann. Leider wmctrlgibt es keinen Helfer, der dies tut - obwohl er weiß, welches Fenster gerade aktiv ist (siehe :ACTIVE:Markierung).

Gibt es ein anderes Befehlszeilentool, das mir die Fenster-ID und / oder den Fenstertitel des aktuellen Fensters geben kann?

Dave Vogt
quelle

Antworten:

56

Installieren xdotoolund dann ausführen

xdotool getwindowfocus getwindowname

Es wird zB für die aktuell in Firefox geöffnete Webseite geben:

linux - Detecting currently active window - Super User - Mozilla Firefox
Skippy le Grand Gourou
quelle
Leistungsfähiges Werkzeug! Abgesehen davon, dass es das aktuelle aktive Fenster erhält, verfügt es auch über viele andere nützliche Funktionen.
Searene
Verglichen mit der Antwort von Jim Paris hat dies den Nachteil einer Installationsabhängigkeit, scheint jedoch schneller zu laufen, insbesondere wenn sich xdotool bereits im Festplatten-Cache befindet.
mc0e
1
Wenn Sie das aktuelle Fenster mit manipulieren möchten wmctrl, können Sie Folgendes tun :, wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1wobei -iwmctrl anweist, die Fenster-ID anstelle des Fenstertitels zu erwarten.
Fiedl
34

Dies ist direkter und nur verwendet xpropund cut:

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

Diese Befehle sind nur eine Extraktion von Eigenschaften aus dem Stammfenster und dem Anwendungsfenster, aber gemäß der Anfrage von Lorenzo von Matterhorn:

  • Zuerst,

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

    Extrahiert die _NET_ACTIVE_WINDOWEigenschaft aus dem Stammverzeichnis, wodurch Sie die XID des aktiven Fensters erhalten. Das 32x '\t$0'weist Sie xpropan, die Ausgabe so zu formatieren, dass cutsie später leicht analysiert werden kann.

  • Dann extrahieren Sie einfach die XID aus der Ausgabe mit cut -f 2

  • Übergeben Sie dann die XID als Parameter an

    xprop -id XID _NET_WM_NAME
    

Welches druckt den Namen dieses Fensters.

Jim Paris
quelle
1
Hallo, kannst du bitte die Argumente und ein bisschen die Syntax erklären? Dies kann für die Qualitätssicherung und zukünftige Leser hilfreich sein.
Lorenzo Von Matterhorn
9

Es gibt aber keine kurze Antwort oder Lösung.

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

Ergebnis:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

In Benutzung:

$ 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
quelle
1
Dies scheint eine gute Lösung zu sein, ich wusste nichts über das Hilfsprogramm xprop. In der Zwischenzeit habe ich wmctrl gepatcht, um eine solche Option bereitzustellen, und sie an den Autor gesendet. Leider habe ich noch keine Antwort bekommen.
Dave Vogt
1
+1 für die Wirksamkeit und "Einfachheit" auf den Code
Lorenzo Von Matterhorn
5

Das hat bei mir funktioniert:

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

Gibt:

WM_NAME(STRING) = "~"

Vielleicht würdest du ein bisschen hässlich sein, um den Namen von selbst zu bekommen:

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

Gibt:

~

Welches ist mein momentan fokussierter Fenstername, ganz für sich.

Oder vermeiden Sie Sed mit dem etwas weniger hässlichen:

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

Greg Bell
quelle
1
Oder da der Schnitt bereits eingeführt wurde, können Sie ihn erneut verwenden:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e
3

Relativ kurz und behandelt Fensternamen, die Anführungszeichen enthalten, korrekt:

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