[gtk+/wip/cssnode3: 73/88] cssnode: Merge the 2 places that compute styles
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/cssnode3: 73/88] cssnode: Merge the 2 places that compute styles
- Date: Thu, 5 Mar 2015 19:56:58 +0000 (UTC)
commit ad488b6be416da228cb09c084aadf89ef0c55440
Author: Benjamin Otte <otte redhat com>
Date: Sun Feb 22 23:28:04 2015 +0100
cssnode: Merge the 2 places that compute styles
Now that the widget node recomputes styles on update_style() we can just
call it during validate(). That way, we don't need the widget node to
manually compute its style.
gtk/gtkcssnode.c | 37 +++++------------
gtk/gtkcssnodeprivate.h | 7 +---
gtk/gtkcsswidgetnode.c | 97 +---------------------------------------------
3 files changed, 15 insertions(+), 126 deletions(-)
---
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index 0aaf64d..8f089e0 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -35,7 +35,7 @@ gtk_css_node_get_style_provider_or_null (GtkCssNode *cssnode)
return GTK_CSS_NODE_GET_CLASS (cssnode)->get_style_provider (cssnode);
}
-void
+static void
gtk_css_node_set_invalid (GtkCssNode *node,
gboolean invalid)
{
@@ -295,13 +295,9 @@ gtk_css_node_real_dequeue_validate (GtkCssNode *node)
{
}
-static GtkCssStyle *
-gtk_css_node_real_validate (GtkCssNode *cssnode,
- GtkCssStyle *current_style,
- gint64 timestamp,
- GtkCssChange change)
+static void
+gtk_css_node_real_validate (GtkCssNode *node)
{
- return NULL;
}
gboolean
@@ -876,8 +872,6 @@ gtk_css_node_validate_internal (GtkCssNode *cssnode,
gint64 timestamp)
{
GtkCssNode *child;
- GtkCssStyle *new_style;
- gboolean changed;
/* If you run your application with
* GTK_DEBUG=no-css-cache
@@ -894,27 +888,18 @@ gtk_css_node_validate_internal (GtkCssNode *cssnode,
if (G_UNLIKELY (gtk_get_debug_flags () & GTK_DEBUG_NO_CSS_CACHE))
cssnode->pending_changes |= GTK_CSS_CHANGE_ANY;
- if (!cssnode->invalid && cssnode->pending_changes == 0)
+ if (!cssnode->invalid)
return;
- gtk_css_node_set_invalid (cssnode, FALSE);
+ gtk_css_node_ensure_style (cssnode, timestamp);
- cssnode->style_is_invalid = FALSE;
-
- new_style = GTK_CSS_NODE_GET_CLASS (cssnode)->validate (cssnode, cssnode->style, timestamp,
cssnode->pending_changes);
- if (new_style)
- {
- gtk_css_node_set_style (cssnode, new_style);
- g_object_unref (new_style);
- changed = TRUE;
- }
- else
- {
- changed = FALSE;
- }
+ /* need to set to FALSE then to TRUE here to make it chain up */
+ gtk_css_node_set_invalid (cssnode, FALSE);
+ if (GTK_IS_CSS_ANIMATED_STYLE (cssnode->style) &&
+ !gtk_css_animated_style_is_static (GTK_CSS_ANIMATED_STYLE (cssnode->style)))
+ gtk_css_node_set_invalid (cssnode, TRUE);
- gtk_css_node_propagate_pending_changes (cssnode, changed);
- cssnode->pending_changes = 0;
+ GTK_CSS_NODE_GET_CLASS (cssnode)->validate (cssnode);
for (child = gtk_css_node_get_first_child (cssnode);
child;
diff --git a/gtk/gtkcssnodeprivate.h b/gtk/gtkcssnodeprivate.h
index 1fb0a49..1b22fe5 100644
--- a/gtk/gtkcssnodeprivate.h
+++ b/gtk/gtkcssnodeprivate.h
@@ -79,10 +79,7 @@ struct _GtkCssNodeClass
void (* invalidate) (GtkCssNode *node);
void (* queue_validate) (GtkCssNode *node);
void (* dequeue_validate) (GtkCssNode *node);
- GtkCssStyle * (* validate) (GtkCssNode *cssnode,
- GtkCssStyle *current_style,
- gint64 timestamp,
- GtkCssChange change);
+ void (* validate) (GtkCssNode *node);
};
GType gtk_css_node_get_type (void) G_GNUC_CONST;
@@ -147,8 +144,6 @@ void gtk_css_node_invalidate_frame_clock
void gtk_css_node_invalidate (GtkCssNode *cssnode,
GtkCssChange change);
void gtk_css_node_validate (GtkCssNode *cssnode);
-void gtk_css_node_set_invalid (GtkCssNode *node,
- gboolean invalid);
gboolean gtk_css_node_init_matcher (GtkCssNode *cssnode,
GtkCssMatcher *matcher);
diff --git a/gtk/gtkcsswidgetnode.c b/gtk/gtkcsswidgetnode.c
index f4c27fe..668f6c2 100644
--- a/gtk/gtkcsswidgetnode.c
+++ b/gtk/gtkcsswidgetnode.c
@@ -103,111 +103,20 @@ gtk_css_widget_node_dequeue_validate (GtkCssNode *node)
G_GNUC_END_IGNORE_DEPRECATIONS
}
-static gboolean
-should_create_transitions (GtkCssChange change)
-{
- return (change & GTK_CSS_CHANGE_ANIMATIONS) == 0;
-}
-
-static gboolean
-gtk_css_static_style_needs_revalidate (GtkCssStaticStyle *style,
- GtkCssChange change)
-{
- /* Try to avoid invalidating if we can */
- if (change & GTK_CSS_RADICAL_CHANGE)
- return TRUE;
-
- if (gtk_css_static_style_get_change (style) & change)
- return TRUE;
- else
- return FALSE;
-}
-
-static GtkCssStyle *
-validate_static_style (GtkCssNode *node,
- GtkCssStyle *style,
- GtkCssChange change)
-{
- if (gtk_css_static_style_needs_revalidate (GTK_CSS_STATIC_STYLE (style), change))
- {
- return gtk_css_node_create_style (node);
- }
- else
- {
- return g_object_ref (style);
- }
-}
-
-static GtkCssStyle *
-gtk_css_widget_node_validate (GtkCssNode *node,
- GtkCssStyle *style,
- gint64 timestamp,
- GtkCssChange change)
+static void
+gtk_css_widget_node_validate (GtkCssNode *node)
{
GtkCssWidgetNode *widget_node = GTK_CSS_WIDGET_NODE (node);
GtkStyleContext *context;
- GtkBitmask *changes;
- GtkCssStyle *static_style, *new_style, *new_static_style;
if (widget_node->widget == NULL)
- return FALSE;
+ return;
context = gtk_widget_get_style_context (widget_node->widget);
- if (style == NULL)
- style = gtk_css_static_style_get_default ();
-
- if (GTK_IS_CSS_ANIMATED_STYLE (style))
- {
- static_style = GTK_CSS_ANIMATED_STYLE (style)->style;
- }
- else
- {
- static_style = style;
- }
-
- new_static_style = validate_static_style (node, static_style, change);
-
- if (new_static_style != static_style || (change & GTK_CSS_CHANGE_ANIMATIONS))
- {
- GtkCssNode *parent = gtk_css_node_get_parent (node);
- new_style = gtk_css_animated_style_new (new_static_style,
- parent ? gtk_css_node_get_style (parent) : NULL,
- timestamp,
- gtk_css_node_get_style_provider (node),
- should_create_transitions (change) ? style : NULL);
-
- g_object_unref (new_static_style);
- }
- else if (GTK_IS_CSS_ANIMATED_STYLE (style) && (change & GTK_CSS_CHANGE_TIMESTAMP))
- {
- new_style = gtk_css_animated_style_new_advance (GTK_CSS_ANIMATED_STYLE (style),
- static_style,
- timestamp);
- }
- else
- {
- new_style = g_object_ref (style);
- }
-
- if (GTK_IS_CSS_ANIMATED_STYLE (new_style) &&
- !gtk_css_animated_style_is_static (GTK_CSS_ANIMATED_STYLE (new_style)))
- gtk_css_node_set_invalid (node, TRUE);
-
- changes = gtk_css_style_get_difference (new_style, style);
- widget_node->accumulated_changes = _gtk_bitmask_union (widget_node->accumulated_changes, changes);
- _gtk_bitmask_free (changes);
gtk_style_context_validate (context, widget_node->accumulated_changes);
_gtk_bitmask_free (widget_node->accumulated_changes);
widget_node->accumulated_changes = _gtk_bitmask_new ();
-
- if (_gtk_bitmask_is_empty (changes) && !GTK_IS_CSS_ANIMATED_STYLE (new_style))
- {
- g_object_unref (new_style);
- new_style = NULL;
- }
-
- return new_style;
}
typedef GtkWidgetPath * (* GetPathForChildFunc) (GtkContainer *, GtkWidget *);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]