web-dev-qa-db-fra.com

Détecter la fenêtre active

L'outil de ligne de commande linux wmctrl vous permet, entre autres, de répertorier toutes les fenêtres ou tous les bureaux. En mode de liste de postes de travail, le bureau actuel est marqué d'un astérisque.

J'ai besoin d'un outil capable de déterminer le titre de la fenêtre actuellement active. Malheureusement, wmctrl ne dispose pas d'un assistant pour le faire, même s'il sait quelle fenêtre est actuellement active (voir le marqueur :ACTIVE:).

Existe-t-il un autre outil en ligne de commande pouvant me donner l’identifiant et/ou le titre de la fenêtre de la fenêtre en cours?

50
Dave Vogt

Installez xdotool, puis exécutez

xdotool getwindowfocus getwindowname

Il donnera par exemple pour la page Web actuelle ouverte dans Firefox:

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

Ceci est plus direct et utilise uniquement xprop et cut:

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

Ces commandes sont simplement une extraction de propriétés de la fenêtre racine et de la fenêtre de l'application, mais selon la demande de Lorenzo von Matterhorn:

  • Premier,

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

    Extrait la propriété _NET_ACTIVE_WINDOW de la racine, ce qui vous donne le XID de la fenêtre active. Le 32x '\t$0' indique à xprop de formater la sortie de manière à ce que cut puisse facilement analyser plus tard.

  • Ensuite, extrayez seulement le XID de la sortie avec cut -f 2

  • Ensuite, transmettez le XID en tant que paramètre à

    xprop -id XID _NET_WM_NAME
    

Qui affiche le nom de cette fenêtre.

32
Jim Paris

Il y en a, mais pas de réponse courte ni de solution.

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

résultat:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

Utilisé:

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

C'est ce qui a fonctionné pour moi:

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

Donne:

WM_NAME(STRING) = "~"

Alors peut-être que vous feriez un peu la laideur pour obtenir le nom tout seul:

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

Donne:

~

Quel est mon nom de fenêtre actuellement ciblé, tout seul.

Ou, évitez sed avec le légèrement moins laid:

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

5
Greg Bell

Relativement court, il gère correctement les noms de fenêtre contenant des guillemets:

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