void gtk_css_node_validate_internal (GtkCssNode *cssnode, gint64 timestamp) { GtkCssNode *child; if (!cssnode->invalid) return; gtk_css_node_ensure_style (cssnode, timestamp); /* need to set to FALSE then to TRUE here to make it chain up */ gtk_css_node_set_invalid (cssnode, FALSE); if (!gtk_css_style_is_static (cssnode->style)) gtk_css_node_set_invalid (cssnode, TRUE); GTK_CSS_NODE_GET_CLASS (cssnode)->validate (cssnode); for (child = gtk_css_node_get_first_child (cssnode); child; child = gtk_css_node_get_next_sibling (child)) { if (child->visible) gtk_css_node_validate_internal (child, timestamp); } }
static void gtk_css_node_set_invalid (GtkCssNode *node, gboolean invalid) { if (node->invalid == invalid) return; node->invalid = invalid; if (node->visible) { if (node->parent) { if (invalid) gtk_css_node_set_invalid (node->parent, TRUE); } else { if (invalid) GTK_CSS_NODE_GET_CLASS (node)->queue_validate (node); else GTK_CSS_NODE_GET_CLASS (node)->dequeue_validate (node); } } }
void gtk_css_node_set_visible (GtkCssNode *cssnode, gboolean visible) { GtkCssNode *iter; if (cssnode->visible == visible) return; cssnode->visible = visible; g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_VISIBLE]); if (cssnode->invalid) { if (cssnode->visible) { if (cssnode->parent) gtk_css_node_set_invalid (cssnode->parent, TRUE); else GTK_CSS_NODE_GET_CLASS (cssnode)->queue_validate (cssnode); } else { if (cssnode->parent == NULL) GTK_CSS_NODE_GET_CLASS (cssnode)->dequeue_validate (cssnode); } } if (cssnode->next_sibling) { gtk_css_node_invalidate (cssnode->next_sibling, GTK_CSS_CHANGE_ANY_SIBLING | GTK_CSS_CHANGE_NTH_CHILD); if (gtk_css_node_is_first_child (cssnode)) { for (iter = cssnode->next_sibling; iter != NULL; iter = iter->next_sibling) { gtk_css_node_invalidate (iter, GTK_CSS_CHANGE_FIRST_CHILD); if (iter->visible) break; } } } if (cssnode->previous_sibling) { if (gtk_css_node_is_last_child (cssnode)) { for (iter = cssnode->previous_sibling; iter != NULL; iter = iter->previous_sibling) { gtk_css_node_invalidate (iter, GTK_CSS_CHANGE_LAST_CHILD); if (iter->visible) break; } } gtk_css_node_invalidate (cssnode->parent->first_child, GTK_CSS_CHANGE_NTH_LAST_CHILD); } }
void gtk_css_node_set_visible (GtkCssNode *cssnode, gboolean visible) { if (cssnode->visible == visible) return; cssnode->visible = visible; g_object_notify_by_pspec (G_OBJECT (cssnode), cssnode_properties[PROP_VISIBLE]); if (cssnode->invalid) { if (cssnode->visible) { if (cssnode->parent) gtk_css_node_set_invalid (cssnode->parent, TRUE); else GTK_CSS_NODE_GET_CLASS (cssnode)->queue_validate (cssnode); } else { if (cssnode->parent == NULL) GTK_CSS_NODE_GET_CLASS (cssnode)->dequeue_validate (cssnode); } } if (cssnode->next_sibling) gtk_css_node_invalidate (cssnode->next_sibling, GTK_CSS_CHANGE_ANY_SIBLING | GTK_CSS_CHANGE_NTH_CHILD | (cssnode->previous_sibling ? 0 : GTK_CSS_CHANGE_FIRST_CHILD)); if (cssnode->previous_sibling) gtk_css_node_invalidate (cssnode->previous_sibling, GTK_CSS_CHANGE_NTH_LAST_CHILD | (cssnode->next_sibling ? 0 : GTK_CSS_CHANGE_LAST_CHILD)); }
void gtk_css_node_validate_internal (GtkCssNode *cssnode, gint64 timestamp) { GtkCssNode *child; /* If you run your application with * GTK_DEBUG=no-css-cache * every invalidation will purge the cache and completely query * everything anew form the cache. This is slow (in particular * when animating), but useful for figuring out bugs. * * We achieve that by pretending that everything that could have * changed has and so we of course totally need to redo everything. * * Note that this also completely revalidates child widgets all * the time. */ #ifdef G_ENABLE_DEBUG if (GTK_DEBUG_CHECK (NO_CSS_CACHE)) cssnode->pending_changes |= GTK_CSS_CHANGE_ANY; #endif if (!cssnode->invalid) return; gtk_css_node_ensure_style (cssnode, timestamp); /* need to set to FALSE then to TRUE here to make it chain up */ gtk_css_node_set_invalid (cssnode, FALSE); if (!gtk_css_style_is_static (cssnode->style)) gtk_css_node_set_invalid (cssnode, TRUE); GTK_CSS_NODE_GET_CLASS (cssnode)->validate (cssnode); for (child = gtk_css_node_get_first_child (cssnode); child; child = gtk_css_node_get_next_sibling (child)) { if (child->visible) gtk_css_node_validate_internal (child, timestamp); } }
static void gtk_css_node_dispose (GObject *object) { GtkCssNode *cssnode = GTK_CSS_NODE (object); while (cssnode->first_child) { gtk_css_node_set_parent (cssnode->first_child, NULL); } gtk_css_node_set_invalid (cssnode, FALSE); G_OBJECT_CLASS (gtk_css_node_parent_class)->dispose (object); }
static GtkCssStyle * gtk_css_node_real_update_style (GtkCssNode *cssnode, GtkCssChange change, gint64 timestamp, GtkCssStyle *style) { GtkCssStyle *static_style, *new_static_style, *new_style; if (GTK_IS_CSS_ANIMATED_STYLE (style)) { static_style = GTK_CSS_ANIMATED_STYLE (style)->style; } else { static_style = style; } if (gtk_css_style_needs_recreation (static_style, change)) new_static_style = gtk_css_node_create_style (cssnode); else new_static_style = g_object_ref (static_style); if (new_static_style != static_style || (change & GTK_CSS_CHANGE_ANIMATIONS)) { GtkCssNode *parent = gtk_css_node_get_parent (cssnode); 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 (cssnode), should_create_transitions (change) ? style : NULL); } else if (static_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_css_style_is_static (new_style)) gtk_css_node_set_invalid (cssnode, TRUE); g_object_unref (new_static_style); return new_style; }
static void gtk_css_node_invalidate_style (GtkCssNode *cssnode) { if (cssnode->style_is_invalid) return; cssnode->style_is_invalid = TRUE; gtk_css_node_set_invalid (cssnode, TRUE); if (cssnode->first_child) gtk_css_node_invalidate_style (cssnode->first_child); if (cssnode->next_sibling) gtk_css_node_invalidate_style (cssnode->next_sibling); }
static void gtk_css_node_reposition (GtkCssNode *node, GtkCssNode *new_parent, GtkCssNode *previous) { GtkCssNode *old_parent; g_assert (! (new_parent == NULL && previous != NULL)); old_parent = node->parent; /* Take a reference here so the whole function has a reference */ g_object_ref (node); if (node->visible) { if (node->next_sibling) gtk_css_node_invalidate (node->next_sibling, GTK_CSS_CHANGE_ANY_SIBLING | GTK_CSS_CHANGE_NTH_CHILD | (node->previous_sibling ? 0 : GTK_CSS_CHANGE_FIRST_CHILD)); else if (node->previous_sibling) gtk_css_node_invalidate (node->previous_sibling, GTK_CSS_CHANGE_LAST_CHILD); } if (old_parent != NULL) { g_signal_emit (old_parent, cssnode_signals[NODE_REMOVED], 0, node, node->previous_sibling); if (old_parent->first_child && node->visible) gtk_css_node_invalidate (old_parent->first_child, GTK_CSS_CHANGE_NTH_LAST_CHILD); } if (old_parent != new_parent) { if (old_parent == NULL) { gtk_css_node_parent_will_be_set (node); } else { g_object_unref (node); } if (gtk_css_node_get_style_provider_or_null (node) == NULL) gtk_css_node_invalidate_style_provider (node); gtk_css_node_invalidate (node, GTK_CSS_CHANGE_TIMESTAMP | GTK_CSS_CHANGE_ANIMATIONS); if (new_parent) { g_object_ref (node); if (node->pending_changes) new_parent->needs_propagation = TRUE; if (node->invalid && node->visible) gtk_css_node_set_invalid (new_parent, TRUE); } else { gtk_css_node_parent_was_unset (node); } } if (new_parent) { g_signal_emit (new_parent, cssnode_signals[NODE_ADDED], 0, node, previous); if (node->visible) gtk_css_node_invalidate (new_parent->first_child, GTK_CSS_CHANGE_NTH_LAST_CHILD); } if (node->visible) { if (node->next_sibling) { if (node->previous_sibling == NULL) gtk_css_node_invalidate (node->next_sibling, GTK_CSS_CHANGE_FIRST_CHILD); else gtk_css_node_invalidate_style (node->next_sibling); } else if (node->previous_sibling) { gtk_css_node_invalidate (node->previous_sibling, GTK_CSS_CHANGE_LAST_CHILD); } } else { if (node->next_sibling) gtk_css_node_invalidate_style (node->next_sibling); } gtk_css_node_invalidate (node, GTK_CSS_CHANGE_ANY_PARENT | GTK_CSS_CHANGE_ANY_SIBLING | GTK_CSS_CHANGE_NTH_CHILD | (node->previous_sibling ? 0 : GTK_CSS_CHANGE_FIRST_CHILD) | (node->next_sibling ? 0 : GTK_CSS_CHANGE_LAST_CHILD)); g_object_unref (node); }