diff options
author | Matthias Clasen <mclasen@redhat.com> | 2015-04-17 00:10:06 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2015-05-02 20:34:28 -0400 |
commit | e1c1fc59e5cad92b4d81df94001c51be070fd905 (patch) | |
tree | 8070dc4ffb61f3b06a97a51a6f626a53f4b291d4 /gtk | |
parent | 3682c761ed5a98319d8f415fee60b9e02bc2d04f (diff) | |
download | gtk+-e1c1fc59e5cad92b4d81df94001c51be070fd905.tar.gz |
Add default widget handling to popovers
Add a new API, gtk_popover_set_default_widget, that can be
used to make a widget act as default while the popover is
shown. This is useful in dialog-like popovers.
http://bugzilla.gnome.org/show_bug.cgi?id=747664
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkpopover.c | 69 | ||||
-rw-r--r-- | gtk/gtkpopover.h | 6 |
2 files changed, 75 insertions, 0 deletions
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c index 88a083d094..49d2fc2c47 100644 --- a/gtk/gtkpopover.c +++ b/gtk/gtkpopover.c @@ -134,6 +134,8 @@ struct _GtkPopoverPrivate GtkWidget *widget; GtkWindow *window; GtkWidget *prev_focus_widget; + GtkWidget *default_widget; + GtkWidget *prev_default; GtkScrollable *parent_scrollable; GtkAdjustment *vadj; GtkAdjustment *hadj; @@ -577,10 +579,17 @@ gtk_popover_set_state (GtkPopover *popover, static void gtk_popover_map (GtkWidget *widget) { + GtkPopoverPrivate *priv = GTK_POPOVER (widget)->priv; + + priv->prev_default = gtk_window_get_default_widget (priv->window); + g_object_ref (priv->prev_default); + GTK_WIDGET_CLASS (gtk_popover_parent_class)->map (widget); gdk_window_show (gtk_widget_get_window (widget)); gtk_popover_update_position (GTK_POPOVER (widget)); + + gtk_window_set_default (priv->window, priv->default_widget); } static void @@ -592,6 +601,9 @@ gtk_popover_unmap (GtkWidget *widget) gdk_window_hide (gtk_widget_get_window (widget)); GTK_WIDGET_CLASS (gtk_popover_parent_class)->unmap (widget); + + gtk_window_set_default (priv->window, priv->prev_default); + g_clear_object (&priv->prev_default); } static void @@ -2357,3 +2369,60 @@ gtk_popover_new_from_model (GtkWidget *relative_to, return popover; } + +/** + * gtk_popover_set_default_widget: + * @popover: a #GtkPopover + * @widget: (allow-none): the new default widget, or %NULL + * + * Sets the widget that should be set as default widget while + * the popover is shown (see gtk_window_set_default()). #GtkPopover + * remembers the previous default widget and reestablishes it + * when the popover is dismissed. + * + * Since: 3.18 + */ +void +gtk_popover_set_default_widget (GtkPopover *popover, + GtkWidget *widget) +{ + GtkPopoverPrivate *priv = popover->priv; + + g_return_if_fail (GTK_IS_POPOVER (popover)); + g_return_if_fail (widget == NULL || gtk_widget_get_can_default (widget)); + + if (priv->default_widget == widget) + return; + + if (priv->default_widget) + g_object_unref (priv->default_widget); + + priv->default_widget = widget; + + if (priv->default_widget) + g_object_ref (priv->default_widget); + + if (gtk_widget_get_mapped (GTK_WIDGET (popover))) + gtk_window_set_default (priv->window, priv->default_widget); +} + +/** + * gtk_popover_get_default_widget: + * @popover: a #GtkPopover + * + * Gets the widget that should be set as the default while + * the popover is shown. + * + * Returns: (transfer none): the default widget, or %NULL if there is none + * + * Since: 3.18 + */ +GtkWidget * +gtk_popover_get_default_widget (GtkPopover *popover) +{ + GtkPopoverPrivate *priv = popover->priv; + + g_return_if_fail (GTK_IS_POPOVER (popover)); + + return priv->default_widget; +} diff --git a/gtk/gtkpopover.h b/gtk/gtkpopover.h index 21c47fa744..f226bb2d4c 100644 --- a/gtk/gtkpopover.h +++ b/gtk/gtkpopover.h @@ -103,6 +103,12 @@ void gtk_popover_set_transitions_enabled (GtkPopover *popover, GDK_AVAILABLE_IN_3_16 gboolean gtk_popover_get_transitions_enabled (GtkPopover *popover); +GDK_AVAILABLE_IN_3_18 +void gtk_popover_set_default_widget (GtkPopover *popover, + GtkWidget *widget); +GDK_AVAILABLE_IN_3_18 +GtkWidget * gtk_popover_get_default_widget (GtkPopover *popover); + G_END_DECLS #endif /* __GTK_POPOVER_H__ */ |