private static IntPtr ChildWindowAtPosition (IntPtr root,
int px, int py, bool checkRoot)
{
if (checkRoot) {
IntPtr dpy = gdk_x11_display_get_xdisplay (Gdk.Display.Default.Handle);
var rootWin = gdk_x11_window_foreign_new_for_display (dpy, root);
if (gdk_window_is_viewable (rootWin) == 0)
return IntPtr.Zero;
int x, y, w, h;
gdk_window_get_origin (rootWin, out x, out y);
gdk_window_get_size (rootWin, out w, out h);
if (x > px || x + w < px || y > py || y + h < py)
return IntPtr.Zero;
}
foreach (var child in GetChildWindowHandles (root)) {
var ret = ChildWindowAtPosition (child, px, py, true);
if (ret != IntPtr.Zero)
return ret;
}
return root;
}