Rilevamento della finestra attualmente attiva


52

Lo strumento da riga di comando di Linux wmctrlti consente di elencare tutte le finestre, o tutti i desktop, tra le altre cose. Nella modalità di elenco del desktop, il desktop corrente è contrassegnato da un asterisco.

Ho bisogno di uno strumento in grado di capire il titolo della finestra attualmente attiva. Sfortunatamente, wmctrlnon ha un aiutante che lo fa, nonostante sappia quale finestra è attualmente attiva (vedi :ACTIVE:marcatore).

Esiste un altro strumento da riga di comando che può darmi l'id della finestra e / o il titolo della finestra corrente?

Risposte:


56

Installa xdotool, quindi esegui

xdotool getwindowfocus getwindowname

Darà ad esempio per la pagina Web corrente aperta in Firefox:

linux - Detecting currently active window - Super User - Mozilla Firefox

Strumento potente! Oltre a ottenere la finestra attiva corrente, ha anche molte altre funzionalità utili.
Searene,

Rispetto alla risposta di Jim Paris, questo ha lo svantaggio di una dipendenza da installare, ma sembra funzionare più velocemente, in particolare se xdotool è già nella cache del disco.
MC0e

1
Se vuoi manipolare la finestra corrente con wmctrl, puoi fare :, wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1dove -idice a wmctrl di aspettarsi l'id della finestra piuttosto che il titolo della finestra.
Fiedl,

34

Questo è più diretto e utilizza solo xprope cut:

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

Questi comandi sono solo un'estrazione di proprietà dalla finestra principale e dalla finestra dell'applicazione, ma su richiesta di Lorenzo von Matterhorn:

  • Primo,

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

    Estrae la _NET_ACTIVE_WINDOWproprietà dalla radice, che ti dà l'XID della finestra attiva. La 32x '\t$0'dice xpropper formattare l'output in un modo che cutpuò facilmente analizzare in seguito.

  • Quindi, estrarre solo l'XID dall'output con cut -f 2

  • Quindi, passare l'XID come parametro a

    xprop -id XID _NET_WM_NAME
    

Che stampa il nome di quella finestra.


1
ciao, puoi per favore spiegare gli argomenti e un po 'di sintassi? può essere utile per il QA e i futuri lettori.
Lorenzo Von Matterhorn,

9

C'è, ma nessuna risposta o soluzione breve.

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

risultato:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

In uso:

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

1
Sembra una buona soluzione, non sapevo dell'utilità xprop. Nel frattempo, ho patchato wmctrl per fornire tale opzione e l'ho inviato all'autore. Sfortunatamente, non ho ancora ricevuto una risposta.
Dave Vogt,

1
+1 per efficacia e "semplicità" sul codice
Lorenzo Von Matterhorn,

5

Questo è ciò che ha funzionato per me:

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

dà:

WM_NAME(STRING) = "~"

Quindi forse faresti un po 'di bruttezza per ottenere il nome da solo:

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

dà:

~

Qual è il mio nome di finestra attualmente focalizzato, tutto da solo.

Oppure, evita sed con il leggermente meno brutto:

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


1
O dal momento che è stato introdotto laready, puoi usarlo di nuovo:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e

3

Relativamente breve e gestisce correttamente i nomi delle finestre contenenti le virgolette:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
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.