diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2014-03-06 16:58:06 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2014-03-06 23:23:47 +0100 |
commit | 43e88528292b9c786be3de04cdd8b2a6fc8266dd (patch) | |
tree | 554ab57a627d0f8e496c1edc7d24b84f65474029 /gtk/gtkpopover.c | |
parent | dcba77fcc454229079049f41f4ddc23e5c27353f (diff) | |
download | gtk+-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.c | 15 |
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 { |