forked from AuroraMiddleware/gtk
Merge branch 'gdk-win32-use-window-from-point-api' into 'gtk-3-24'
GdkWin32: Fix mouse events in presence of transparent windows on the desktop See merge request GNOME/gtk!2767
This commit is contained in:
commit
b94955e614
@ -149,8 +149,19 @@ gdk_device_win32_query_state (GdkDevice *device,
|
||||
}
|
||||
|
||||
if (child_window)
|
||||
{
|
||||
if (window == gdk_screen_get_root_window (screen))
|
||||
{
|
||||
/* Always use WindowFromPoint when searching from the root window.
|
||||
* Only WindowFromPoint is able to look through transparent
|
||||
* layered windows.
|
||||
*/
|
||||
hwndc = GetAncestor (WindowFromPoint (point), GA_ROOT);
|
||||
}
|
||||
else
|
||||
{
|
||||
hwndc = ChildWindowFromPoint (hwnd, point);
|
||||
}
|
||||
|
||||
if (hwndc && hwndc != hwnd)
|
||||
*child_window = gdk_win32_handle_table_lookup (hwndc);
|
||||
@ -201,57 +212,33 @@ _gdk_device_win32_window_at_position (GdkDevice *device,
|
||||
GdkWindow *window = NULL;
|
||||
GdkWindowImplWin32 *impl = NULL;
|
||||
POINT screen_pt, client_pt;
|
||||
HWND hwnd, hwndc;
|
||||
HWND hwnd;
|
||||
RECT rect;
|
||||
|
||||
GetCursorPos (&screen_pt);
|
||||
if (!GetCursorPos (&screen_pt))
|
||||
return NULL;
|
||||
|
||||
hwnd = WindowFromPoint (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.
|
||||
/* Use WindowFromPoint instead of ChildWindowFromPoint(Ex).
|
||||
* Only WindowFromPoint is able to look through transparent
|
||||
* layered 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;
|
||||
hwnd = GetAncestor (hwnd, GA_ROOT);
|
||||
}
|
||||
|
||||
} 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 (!get_toplevel && hwnd == NULL)
|
||||
{
|
||||
/* If we didn't hit any window, return the root window */
|
||||
/* note that the root window ain't a toplevel window */
|
||||
window = gdk_get_default_root_window ();
|
||||
impl = GDK_WINDOW_IMPL_WIN32 (window->impl);
|
||||
|
||||
@ -264,7 +251,6 @@ _gdk_device_win32_window_at_position (GdkDevice *device,
|
||||
}
|
||||
|
||||
window = gdk_win32_handle_table_lookup (hwnd);
|
||||
}
|
||||
|
||||
if (window && (win_x || win_y))
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user