summaryrefslogtreecommitdiff
path: root/gtk/gtkpopover.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2014-03-06 16:58:06 +0100
committerCarlos Garnacho <carlosg@gnome.org>2014-03-06 23:23:47 +0100
commit43e88528292b9c786be3de04cdd8b2a6fc8266dd (patch)
tree554ab57a627d0f8e496c1edc7d24b84f65474029 /gtk/gtkpopover.c
parentdcba77fcc454229079049f41f4ddc23e5c27353f (diff)
downloadgtk+-43e88528292b9c786be3de04cdd8b2a6fc8266dd.tar.gz
popover: Track toplevel's focus widget when visible
If the toplevel focus widget is forced out of the popover (eg. through gtk_widget_grab_focus() anywhere else), then dismiss the popover.
Diffstat (limited to 'gtk/gtkpopover.c')
-rw-r--r--gtk/gtkpopover.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 2286cff8f4..a5ed37754f 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -302,6 +302,19 @@ window_focus_out (GtkWidget *widget,
}
static void
+window_set_focus (GtkWindow *window,
+ GtkWidget *widget,
+ GtkPopover *popover)
+{
+ GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+ if (priv->modal &&
+ gtk_widget_is_drawable (GTK_WIDGET (popover)) &&
+ (!widget || !gtk_widget_is_ancestor (widget, GTK_WIDGET (popover))))
+ gtk_widget_hide (GTK_WIDGET (popover));
+}
+
+static void
gtk_popover_apply_modality (GtkPopover *popover,
gboolean modal)
{
@@ -322,6 +335,8 @@ gtk_popover_apply_modality (GtkPopover *popover,
G_CALLBACK (window_focus_in), popover);
g_signal_connect (priv->window, "focus-out-event",
G_CALLBACK (window_focus_out), popover);
+ g_signal_connect (priv->window, "set-focus",
+ G_CALLBACK (window_set_focus), popover);
}
else
{