¿Cómo encuentro la ID de la window X bajo el puntero del mouse en bash?

Desde un script bash, ¿hay alguna manera de get el ID de la window X debajo del puntero del mouse?

(editar) Necesito que el process no sea interactivo.

xdotool expone la location del puntero ( xdotool getmouselocation ), y las versiones recientes (desde 2.20110530.1) indican qué window está también en esa location . Ninguno de xwininfo , wmctrl o versiones anteriores de xdotool parecen tener una forma de hacer coincidir una window con una position de pantalla donde sea visible.

La llamada de la biblioteca X subyacente es XQueryPointer (que corresponde a un post QueryPointer ). Aquí hay una secuencia de commands de contenedor simple de Python alnetworkingedor de esta llamada (usando ctypes ). Error al verificar en gran parte omitido. Asume que está usando la pantalla 0 (si no sabía que las pantallas podrían tener más de una pantalla, ignórelas).

 #! /usr/bin/env python import sys from ctypes import * Xlib = CDLL("libX11.so.6") display = Xlib.XOpenDisplay(None) if display == 0: sys.exit(2) w = Xlib.XRootWindow(display, c_int(0)) (root_id, child_id) = (c_uint32(), c_uint32()) (root_x, root_y, win_x, win_y) = (c_int(), c_int(), c_int(), c_int()) mask = c_uint() ret = Xlib.XQueryPointer(display, c_uint32(w), byref(root_id), byref(child_id), byref(root_x), byref(root_y), byref(win_x), byref(win_y), byref(mask)) if ret == 0: sys.exit(1) print child_id.value 

Ejemplo de uso:

 xwininfo -tree -id $(XQueryPointer) 

El command xwininfo brinda este tipo de resultados, pero debe hacer clic en la window en la que desea get información:

 % xwininfo xwininfo: Please select the window about which you would like information by clicking the mouse in that window. xwininfo: Window id: 0xa0000d "flask" ... 

Haciendo lo siguiente: xwininfo | grep 'Window id:' xwininfo | grep 'Window id:' puede darte algo de lo que puedes analizar la ID.

intente esto, usa solo xdotool, pero su versión es al less "2.20110530.1"

 xdotool getmouselocation --shell | grep WINDOW 

para get la identificación de la window directamente puede usar esto:

 sedGetValue='s/.*=\(.*\)/\1/' windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"` echo $windowId 

xdotool es lo suficientemente bueno para hacerlo.

Ejecute xdotool getactivewindow y verá el resultado (int) La window puede estar sobre CUALQUIER monitor. Simplemente lea dónde está ubicado el puntero x11 esperando un clic :), y no importa si se trata de una window remota, un server vnc o el tercer escritorio del entorno de escritorio en cubo. Solo funciona.

Puede jugar usando el sueño para probar mejor el sleep 3; xdotool click 1+2; xdotool getactivewindow sleep 3; xdotool click 1+2; xdotool getactivewindow sleep 3; xdotool click 1+2; xdotool getactivewindow .

He visto que getwindowsfocus devuelve el mismo valor que getactivewindow .

Si hace los clics de forma manual, verá el menu contextual, pero click 1 + 2 dispara los dos clics onclick en la location actual del mouse y obtiene el ID deseado.

Intentalo 🙂

Jugué con la respuesta de Peter.O y se me ocurrió:

 xdotool click 1|xwininfo|grep 'Window id:' 

ArchWiki tiene una buena respuesta a esto:

 activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)") activeWinId=${activeWinLine:40} 

Usando sed puedes hacer esto en una sola línea, que es probablemente la forma más fácil de hacerlo:

 activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')" 

Tenga en count que xdotool faltaba en mi Debian minimal X11 mientras que xprop estaba incluido (igualmente sed por supuesto).

Si no desea fork sed ni grep , puede hacer la transformación del text completamente en bash , que quizás sea un poco más seguro en caso de que la salida de xprop cambie un poco:

 activeWin="$(xprop -root)" activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}' activeWin="${activeWin%%?_NET_*}' activeWin="${activeWin##* }' 

De todos modos, sigue siendo una forma extraña de archivar una tarea tan simple.

 xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'