Beispiel #1
0
static GtkCssStyle *
lookup_in_global_parent_cache (GtkCssNode                  *node,
                               const GtkCssNodeDeclaration *decl)
{
  GtkCssNode *parent;

  parent = node->parent;

  if (parent == NULL ||
      !may_use_global_parent_cache (node))
    return NULL;

  if (parent->cache == NULL)
    return NULL;

  g_assert (node->cache == NULL);
  node->cache = gtk_css_node_style_cache_lookup (parent->cache,
                                                 (GtkCssNodeDeclaration *) decl,
                                                 gtk_css_node_is_first_child (node),
                                                 gtk_css_node_is_last_child (node));
  if (node->cache == NULL)
    return NULL;

  return gtk_css_node_style_cache_get_style (node->cache);
}
Beispiel #2
0
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);
    }
}
Beispiel #3
0
static GtkCssStyle *
lookup_in_global_parent_cache (GtkCssNode                  *node,
                               GtkCssStyle                 *parent,
                               const GtkCssNodeDeclaration *decl)
{
    GHashTable *cache;
    GtkCssStyle *style;

    if (parent == NULL ||
            !may_use_global_parent_cache (node))
        return NULL;

    cache = g_object_get_qdata (G_OBJECT (parent), quark_global_cache);
    if (cache == NULL)
        return NULL;

    style = g_hash_table_lookup (cache,
                                 PACK (decl,
                                       gtk_css_node_is_first_child (node),
                                       gtk_css_node_is_last_child (node)));

    return style;
}
Beispiel #4
0
static void
store_in_global_parent_cache (GtkCssNode                  *node,
                              const GtkCssNodeDeclaration *decl,
                              GtkCssStyle                 *style)
{
  GtkCssNode *parent;

  g_assert (GTK_IS_CSS_STATIC_STYLE (style));

  parent = node->parent;

  if (parent == NULL ||
      !may_use_global_parent_cache (node))
    return;

  if (parent->cache == NULL)
    parent->cache = gtk_css_node_style_cache_new (parent->style);

  node->cache = gtk_css_node_style_cache_insert (parent->cache,
                                                 (GtkCssNodeDeclaration *) decl,
                                                 gtk_css_node_is_first_child (node),
                                                 gtk_css_node_is_last_child (node),
                                                 style);
}
Beispiel #5
0
static void
store_in_global_parent_cache (GtkCssNode                  *node,
                              GtkCssStyle                 *parent,
                              const GtkCssNodeDeclaration *decl,
                              GtkCssStyle                 *style)
{
    GHashTable *cache;

    g_assert (GTK_IS_CSS_STATIC_STYLE (style));

    if (parent == NULL ||
            !may_use_global_parent_cache (node))
        return;

    if (!may_be_stored_in_parent_cache (style))
        return;

    cache = g_object_get_qdata (G_OBJECT (parent), quark_global_cache);
    if (cache == NULL)
    {
        cache = g_hash_table_new_full (gtk_global_parent_cache_hash,
                                       gtk_global_parent_cache_equal,
                                       gtk_global_parent_cache_free,
                                       g_object_unref);
        g_object_set_qdata_full (G_OBJECT (parent),
                                 quark_global_cache,
                                 cache,
                                 (GDestroyNotify) g_hash_table_destroy);
    }

    g_hash_table_insert (cache,
                         PACK (gtk_css_node_declaration_ref ((GtkCssNodeDeclaration *) decl),
                               gtk_css_node_is_first_child (node),
                               gtk_css_node_is_last_child (node)),
                         g_object_ref (style));
}