win32: in window_at_pointer, ensure that we handle non-client areas correctly

We should not return a window if the pointer is in the non-client area,
like the titlebar.
This commit is contained in:
Alexander Larsson 2011-10-19 16:15:17 +02:00
parent f0f7c07f4d
commit 321acc3286

View File

@ -384,6 +384,16 @@ gdk_device_win32_window_at_position (GdkDevice *device,
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));
}
@ -391,6 +401,12 @@ gdk_device_win32_window_at_position (GdkDevice *device,
{
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)
{
@ -406,13 +422,10 @@ gdk_device_win32_window_at_position (GdkDevice *device,
if (window && (win_x || win_y))
{
screen_to_client (hwnd, screen_pt, &client_pt);
GetClientRect (hwnd, &rect);
if (win_x)
*win_x = client_pt.x - rect.left;
*win_x = client_pt.x;
if (win_y)
*win_y = client_pt.y - rect.top;
*win_y = client_pt.y;
}
return window;