mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-26 21:51:08 +00:00
Fix crossing event order and some details
This commit is contained in:
parent
b771c9924d
commit
f2b50ff638
@ -810,7 +810,7 @@ _gdk_display_set_has_pointer_grab (GdkDisplay *display,
|
||||
GDK_CROSSING_GRAB,
|
||||
x, y, state,
|
||||
time,
|
||||
NULL, FALSE);
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -823,7 +823,7 @@ _gdk_display_set_has_pointer_grab (GdkDisplay *display,
|
||||
GDK_CROSSING_GRAB,
|
||||
x, y, state,
|
||||
time,
|
||||
NULL, FALSE);
|
||||
NULL);
|
||||
_gdk_windowing_window_get_pointer (display,
|
||||
dest_toplevel,
|
||||
&x, &y, &state);
|
||||
@ -833,7 +833,7 @@ _gdk_display_set_has_pointer_grab (GdkDisplay *display,
|
||||
GDK_CROSSING_GRAB,
|
||||
x, y, state,
|
||||
time,
|
||||
NULL, FALSE);
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -869,6 +869,9 @@ _gdk_display_unset_has_pointer_grab (GdkDisplay *display,
|
||||
old_grab_window = display->pointer_grab.window;
|
||||
old_native_grab_window = display->pointer_grab.native_window;
|
||||
|
||||
if (old_grab_window == NULL)
|
||||
return; /* This happens in the gdk_window_hide case */
|
||||
|
||||
if (do_grab_one_pointer_release_event)
|
||||
display->pointer_grab.grab_one_pointer_release_event = display->pointer_grab.window;
|
||||
|
||||
@ -921,7 +924,7 @@ _gdk_display_unset_has_pointer_grab (GdkDisplay *display,
|
||||
GDK_CROSSING_UNGRAB,
|
||||
x, y, state,
|
||||
time,
|
||||
NULL, FALSE);
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -939,7 +942,7 @@ _gdk_display_unset_has_pointer_grab (GdkDisplay *display,
|
||||
GDK_CROSSING_UNGRAB,
|
||||
x, y, state,
|
||||
time,
|
||||
NULL, FALSE);
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -950,14 +953,14 @@ _gdk_display_unset_has_pointer_grab (GdkDisplay *display,
|
||||
GDK_CROSSING_UNGRAB,
|
||||
x, y, state,
|
||||
time,
|
||||
NULL, FALSE);
|
||||
NULL);
|
||||
_gdk_syntesize_crossing_events (display,
|
||||
NULL,
|
||||
pointer_window,
|
||||
GDK_CROSSING_UNGRAB,
|
||||
x, y, state,
|
||||
time,
|
||||
NULL, FALSE);
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -526,8 +526,7 @@ void _gdk_syntesize_crossing_events (GdkDisplay *display,
|
||||
gint toplevel_y,
|
||||
GdkModifierType mask,
|
||||
guint32 time_,
|
||||
GdkEvent *event_in_queue,
|
||||
gboolean before_event);
|
||||
GdkEvent *event_in_queue);
|
||||
|
||||
void _gdk_syntesize_crossing_events_for_geometry_change (GdkWindow *changed_window);
|
||||
|
||||
|
@ -2489,6 +2489,9 @@ setup_clip_for_draw (GdkDrawable *drawable,
|
||||
GdkWindowObject *private = (GdkWindowObject *)drawable;
|
||||
GdkRegion *clip;
|
||||
|
||||
if (private->window_type == GDK_WINDOW_ROOT)
|
||||
return;
|
||||
|
||||
if (_gdk_gc_get_subwindow (gc) == GDK_CLIP_BY_CHILDREN)
|
||||
clip = private->clip_region_with_children;
|
||||
else
|
||||
@ -7012,8 +7015,7 @@ send_crossing_event (GdkDisplay *display,
|
||||
gint toplevel_y,
|
||||
GdkModifierType mask,
|
||||
guint32 time_,
|
||||
GdkEvent *event_in_queue,
|
||||
gboolean before_event)
|
||||
GdkEvent *event_in_queue)
|
||||
{
|
||||
GdkEvent *event;
|
||||
guint32 event_mask;
|
||||
@ -7030,7 +7032,7 @@ send_crossing_event (GdkDisplay *display,
|
||||
|
||||
if (window->event_mask & event_mask)
|
||||
{
|
||||
event = _gdk_make_event ((GdkWindow *)window, type, event_in_queue, before_event);
|
||||
event = _gdk_make_event ((GdkWindow *)window, type, event_in_queue, TRUE);
|
||||
event->crossing.time = time_;
|
||||
event->crossing.subwindow = subwindow;
|
||||
if (subwindow)
|
||||
@ -7062,8 +7064,7 @@ _gdk_syntesize_crossing_events (GdkDisplay *display,
|
||||
gint toplevel_y,
|
||||
GdkModifierType mask,
|
||||
guint32 time_,
|
||||
GdkEvent *event_in_queue,
|
||||
gboolean before_event)
|
||||
GdkEvent *event_in_queue)
|
||||
{
|
||||
GdkWindowObject *c;
|
||||
GdkWindowObject *win, *last, *next;
|
||||
@ -7103,7 +7104,7 @@ _gdk_syntesize_crossing_events (GdkDisplay *display,
|
||||
NULL,
|
||||
toplevel_x, toplevel_y,
|
||||
mask, time_,
|
||||
event_in_queue, before_event);
|
||||
event_in_queue);
|
||||
|
||||
if (c != a)
|
||||
{
|
||||
@ -7123,7 +7124,7 @@ _gdk_syntesize_crossing_events (GdkDisplay *display,
|
||||
(GdkWindow *)last,
|
||||
toplevel_x, toplevel_y,
|
||||
mask, time_,
|
||||
event_in_queue, before_event);
|
||||
event_in_queue);
|
||||
|
||||
last = win;
|
||||
win = win->parent;
|
||||
@ -7168,7 +7169,7 @@ _gdk_syntesize_crossing_events (GdkDisplay *display,
|
||||
(GdkWindow *)next,
|
||||
toplevel_x, toplevel_y,
|
||||
mask, time_,
|
||||
event_in_queue, before_event);
|
||||
event_in_queue);
|
||||
}
|
||||
g_list_free (path);
|
||||
}
|
||||
@ -7188,7 +7189,7 @@ _gdk_syntesize_crossing_events (GdkDisplay *display,
|
||||
NULL,
|
||||
toplevel_x, toplevel_y,
|
||||
mask, time_,
|
||||
event_in_queue, before_event);
|
||||
event_in_queue);
|
||||
}
|
||||
}
|
||||
|
||||
@ -7271,7 +7272,7 @@ _gdk_syntesize_crossing_events_for_geometry_change (GdkWindow *changed_window)
|
||||
display->pointer_info.toplevel_y,
|
||||
display->pointer_info.state,
|
||||
GDK_CURRENT_TIME,
|
||||
NULL, FALSE);
|
||||
NULL);
|
||||
set_window_under_pointer (display, new_window_under_pointer);
|
||||
}
|
||||
}
|
||||
@ -7367,7 +7368,7 @@ proxy_pointer_event (GdkDisplay *display,
|
||||
GDK_CROSSING_NORMAL,
|
||||
toplevel_x, toplevel_y,
|
||||
state, time_,
|
||||
source_event, source_event->type == GDK_LEAVE_NOTIFY);
|
||||
source_event);
|
||||
|
||||
set_window_under_pointer (display, pointer_window);
|
||||
}
|
||||
@ -7551,19 +7552,6 @@ _gdk_windowing_got_event (GdkDisplay *display,
|
||||
* when grabbing.
|
||||
*/
|
||||
|
||||
/* Some grab in another window (by perhaps another client) did a grab.
|
||||
* The pointer is still in this window, but we won't get told if it
|
||||
* moves out, so NULL this now and set it back to the right value at
|
||||
* ungrab time.
|
||||
*/
|
||||
if (event->type == GDK_LEAVE_NOTIFY &&
|
||||
event->crossing.mode == GDK_CROSSING_GRAB)
|
||||
{
|
||||
g_assert (display->pointer_info.toplevel_under_pointer == event_window);
|
||||
g_object_unref (display->pointer_info.toplevel_under_pointer);
|
||||
display->pointer_info.toplevel_under_pointer = NULL;
|
||||
}
|
||||
|
||||
/* We ended up in this window after some (perhaps other clients)
|
||||
grab, so update the toplevel_under_window state */
|
||||
if (event->type == GDK_ENTER_NOTIFY &&
|
||||
@ -7581,14 +7569,16 @@ _gdk_windowing_got_event (GdkDisplay *display,
|
||||
if (event->type == GDK_ENTER_NOTIFY &&
|
||||
event->crossing.detail != GDK_NOTIFY_INFERIOR)
|
||||
{
|
||||
g_assert (display->pointer_info.toplevel_under_pointer == NULL);
|
||||
if (display->pointer_info.toplevel_under_pointer)
|
||||
g_object_unref (display->pointer_info.toplevel_under_pointer);
|
||||
display->pointer_info.toplevel_under_pointer = g_object_ref (event_window);
|
||||
}
|
||||
else if (event->type == GDK_LEAVE_NOTIFY &&
|
||||
event->crossing.detail != GDK_NOTIFY_INFERIOR)
|
||||
event->crossing.detail != GDK_NOTIFY_INFERIOR &&
|
||||
display->pointer_info.toplevel_under_pointer == event_window)
|
||||
{
|
||||
g_assert (display->pointer_info.toplevel_under_pointer == event_window);
|
||||
g_object_unref (display->pointer_info.toplevel_under_pointer);
|
||||
if (display->pointer_info.toplevel_under_pointer)
|
||||
g_object_unref (display->pointer_info.toplevel_under_pointer);
|
||||
display->pointer_info.toplevel_under_pointer = NULL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user