How do I find the X window ID under the mouse pointer in bash?
xdotool
exposes the pointer location (xdotool getmouselocation
), and recent versions (since 2.20110530.1) indicate which window is at that location as well. None of xwininfo
, wmctrl
or older versions of xdotool
appear to have a way to match a window by a screen position where it's visible.
The underlying X library call is XQueryPointer
(corresponding to a QueryPointer
message). Here's a simple Python wrapper script around this call (using ctypes
). Error checking largely omitted. Assumes you're using screen 0 (if you didn't know that displays could have more than one screen, ignore this).
#! /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
Usage example:
xwininfo -tree -id $(XQueryPointer)
The xwininfo
command gives this kind of output, but you do have to click on the window you want info on:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
So doing: xwininfo | grep 'Window id:'
might give you something you can parse the ID out of.
try this, it uses only xdotool, but its version is at least "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
to get the window id directly you can use this:
sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId