wayland: Set a more believable crossing detail on pointer enter/leave

GDK_NOTIFY_ANCESTOR would happen when the pointer crosses across a direct
parent/child. However nonlinear events are more likely, specially when
the pointer moves across toplevels (either different apps, or menus being
popped up over the pointer position).

This makes popping up comboboxes and other menus that fall over the pointer
position possible. With the previous detail the GtkMenu code misinterpreted
the crossing event, making it think the button release coming right after
should dismiss the popup, which made menus just flash on the screen unless
you kept the button pressed.
This commit is contained in:
Carlos Garnacho 2015-10-09 16:14:31 +02:00
parent c05dc28952
commit 7ab250c10c

View File

@ -881,7 +881,7 @@ pointer_handle_enter (void *data,
event->crossing.subwindow = NULL; event->crossing.subwindow = NULL;
event->crossing.time = (guint32)(g_get_monotonic_time () / 1000); event->crossing.time = (guint32)(g_get_monotonic_time () / 1000);
event->crossing.mode = GDK_CROSSING_NORMAL; event->crossing.mode = GDK_CROSSING_NORMAL;
event->crossing.detail = GDK_NOTIFY_ANCESTOR; event->crossing.detail = GDK_NOTIFY_NONLINEAR;
event->crossing.focus = TRUE; event->crossing.focus = TRUE;
event->crossing.state = 0; event->crossing.state = 0;
@ -928,7 +928,7 @@ pointer_handle_leave (void *data,
event->crossing.subwindow = NULL; event->crossing.subwindow = NULL;
event->crossing.time = (guint32)(g_get_monotonic_time () / 1000); event->crossing.time = (guint32)(g_get_monotonic_time () / 1000);
event->crossing.mode = GDK_CROSSING_NORMAL; event->crossing.mode = GDK_CROSSING_NORMAL;
event->crossing.detail = GDK_NOTIFY_ANCESTOR; event->crossing.detail = GDK_NOTIFY_NONLINEAR;
event->crossing.focus = TRUE; event->crossing.focus = TRUE;
event->crossing.state = 0; event->crossing.state = 0;