Détecter la fenêtre active

52

L'outil de ligne de commande linux wmctrlvous permet de lister toutes les fenêtres, ou tous les bureaux, entre autres. 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, wmctrlaucun assistant ne le fait, même s'il sait quelle fenêtre est actuellement active (voir :ACTIVE:marqueur).

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?

Dave Vogt
la source

Réponses:

56

Installer xdotool, puis exécuter

xdotool getwindowfocus getwindowname

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

linux - Detecting currently active window - Super User - Mozilla Firefox
Skippy le Grand Gourou
la source
Outil puissant! En plus d'avoir la fenêtre active en cours, il a aussi beaucoup d'autres fonctionnalités utiles.
Searene
Comparé à la réponse de Jim Paris, cela présente l’inconvénient d’être une dépendance à installer, mais elle semble fonctionner plus rapidement, en particulier si xdotool est déjà dans le cache du disque.
mc0e
1
Si vous voulez manipuler la fenêtre en cours wmctrl, vous pouvez faire :, wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1-iindique à wmctrl d'attendre l'id de la fenêtre plutôt que le titre de la fenêtre.
lundi
34

Ceci est plus direct et utilise seulement xpropet 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:

  • Première,

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

    Extrait la _NET_ACTIVE_WINDOWpropriété de la racine, ce qui vous donne le XID de la fenêtre active. Le 32x '\t$0'dit xpropde formater la sortie d'une manière qui cutpeut 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.

Jim Paris
la source
1
salut, pouvez-vous s'il vous plaît expliquer les arguments et un peu de la syntaxe? cela peut être utile pour le contrôle qualité et les futurs lecteurs.
Lorenzo Von Matterhorn
9

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)
tao
la source
1
Cela ressemble à une bonne solution, je ne connaissais pas l’utilitaire xprop. Dans l'intervalle, j'ai corrigé wmctrl pour fournir une telle option et je l'ai envoyé à l'auteur. Malheureusement, je n'ai pas encore eu de réponse.
Dave Vogt
1
+1 pour l'efficacité et la "simplicité" sur le code
Lorenzo Von Matterhorn
5

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}'

Greg Bell
la source
1
Ou, puisque la coupe a déjà été introduite, vous pouvez l'utiliser à nouveau:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e le
3

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'
Ton van den Heuvel
la source