diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-03-19 22:49:32 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-03-26 19:18:39 -0400 |
commit | 64ad835cdeece9d9e04c5ce27eef9bd4a862baea (patch) | |
tree | 8c40cf439e44bc692e48a51a91813d6e2c746ae2 | |
parent | 1a735006be2b39144a0b2cf05f9cc8a65ada5430 (diff) | |
download | gtk+-64ad835cdeece9d9e04c5ce27eef9bd4a862baea.tar.gz |
main: Hide popups for outside events
If the user clicks outside our surfaces, Wayland
will dismiss the popup on its own. If the user
clicks on one of our surfaces, we get the event,
but we want the same thing to happen. So, hide
the widget.
-rw-r--r-- | gtk/gtkmain.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index c15f82c49b..257de5c48b 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1329,6 +1329,27 @@ rewrite_event_for_grabs (GdkEvent *event) event_widget = gtk_get_event_widget (event); grab_widget = gtk_root_get_for_surface (grab_surface); + switch ((guint) event->any.type) + { + case GDK_BUTTON_PRESS: + case GDK_BUTTON_RELEASE: + case GDK_KEY_PRESS: + case GDK_KEY_RELEASE: + case GDK_TOUCH_BEGIN: + case GDK_TOUCH_END: + case GDK_TOUCH_CANCEL: + case GDK_TOUCHPAD_SWIPE: + case GDK_TOUCHPAD_PINCH: + if (grab_surface != event->any.surface && + GTK_IS_POPUP (grab_widget)) + { + gtk_widget_hide (grab_widget); + return NULL; + } + break; + default:; + } + if (grab_widget && gtk_main_get_window_group (grab_widget) != gtk_main_get_window_group (event_widget)) return rewrite_event_for_surface (event, grab_surface); |