diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index 3786e356d5..65b6c4b832 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -1193,6 +1193,37 @@ gtk_style_context_get_parent (GtkStyleContext *context) return context->priv->parent; } +/* + * gtk_style_context_save_to_node: + * @context: a #GtkStyleContext + * @node: the node to save to + * + * Saves the @context state, so temporary modifications done through + * gtk_style_context_add_class(), gtk_style_context_remove_class(), + * gtk_style_context_set_state(), etc. and rendering using + * gtk_render_background() or similar functions are done using the + * given @node. + * + * To undo, call gtk_style_context_restore(). + * + * The matching call to gtk_style_context_restore() must be done + * before GTK returns to the main loop. + **/ +void +gtk_style_context_save_to_node (GtkStyleContext *context, + GtkCssNode *node) +{ + GtkStyleContextPrivate *priv; + + g_return_if_fail (GTK_IS_STYLE_CONTEXT (context)); + g_return_if_fail (GTK_IS_CSS_NODE (node)); + + priv = context->priv; + + priv->saved_nodes = g_slist_prepend (priv->saved_nodes, priv->cssnode); + priv->cssnode = g_object_ref (node); +} + /** * gtk_style_context_save: * @context: a #GtkStyleContext @@ -1226,8 +1257,9 @@ gtk_style_context_save (GtkStyleContext *context) gtk_css_node_set_parent (cssnode, gtk_style_context_get_root (context)); gtk_css_node_set_widget_type (cssnode, gtk_css_node_get_widget_type (priv->cssnode)); - priv->saved_nodes = g_slist_prepend (priv->saved_nodes, priv->cssnode); - priv->cssnode = cssnode; + gtk_style_context_save_to_node (context, cssnode); + + g_object_unref (cssnode); } /** diff --git a/gtk/gtkstylecontextprivate.h b/gtk/gtkstylecontextprivate.h index 331eb60f69..e01f4276ca 100644 --- a/gtk/gtkstylecontextprivate.h +++ b/gtk/gtkstylecontextprivate.h @@ -36,6 +36,9 @@ const char * gtk_style_context_get_id (GtkStyleContext *c GtkStyleProviderPrivate * gtk_style_context_get_style_provider (GtkStyleContext *context); +void gtk_style_context_save_to_node (GtkStyleContext *context, + GtkCssNode *node); + const GtkBitmask * _gtk_style_context_get_changes (GtkStyleContext *context);