[gtk+/wip/cssnode3: 32/91] widget: Create the CssNode
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/cssnode3: 32/91] widget: Create the CssNode
- Date: Mon, 9 Mar 2015 14:08:11 +0000 (UTC)
commit eb8ca20e0454aba5f5e1efc19059bf4347cb9c9c
Author: Benjamin Otte <otte redhat com>
Date: Sun Feb 8 16:37:08 2015 +0100
widget: Create the CssNode
... and pass it to the style context instead of having the style context
create it for us.
gtk/gtkstylecontext.c | 39 +++++++++++++--------------------------
gtk/gtkstylecontextprivate.h | 4 ++--
gtk/gtkwidget.c | 30 ++++++++++++++++++++----------
3 files changed, 35 insertions(+), 38 deletions(-)
---
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index fcbd9a9..948deb1 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -551,36 +551,21 @@ gtk_style_context_new (void)
return g_object_new (GTK_TYPE_STYLE_CONTEXT, NULL);
}
-void
-_gtk_style_context_set_widget (GtkStyleContext *context,
- GtkWidget *widget)
+GtkStyleContext *
+gtk_style_context_new_for_node (GtkCssNode *node)
{
GtkStyleContextPrivate *priv;
+ GtkStyleContext *context;
- g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
- g_return_if_fail (widget == NULL || GTK_IS_WIDGET (widget));
- g_return_if_fail (!gtk_style_context_is_saved (context));
+ g_return_val_if_fail (GTK_IS_CSS_NODE (node), NULL);
- priv = context->priv;
+ context = gtk_style_context_new ();
- if (!GTK_IS_CSS_WIDGET_NODE (priv->cssnode))
- {
- g_object_unref (priv->cssnode);
- priv->cssnode = gtk_css_widget_node_new (widget);
- gtk_css_node_set_state (priv->cssnode, GTK_STATE_FLAG_DIR_LTR);
- }
-
- if (widget)
- {
- gtk_css_node_set_widget_type (priv->cssnode, G_OBJECT_TYPE (widget));
- }
- else
- {
- gtk_css_node_set_widget_type (priv->cssnode, G_TYPE_NONE);
- gtk_css_widget_node_widget_destroyed (GTK_CSS_WIDGET_NODE (priv->cssnode));
- }
+ priv = context->priv;
+ g_object_unref (priv->cssnode);
+ priv->cssnode = g_object_ref (node);
- gtk_css_node_invalidate (gtk_style_context_get_root (context), GTK_CSS_CHANGE_ANY_SELF);
+ return context;
}
/**
@@ -1166,9 +1151,11 @@ gtk_style_context_set_parent (GtkStyleContext *context,
if (parent)
{
+ GtkCssNode *root = gtk_style_context_get_root (context);
g_object_ref (parent);
- gtk_css_node_set_parent (gtk_style_context_get_root (context),
- gtk_style_context_get_root (parent));
+
+ if (gtk_css_node_get_parent (root) == NULL)
+ gtk_css_node_set_parent (root, gtk_style_context_get_root (parent));
}
else
{
diff --git a/gtk/gtkstylecontextprivate.h b/gtk/gtkstylecontextprivate.h
index ea16ab8..3dc5bf0 100644
--- a/gtk/gtkstylecontextprivate.h
+++ b/gtk/gtkstylecontextprivate.h
@@ -28,8 +28,8 @@
G_BEGIN_DECLS
-void _gtk_style_context_set_widget (GtkStyleContext *context,
- GtkWidget *widget);
+GtkStyleContext *gtk_style_context_new_for_node (GtkCssNode *node);
+
GtkCssNode * gtk_style_context_get_root (GtkStyleContext *context);
void gtk_style_context_set_id (GtkStyleContext *context,
const char *id);
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index bed235a..abfa246 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -60,6 +60,7 @@
#include "gtksizerequest.h"
#include "gtkstylecontextprivate.h"
#include "gtkcssprovider.h"
+#include "gtkcsswidgetnodeprivate.h"
#include "gtkmodifierstyle.h"
#include "gtkversion.h"
#include "gtkdebug.h"
@@ -557,6 +558,7 @@ struct _GtkWidgetPrivate
* the font to use for text.
*/
GtkStyle *style;
+ GtkCssNode *cssnode;
GtkStyleContext *context;
/* Widget's path for styling */
@@ -733,7 +735,8 @@ struct _GtkStateData
static void gtk_widget_base_class_init (gpointer g_class);
static void gtk_widget_class_init (GtkWidgetClass *klass);
static void gtk_widget_base_class_finalize (GtkWidgetClass *klass);
-static void gtk_widget_init (GtkWidget *widget);
+static void gtk_widget_init (GTypeInstance *instance,
+ gpointer g_class);
static void gtk_widget_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -992,7 +995,7 @@ gtk_widget_get_type (void)
NULL, /* class_init */
sizeof (GtkWidget),
0, /* n_preallocs */
- (GInstanceInitFunc) gtk_widget_init,
+ gtk_widget_init,
NULL, /* value_table */
};
@@ -4454,8 +4457,9 @@ _gtk_widget_cancel_sequence (GtkWidget *widget,
}
static void
-gtk_widget_init (GtkWidget *widget)
+gtk_widget_init (GTypeInstance *instance, gpointer g_class)
{
+ GtkWidget *widget = GTK_WIDGET (instance);
GtkWidgetPrivate *priv;
widget->priv = gtk_widget_get_instance_private (widget);
@@ -4506,6 +4510,11 @@ gtk_widget_init (GtkWidget *widget)
_gtk_size_request_cache_init (&priv->requests);
+ priv->cssnode = gtk_css_widget_node_new (widget);
+ gtk_css_node_set_state (priv->cssnode, GTK_STATE_FLAG_DIR_LTR);
+ /* need to set correct type here, and only class has the correct type here */
+ gtk_css_node_set_widget_type (priv->cssnode, G_TYPE_FROM_CLASS (g_class));
+
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
priv->style = gtk_widget_get_default_style ();
G_GNUC_END_IGNORE_DEPRECATIONS;
@@ -4738,6 +4747,7 @@ gtk_widget_unparent (GtkWidget *widget)
gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP);
if (priv->context)
gtk_style_context_set_parent (priv->context, NULL);
+ gtk_css_node_set_parent (widget->priv->cssnode, NULL);
_gtk_widget_update_parent_muxer (widget);
@@ -9524,6 +9534,8 @@ gtk_widget_set_parent (GtkWidget *widget,
data.flags_to_unset = 0;
gtk_widget_propagate_state (widget, &data);
+ if (gtk_css_node_get_parent (widget->priv->cssnode) == NULL)
+ gtk_css_node_set_parent (widget->priv->cssnode, parent->priv->cssnode);
if (priv->context)
gtk_style_context_set_parent (priv->context,
gtk_widget_get_style_context (parent));
@@ -12162,11 +12174,11 @@ gtk_widget_finalize (GObject *object)
if (priv->path)
gtk_widget_path_free (priv->path);
+ gtk_css_widget_node_widget_destroyed (GTK_CSS_WIDGET_NODE (priv->cssnode));
+ g_object_unref (priv->cssnode);
+
if (priv->context)
- {
- _gtk_style_context_set_widget (priv->context, NULL);
- g_object_unref (priv->context);
- }
+ g_object_unref (priv->context);
_gtk_size_request_cache_free (&priv->requests);
@@ -16411,7 +16423,7 @@ gtk_widget_get_style_context (GtkWidget *widget)
GdkScreen *screen;
GdkFrameClock *frame_clock;
- priv->context = gtk_style_context_new ();
+ priv->context = gtk_style_context_new_for_node (priv->cssnode);
gtk_style_context_set_id (priv->context, priv->name);
gtk_style_context_set_state (priv->context, priv->state_flags);
@@ -16425,8 +16437,6 @@ gtk_widget_get_style_context (GtkWidget *widget)
if (frame_clock)
gtk_style_context_set_frame_clock (priv->context, frame_clock);
- _gtk_style_context_set_widget (priv->context, widget);
-
if (priv->parent)
gtk_style_context_set_parent (priv->context,
gtk_widget_get_style_context (priv->parent));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]