diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c index 550aa1457a..241eef5e1f 100644 --- a/gtk/gtkpopover.c +++ b/gtk/gtkpopover.c @@ -1200,12 +1200,27 @@ static gboolean gtk_popover_key_press (GtkWidget *widget, GdkEventKey *event) { + GtkWidget *toplevel, *focus; + if (event->keyval == GDK_KEY_Escape) { gtk_widget_hide (widget); return GDK_EVENT_STOP; } + if (!GTK_POPOVER (widget)->priv->modal) + return GDK_EVENT_PROPAGATE; + + toplevel = gtk_widget_get_toplevel (widget); + + if (GTK_IS_WINDOW (toplevel)) + { + focus = gtk_window_get_focus (GTK_WINDOW (toplevel)); + + if (focus && gtk_widget_is_ancestor (focus, widget)) + return gtk_window_propagate_key_event (GTK_WINDOW (toplevel), event); + } + return GDK_EVENT_PROPAGATE; }