De un script bash, ¿hay alguna forma de obtener la ID de la ventana X debajo del puntero del mouse?
(editar) Necesito que el proceso no sea interactivo.
xdotool
expone la ubicación del puntero ( xdotool getmouselocation
), y las versiones recientes (desde 2.20110530.1) también indican qué ventana está en esa ubicación . Ninguno de xwininfo
, wmctrl
o versiones anteriores de xdotool
parecer que tienen una forma para que coincida con una ventana por una posición de la pantalla donde es visible.
La llamada a la biblioteca X subyacente es XQueryPointer
(correspondiente a un QueryPointer
mensaje). Aquí hay un script simple de envoltura de Python alrededor de esta llamada (usando ctypes
). Error de comprobación omitido en gran medida. Asume que está usando la pantalla 0 (si no sabía que las pantallas podrían tener más de una pantalla, ignore esto).
#! /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)
xdotool click 1
método asincrónico mencionado en el comentario a la respuesta de Bruce Ediger . La ID de escritorio que no es cero es válida en la medida en que devuelve la imagen apropiada a través deimport -window $nonzeroID screen.png
... ¿Hay algún ajuste simple para que el script de Python devuelva ese valor para el escritorio? ?$(XQueryPointer)
de0
, y llamandoxwininfo -root
para esta condición se resuelve esta peculiaridad .. Gracias ..root_id.value
sichild_id.value == 0
.if child_id.value == 0: print root_id.value
else: print child_id.value
:)sed /x[0-9]\\++/q\;d <(xwininfo -tree -id $(XQueryPointer))
El
xwininfo
comando proporciona este tipo de salida, pero debe hacer clic en la ventana en la que desea información:Al hacerlo,
xwininfo | grep 'Window id:'
podría darte algo de lo que puedes analizar la identificación.fuente
xwinfo |grep window id:' &
y siguiéndolo conxdotool click 1
... pero eso corre el riesgo de que el primer plano seclick
ejecute antes de quexdotool
agarre el mouse. Me Rathen no haría uso de un 'sueño nominal n, por lo que aunque esta respuesta es en la pista, voy a esperar un wihile para ver si hay algo más en línea se convierte en imagen ...intente esto, solo usa xdotool, pero su versión es al menos "2.20110530.1"
para obtener la identificación de la ventana directamente, puede usar esto:
fuente
xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
xdotool es lo suficientemente bueno como para hacerlo.
Ejecute
xdotool getactivewindow
y verá el resultado (int) La ventana 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 ventana remota, un servidor virtual o el tercer escritorio del entorno de escritorio del cubo. Solo funcionaPuedes jugarlo usando sleep para mejores pruebas
sleep 3; xdotool click 1+2; xdotool getactivewindow
.He visto que
getwindowsfocus
devuelve el mismo valor quegetactivewindow
.Si hace los clics manualmente, verá el menú contextual, pero al hacer clic en 1 + 2 se activan ambos clics al mismo tiempo que se hace clic en la ubicación actual del mouse y se obtiene la identificación deseada.
Intentalo :)
fuente
Si tiene acceso a python-xlib , aquí hay un equivalente más corto y más pitónico a la respuesta de Gilles:
fuente
Jugué con la respuesta de Peter.O y se me ocurrió:
fuente
ArchWiki tiene una buena respuesta a esto:
Utilizando
sed
puede hacer esto en una sola línea, que es probablemente la forma más legible de hacerlo:Tenga en cuenta que
xdotool
faltaba en mi Debian minimal X11 mientrasxprop
estaba incluido (también,sed
por supuesto).Si no desea bifurcar
sed
nigrep
puede hacer la transformación de texto por completobash
, lo que tal vez sea un poco más seguro en caso de que la salida dexprop
cambios cambie un poco:De todos modos, sigue siendo una forma extraña de archivar una tarea tan simple.
fuente
fuente
xdotool getwindowsfocus
desde una consola y mover el mouse. El valor sería el mismo hasta que haga clic con el mouse o interactúe con el teclado (alt + tab, etc.)