summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2019-03-19 22:49:32 -0400
committerMatthias Clasen <mclasen@redhat.com>2019-03-26 19:18:39 -0400
commit64ad835cdeece9d9e04c5ce27eef9bd4a862baea (patch)
tree8c40cf439e44bc692e48a51a91813d6e2c746ae2
parent1a735006be2b39144a0b2cf05f9cc8a65ada5430 (diff)
downloadgtk+-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.c21
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);