mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-12 20:00:09 +00:00
GdkWin32: Correct generation of crossing events when holding an implicit grab
Fixes #4722
This commit is contained in:
parent
2b6fb005a8
commit
91f200167e
@ -2322,60 +2322,35 @@ gdk_event_translate (MSG *msg,
|
|||||||
|
|
||||||
pen_touch_input = FALSE;
|
pen_touch_input = FALSE;
|
||||||
|
|
||||||
new_window = window;
|
g_set_object (&window, find_window_for_mouse_event (window, msg));
|
||||||
|
|
||||||
if (pointer_grab != NULL)
|
if (mouse_window != window)
|
||||||
{
|
|
||||||
POINT pt;
|
|
||||||
pt = msg->pt;
|
|
||||||
|
|
||||||
new_window = NULL;
|
|
||||||
hwnd = WindowFromPoint (pt);
|
|
||||||
if (hwnd != NULL)
|
|
||||||
{
|
|
||||||
POINT client_pt = pt;
|
|
||||||
|
|
||||||
ScreenToClient (hwnd, &client_pt);
|
|
||||||
GetClientRect (hwnd, &rect);
|
|
||||||
if (PtInRect (&rect, client_pt))
|
|
||||||
new_window = gdk_win32_handle_table_lookup (hwnd);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pointer_grab->owner_events &&
|
|
||||||
new_window != NULL &&
|
|
||||||
new_window != pointer_grab->surface)
|
|
||||||
new_window = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mouse_window != new_window)
|
|
||||||
{
|
{
|
||||||
GDK_NOTE (EVENTS, g_print (" mouse_window %p -> %p",
|
GDK_NOTE (EVENTS, g_print (" mouse_window %p -> %p",
|
||||||
mouse_window ? GDK_SURFACE_HWND (mouse_window) : NULL,
|
mouse_window ? GDK_SURFACE_HWND (mouse_window) : NULL,
|
||||||
new_window ? GDK_SURFACE_HWND (new_window) : NULL));
|
window ? GDK_SURFACE_HWND (window) : NULL));
|
||||||
synthesize_crossing_events (display,
|
synthesize_crossing_events (display,
|
||||||
_gdk_device_manager->system_pointer,
|
_gdk_device_manager->system_pointer,
|
||||||
mouse_window, new_window,
|
mouse_window, window,
|
||||||
GDK_CROSSING_NORMAL,
|
GDK_CROSSING_NORMAL,
|
||||||
&msg->pt,
|
&msg->pt,
|
||||||
0, /* TODO: Set right mask */
|
0, /* TODO: Set right mask */
|
||||||
_gdk_win32_get_next_tick (msg->time),
|
_gdk_win32_get_next_tick (msg->time),
|
||||||
FALSE);
|
FALSE);
|
||||||
g_set_object (&mouse_window, new_window);
|
g_set_object (&mouse_window, window);
|
||||||
mouse_window_ignored_leave = NULL;
|
mouse_window_ignored_leave = NULL;
|
||||||
if (new_window != NULL)
|
if (window != NULL)
|
||||||
track_mouse_event (TME_LEAVE, GDK_SURFACE_HWND (new_window));
|
track_mouse_event (TME_LEAVE, GDK_SURFACE_HWND (window));
|
||||||
}
|
}
|
||||||
else if (new_window != NULL &&
|
else if (window != NULL && window == mouse_window_ignored_leave)
|
||||||
new_window == mouse_window_ignored_leave)
|
|
||||||
{
|
{
|
||||||
/* If we ignored a leave event for this window and we're now getting
|
/* If we ignored a leave event for this window and we're now getting
|
||||||
input again we need to re-arm the mouse tracking, as that was
|
input again we need to re-arm the mouse tracking, as that was
|
||||||
cancelled by the mouseleave. */
|
cancelled by the mouseleave. */
|
||||||
mouse_window_ignored_leave = NULL;
|
mouse_window_ignored_leave = NULL;
|
||||||
track_mouse_event (TME_LEAVE, GDK_SURFACE_HWND (new_window));
|
track_mouse_event (TME_LEAVE, GDK_SURFACE_HWND (window));
|
||||||
}
|
}
|
||||||
|
|
||||||
g_set_object (&window, find_window_for_mouse_event (window, msg));
|
|
||||||
impl = GDK_WIN32_SURFACE (window);
|
impl = GDK_WIN32_SURFACE (window);
|
||||||
|
|
||||||
/* If we haven't moved, don't create any GDK event. Windows
|
/* If we haven't moved, don't create any GDK event. Windows
|
||||||
|
Loading…
Reference in New Issue
Block a user