diff options
author | Luca Bacci <luca.bacci982@gmail.com> | 2022-04-08 08:31:14 +0000 |
---|---|---|
committer | Luca Bacci <luca.bacci982@gmail.com> | 2022-04-08 08:31:14 +0000 |
commit | 048bb6db6fca24ed1c184b79f8f401de4ae1ebed (patch) | |
tree | 92f8aa78f52b42f0399ec7988fa50de1450ae0e1 | |
parent | 8c548d5579fbf113dd249040c36f287f52d0a5f7 (diff) | |
parent | cb0c1b3f0831a6522a9473a37d6ec2d8caf9c80b (diff) | |
download | gtk+-048bb6db6fca24ed1c184b79f8f401de4ae1ebed.tar.gz |
Merge branch 'gdk-win32-fix-mouse-move-crossing-events' into 'main'
GdkWin32: Mouse events fixes
Closes #4722 and #4813
See merge request GNOME/gtk!4620
-rw-r--r-- | gdk/win32/gdkevents-win32.c | 123 |
1 files changed, 55 insertions, 68 deletions
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index 39b16c3319..a5306a42cd 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -873,6 +873,7 @@ _gdk_win32_append_event (GdkEvent *event) { GdkDisplay *display; GList *link; + gulong serial; display = gdk_display_get_default (); @@ -880,8 +881,9 @@ _gdk_win32_append_event (GdkEvent *event) #if 1 link = _gdk_event_queue_append (display, event); GDK_NOTE (EVENTS, _gdk_win32_print_event (event)); + serial = _gdk_display_get_next_serial (display); /* event morphing, the passed in may not be valid afterwards */ - _gdk_windowing_got_event (display, link, event, 0); + _gdk_windowing_got_event (display, link, event, serial); #else _gdk_event_queue_append (display, event); GDK_NOTE (EVENTS, _gdk_win32_print_event (event)); @@ -2242,6 +2244,10 @@ gdk_event_translate (MSG *msg, button = 5; buttonup0: + { + gboolean release_implicit_grab = FALSE; + GdkSurface *prev_surface = NULL; + GDK_NOTE (EVENTS, g_print (" (%d,%d)", GET_X_LPARAM (msg->lParam), GET_Y_LPARAM (msg->lParam))); @@ -2251,41 +2257,18 @@ gdk_event_translate (MSG *msg, g_set_object (&window, find_window_for_mouse_event (window, msg)); if (pointer_grab != NULL && pointer_grab->implicit) - { - int state = build_pointer_event_state (msg); - - /* We keep the implicit grab until no buttons at all are held down */ - if ((state & GDK_ANY_BUTTON_MASK & ~(GDK_BUTTON1_MASK << (button - 1))) == 0) - { - ReleaseCapture (); - - new_window = NULL; - hwnd = WindowFromPoint (msg->pt); - if (hwnd != NULL) - { - POINT client_pt = msg->pt; - - ScreenToClient (hwnd, &client_pt); - GetClientRect (hwnd, &rect); - if (PtInRect (&rect, client_pt)) - new_window = gdk_win32_handle_table_lookup (hwnd); - } + { + int state = build_pointer_event_state (msg); - synthesize_crossing_events (display, - _gdk_device_manager->system_pointer, - pointer_grab->surface, new_window, - GDK_CROSSING_UNGRAB, - &msg->pt, - 0, /* TODO: Set right mask */ - _gdk_win32_get_next_tick (msg->time), - FALSE); - g_set_object (&mouse_window, new_window); - mouse_window_ignored_leave = NULL; - } - } + /* We keep the implicit grab until no buttons at all are held down */ + if ((state & GDK_ANY_BUTTON_MASK & ~(GDK_BUTTON1_MASK << (button - 1))) == 0) + { + release_implicit_grab = TRUE; + prev_surface = pointer_grab->surface; + } + } - generate_button_event (GDK_BUTTON_RELEASE, button, - window, msg); + generate_button_event (GDK_BUTTON_RELEASE, button, window, msg); impl = GDK_WIN32_SURFACE (window); @@ -2294,8 +2277,37 @@ gdk_event_translate (MSG *msg, impl->drag_move_resize_context.button == button) gdk_win32_surface_end_move_resize_drag (window); + if (release_implicit_grab) + { + ReleaseCapture (); + + new_window = NULL; + hwnd = WindowFromPoint (msg->pt); + if (hwnd != NULL) + { + POINT client_pt = msg->pt; + + ScreenToClient (hwnd, &client_pt); + GetClientRect (hwnd, &rect); + if (PtInRect (&rect, client_pt)) + new_window = gdk_win32_handle_table_lookup (hwnd); + } + + synthesize_crossing_events (display, + _gdk_device_manager->system_pointer, + prev_surface, new_window, + GDK_CROSSING_UNGRAB, + &msg->pt, + 0, /* TODO: Set right mask */ + _gdk_win32_get_next_tick (msg->time), + FALSE); + g_set_object (&mouse_window, new_window); + mouse_window_ignored_leave = NULL; + } + return_val = TRUE; break; + } case WM_MOUSEMOVE: GDK_NOTE (EVENTS, @@ -2320,60 +2332,35 @@ gdk_event_translate (MSG *msg, pen_touch_input = FALSE; - new_window = window; - - if (pointer_grab != NULL) - { - 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; - } + g_set_object (&window, find_window_for_mouse_event (window, msg)); - if (mouse_window != new_window) + if (mouse_window != window) { GDK_NOTE (EVENTS, g_print (" mouse_window %p -> %p", 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, _gdk_device_manager->system_pointer, - mouse_window, new_window, + mouse_window, window, GDK_CROSSING_NORMAL, &msg->pt, 0, /* TODO: Set right mask */ _gdk_win32_get_next_tick (msg->time), FALSE); - g_set_object (&mouse_window, new_window); + g_set_object (&mouse_window, window); mouse_window_ignored_leave = NULL; - if (new_window != NULL) - track_mouse_event (TME_LEAVE, GDK_SURFACE_HWND (new_window)); + if (window != NULL) + track_mouse_event (TME_LEAVE, GDK_SURFACE_HWND (window)); } - else if (new_window != NULL && - new_window == mouse_window_ignored_leave) + else if (window != NULL && window == mouse_window_ignored_leave) { /* 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 cancelled by the mouseleave. */ 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); /* If we haven't moved, don't create any GDK event. Windows |