Detectando la ventana actualmente activa

52

La herramienta de línea de comandos de Linux le wmctrlpermite enumerar todas las ventanas o todos los escritorios, entre otras cosas. En el modo de listado de escritorio, el escritorio actual está marcado con un asterisco.

Necesito una herramienta que pueda descubrir el título de la ventana activa actualmente. Desafortunadamente, wmctrlno tiene un ayudante que haga esto, a pesar de saber qué ventana está actualmente activa (ver :ACTIVE:marcador).

¿Hay otra herramienta de línea de comandos que me puede dar la identificación de la ventana y / o el título de la ventana actual?

Dave Vogt
fuente

Respuestas:

56

Instalar xdotool, luego ejecutar

xdotool getwindowfocus getwindowname

Dará, por ejemplo, para la página web actual abierta en Firefox:

linux - Detecting currently active window - Super User - Mozilla Firefox
Skippy le Grand Gourou
fuente
¡Herramienta poderosa! Además de obtener la ventana activa actual, también tiene muchas otras funcionalidades útiles.
Searene
En comparación con la respuesta de Jim Paris, esto tiene la desventaja de una dependencia para instalar, pero parece ejecutarse más rápido, particularmente si xdotool ya está en el caché del disco.
mc0e
1
Si desea manipular la ventana actual con wmctrl, puede hacer:, wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1donde -ile dice a wmctrl que espere la identificación de la ventana en lugar del título de la ventana.
fiedl
34

Esto es más directo y solo usa xpropy cut:

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

Estos comandos son solo una extracción de propiedades de la ventana raíz y la ventana de la aplicación, pero según la solicitud de Lorenzo von Matterhorn:

  • Primero,

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

    Extrae la _NET_ACTIVE_WINDOWpropiedad de la raíz, que le proporciona el XID de la ventana activa. El 32x '\t$0'le dice xpropque formatee la salida de una manera que cutpueda analizarse fácilmente más tarde.

  • Luego, extraiga solo el XID de la salida con cut -f 2

  • Luego, pase el XID como parámetro para

    xprop -id XID _NET_WM_NAME
    

Que imprime el nombre de esa ventana.

Jim Paris
fuente
1
hola, ¿puedes explicar los argumentos y un poco de la sintaxis? Puede ser útil para el control de calidad y los futuros lectores.
Lorenzo Von Matterhorn
9

Hay, pero no hay una respuesta o solución corta.

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

resultado:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

En 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)
tao
fuente
1
Esto parece una buena solución, no sabía sobre la utilidad xprop. Mientras tanto, parcheé wmctrl para proporcionar esa opción y se la envié al autor. Desafortunadamente, aún no obtuve una respuesta.
Dave Vogt
1
+1 por efectividad y "simplicidad" en el código
Lorenzo Von Matterhorn
5

Esto es lo que funcionó para mí:

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

Da:

WM_NAME(STRING) = "~"

Entonces, tal vez harías un poco de fealdad de sed para obtener el nombre por sí mismo:

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

Da:

~

Cuál es mi nombre de ventana actualmente enfocado, todo por sí mismo.

O, evite sed con los menos feos:

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

Greg Bell
fuente
1
O desde el corte laready se ha introducido, se puede usar de nuevo:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e
3

Relativamente corto, y maneja nombres de ventanas que contienen comillas correctamente:

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