diff --git a/gdk/win32/gdkdevice-virtual.c b/gdk/win32/gdkdevice-virtual.c index b947800240..e6410eac0e 100644 --- a/gdk/win32/gdkdevice-virtual.c +++ b/gdk/win32/gdkdevice-virtual.c @@ -24,6 +24,7 @@ #include "gdkdisplayprivate.h" #include "gdkdevice-virtual.h" +#include "gdkdevice-win32.h" #include "gdkwin32.h" static gboolean gdk_device_virtual_get_history (GdkDevice *device, @@ -61,11 +62,6 @@ static GdkGrabStatus gdk_device_virtual_grab (GdkDevice *device, guint32 time_); static void gdk_device_virtual_ungrab (GdkDevice *device, guint32 time_); -static GdkWindow * gdk_device_virtual_window_at_position (GdkDevice *device, - gdouble *win_x, - gdouble *win_y, - GdkModifierType *mask, - gboolean get_toplevel); static void gdk_device_virtual_select_window_events (GdkDevice *device, GdkWindow *window, GdkEventMask event_mask); @@ -85,7 +81,7 @@ gdk_device_virtual_class_init (GdkDeviceVirtualClass *klass) device_class->query_state = gdk_device_virtual_query_state; device_class->grab = gdk_device_virtual_grab; device_class->ungrab = gdk_device_virtual_ungrab; - device_class->window_at_position = gdk_device_virtual_window_at_position; + device_class->window_at_position = _gdk_device_win32_window_at_position; device_class->select_window_events = gdk_device_virtual_select_window_events; } @@ -311,94 +307,6 @@ gdk_device_virtual_ungrab (GdkDevice *device, _gdk_display_device_grab_update (display, device, device, 0); } -static void -screen_to_client (HWND hwnd, POINT screen_pt, POINT *client_pt) -{ - *client_pt = screen_pt; - ScreenToClient (hwnd, client_pt); -} - -static GdkWindow * -gdk_device_virtual_window_at_position (GdkDevice *device, - gdouble *win_x, - gdouble *win_y, - GdkModifierType *mask, - gboolean get_toplevel) -{ - GdkWindow *window = NULL; - POINT screen_pt, client_pt; - HWND hwnd, hwndc; - RECT rect; - - GetCursorPos (&screen_pt); - - if (get_toplevel) - { - /* Only consider visible children of the desktop to avoid the various - * non-visible windows you often find on a running Windows box. These - * might overlap our windows and cause our walk to fail. As we assume - * WindowFromPoint() can find our windows, we follow similar logic - * here, and ignore invisible and disabled windows. - */ - hwnd = GetDesktopWindow (); - do { - window = gdk_win32_handle_table_lookup (hwnd); - - if (window != NULL && - GDK_WINDOW_TYPE (window) != GDK_WINDOW_ROOT && - GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN) - break; - - screen_to_client (hwnd, screen_pt, &client_pt); - hwndc = ChildWindowFromPointEx (hwnd, client_pt, CWP_SKIPDISABLED | - CWP_SKIPINVISIBLE); - - /* Verify that we're really inside the client area of the window */ - if (hwndc != hwnd) - { - GetClientRect (hwndc, &rect); - screen_to_client (hwndc, screen_pt, &client_pt); - if (!PtInRect (&rect, client_pt)) - hwndc = hwnd; - } - - } while (hwndc != hwnd && (hwnd = hwndc, 1)); - - } - else - { - hwnd = WindowFromPoint (screen_pt); - - /* Verify that we're really inside the client area of the window */ - GetClientRect (hwnd, &rect); - screen_to_client (hwnd, screen_pt, &client_pt); - if (!PtInRect (&rect, client_pt)) - hwnd = NULL; - - /* If we didn't hit any window at that point, return the desktop */ - if (hwnd == NULL) - { - if (win_x) - *win_x = screen_pt.x + _gdk_offset_x; - if (win_y) - *win_y = screen_pt.y + _gdk_offset_y; - return _gdk_root; - } - - window = gdk_win32_handle_table_lookup (hwnd); - } - - if (window && (win_x || win_y)) - { - if (win_x) - *win_x = client_pt.x; - if (win_y) - *win_y = client_pt.y; - } - - return window; -} - static void gdk_device_virtual_select_window_events (GdkDevice *device, GdkWindow *window, diff --git a/gdk/win32/gdkdevice-win32.c b/gdk/win32/gdkdevice-win32.c index 3554a7ab11..d27034cd5d 100644 --- a/gdk/win32/gdkdevice-win32.c +++ b/gdk/win32/gdkdevice-win32.c @@ -61,11 +61,6 @@ static GdkGrabStatus gdk_device_win32_grab (GdkDevice *device, guint32 time_); static void gdk_device_win32_ungrab (GdkDevice *device, guint32 time_); -static GdkWindow * gdk_device_win32_window_at_position (GdkDevice *device, - gdouble *win_x, - gdouble *win_y, - GdkModifierType *mask, - gboolean get_toplevel); static void gdk_device_win32_select_window_events (GdkDevice *device, GdkWindow *window, GdkEventMask event_mask); @@ -85,7 +80,7 @@ gdk_device_win32_class_init (GdkDeviceWin32Class *klass) device_class->query_state = gdk_device_win32_query_state; device_class->grab = gdk_device_win32_grab; device_class->ungrab = gdk_device_win32_ungrab; - device_class->window_at_position = gdk_device_win32_window_at_position; + device_class->window_at_position = _gdk_device_win32_window_at_position; device_class->select_window_events = gdk_device_win32_select_window_events; } @@ -263,12 +258,12 @@ screen_to_client (HWND hwnd, POINT screen_pt, POINT *client_pt) ScreenToClient (hwnd, client_pt); } -static GdkWindow * -gdk_device_win32_window_at_position (GdkDevice *device, - gdouble *win_x, - gdouble *win_y, - GdkModifierType *mask, - gboolean get_toplevel) +GdkWindow * +_gdk_device_win32_window_at_position (GdkDevice *device, + gdouble *win_x, + gdouble *win_y, + GdkModifierType *mask, + gboolean get_toplevel) { GdkWindow *window = NULL; POINT screen_pt, client_pt; diff --git a/gdk/win32/gdkdevice-win32.h b/gdk/win32/gdkdevice-win32.h index a32fced830..b1dd80db9f 100644 --- a/gdk/win32/gdkdevice-win32.h +++ b/gdk/win32/gdkdevice-win32.h @@ -44,6 +44,12 @@ struct _GdkDeviceWin32Class GType gdk_device_win32_get_type (void) G_GNUC_CONST; +GdkWindow *_gdk_device_win32_window_at_position (GdkDevice *device, + gdouble *win_x, + gdouble *win_y, + GdkModifierType *mask, + gboolean get_toplevel); + G_END_DECLS #endif /* __GDK_DEVICE_WIN32_H__ */