Abolish EekThemeNodePrivate.

This commit is contained in:
Daiki Ueno
2011-03-08 05:17:20 +09:00
parent 828a59b298
commit 85a1a6ba24
2 changed files with 117 additions and 195 deletions

View File

@ -34,13 +34,9 @@
#include "eek-theme-node.h"
#include "eek-theme-private.h"
G_DEFINE_TYPE (EekThemeNode, eek_theme_node, G_TYPE_OBJECT);
struct _EekThemeNode {
GObject parent;
#define EEK_THEME_NODE_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_THEME_NODE, EekThemeNodePrivate))
struct _EekThemeNodePrivate
{
EekThemeNode *parent_node;
EekTheme *theme;
@ -73,6 +69,15 @@ struct _EekThemeNodePrivate
guint foreground_computed : 1;
};
struct _EekThemeNodeClass {
GObjectClass parent_class;
};
G_DEFINE_TYPE (EekThemeNode, eek_theme_node, G_TYPE_OBJECT);
#define EEK_THEME_NODE_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_THEME_NODE, EekThemeNodePrivate))
static void eek_theme_node_init (EekThemeNode *node);
static void eek_theme_node_class_init (EekThemeNodeClass *klass);
static void eek_theme_node_dispose (GObject *object);
@ -87,9 +92,6 @@ static const EekColor DEFAULT_ERROR_COLOR = { 0xcc, 0x00, 0x00, 0xff };
static void
eek_theme_node_init (EekThemeNode *self)
{
EekThemeNodePrivate *priv;
priv = self->priv = EEK_THEME_NODE_GET_PRIVATE(self);
}
static void
@ -97,9 +99,6 @@ eek_theme_node_class_init (EekThemeNodeClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
g_type_class_add_private (object_class,
sizeof (EekThemeNodePrivate));
object_class->dispose = eek_theme_node_dispose;
object_class->finalize = eek_theme_node_finalize;
}
@ -107,18 +106,18 @@ eek_theme_node_class_init (EekThemeNodeClass *klass)
static void
eek_theme_node_dispose (GObject *gobject)
{
EekThemeNodePrivate *priv = EEK_THEME_NODE_GET_PRIVATE (gobject);
EekThemeNode *node = EEK_THEME_NODE (gobject);
if (priv->theme)
if (node->theme)
{
g_object_unref (priv->theme);
priv->theme = NULL;
g_object_unref (node->theme);
node->theme = NULL;
}
if (priv->parent_node)
if (node->parent_node)
{
g_object_unref (priv->parent_node);
priv->parent_node = NULL;
g_object_unref (node->parent_node);
node->parent_node = NULL;
}
G_OBJECT_CLASS (eek_theme_node_parent_class)->dispose (gobject);
@ -127,24 +126,24 @@ eek_theme_node_dispose (GObject *gobject)
static void
eek_theme_node_finalize (GObject *object)
{
EekThemeNodePrivate *priv = EEK_THEME_NODE_GET_PRIVATE (object);
EekThemeNode *node = EEK_THEME_NODE (object);
g_free (priv->element_id);
g_free (priv->element_class);
g_free (priv->pseudo_class);
g_free (priv->inline_style);
g_free (node->element_id);
g_free (node->element_class);
g_free (node->pseudo_class);
g_free (node->inline_style);
if (priv->properties)
if (node->properties)
{
g_free (priv->properties);
priv->properties = NULL;
priv->n_properties = 0;
g_free (node->properties);
node->properties = NULL;
node->n_properties = 0;
}
if (priv->inline_properties)
if (node->inline_properties)
{
/* This destroys the list, not just the head of the list */
cr_declaration_destroy (priv->inline_properties);
cr_declaration_destroy (node->inline_properties);
}
G_OBJECT_CLASS (eek_theme_node_parent_class)->finalize (object);
@ -181,29 +180,27 @@ eek_theme_node_new (EekThemeNode *parent_node,
const char *inline_style)
{
EekThemeNode *node;
EekThemeNodePrivate *priv;
g_return_val_if_fail (parent_node == NULL || EEK_IS_THEME_NODE (parent_node), NULL);
node = g_object_new (EEK_TYPE_THEME_NODE, NULL);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
if (parent_node != NULL)
priv->parent_node = g_object_ref (parent_node);
node->parent_node = g_object_ref (parent_node);
else
priv->parent_node = NULL;
node->parent_node = NULL;
if (theme == NULL && parent_node != NULL)
theme = eek_theme_node_get_theme (parent_node);
if (theme != NULL)
priv->theme = g_object_ref (theme);
node->theme = g_object_ref (theme);
priv->element_type = element_type;
priv->element_id = g_strdup (element_id);
priv->element_class = g_strdup (element_class);
priv->pseudo_class = g_strdup (pseudo_class);
priv->inline_style = g_strdup (inline_style);
node->element_type = element_type;
node->element_id = g_strdup (element_id);
node->element_class = g_strdup (element_class);
node->pseudo_class = g_strdup (pseudo_class);
node->inline_style = g_strdup (inline_style);
return node;
}
@ -220,12 +217,9 @@ eek_theme_node_new (EekThemeNode *parent_node,
EekThemeNode *
eek_theme_node_get_parent (EekThemeNode *node)
{
EekThemeNodePrivate *priv;
g_return_val_if_fail (EEK_IS_THEME_NODE (node), NULL);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
return priv->parent_node;
return node->parent_node;
}
/**
@ -239,82 +233,65 @@ eek_theme_node_get_parent (EekThemeNode *node)
EekTheme *
eek_theme_node_get_theme (EekThemeNode *node)
{
EekThemeNodePrivate *priv;
g_return_val_if_fail (EEK_IS_THEME_NODE (node), NULL);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
return priv->theme;
return node->theme;
}
GType
eek_theme_node_get_element_type (EekThemeNode *node)
{
EekThemeNodePrivate *priv;
g_return_val_if_fail (EEK_IS_THEME_NODE (node), G_TYPE_NONE);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
return priv->element_type;
return node->element_type;
}
const char *
eek_theme_node_get_element_id (EekThemeNode *node)
{
EekThemeNodePrivate *priv;
g_return_val_if_fail (EEK_IS_THEME_NODE (node), NULL);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
return priv->element_id;
return node->element_id;
}
const char *
eek_theme_node_get_element_class (EekThemeNode *node)
{
EekThemeNodePrivate *priv;
g_return_val_if_fail (EEK_IS_THEME_NODE (node), NULL);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
return priv->element_class;
return node->element_class;
}
const char *
eek_theme_node_get_pseudo_class (EekThemeNode *node)
{
EekThemeNodePrivate *priv;
g_return_val_if_fail (EEK_IS_THEME_NODE (node), NULL);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
return priv->pseudo_class;
return node->pseudo_class;
}
static void
ensure_properties (EekThemeNode *node)
{
EekThemeNodePrivate *priv = EEK_THEME_NODE_GET_PRIVATE(node);
if (!priv->properties_computed)
if (!node->properties_computed)
{
GPtrArray *properties = NULL;
priv->properties_computed = TRUE;
node->properties_computed = TRUE;
if (priv->theme)
properties = _eek_theme_get_matched_properties (priv->theme, node);
if (node->theme)
properties = _eek_theme_get_matched_properties (node->theme, node);
if (priv->inline_style)
if (node->inline_style)
{
CRDeclaration *cur_decl;
if (!properties)
properties = g_ptr_array_new ();
priv->inline_properties =
_eek_theme_parse_declaration_list (priv->inline_style);
for (cur_decl = priv->inline_properties;
node->inline_properties =
_eek_theme_parse_declaration_list (node->inline_style);
for (cur_decl = node->inline_properties;
cur_decl;
cur_decl = cur_decl->next)
g_ptr_array_add (properties, cur_decl);
@ -322,8 +299,8 @@ ensure_properties (EekThemeNode *node)
if (properties)
{
priv->n_properties = properties->len;
priv->properties = (CRDeclaration **)g_ptr_array_free (properties,
node->n_properties = properties->len;
node->properties = (CRDeclaration **)g_ptr_array_free (properties,
FALSE);
}
}
@ -508,18 +485,15 @@ eek_theme_node_lookup_color (EekThemeNode *node,
gboolean inherit,
EekColor *color)
{
EekThemeNodePrivate *priv;
int i;
g_return_val_if_fail (EEK_IS_THEME_NODE(node), FALSE);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
ensure_properties (node);
for (i = priv->n_properties - 1; i >= 0; i--)
for (i = node->n_properties - 1; i >= 0; i--)
{
CRDeclaration *decl = priv->properties[i];
CRDeclaration *decl = node->properties[i];
if (strcmp (decl->property->stryng->str, property_name) == 0)
{
@ -530,16 +504,16 @@ eek_theme_node_lookup_color (EekThemeNode *node,
}
else if (result == VALUE_INHERIT)
{
if (priv->parent_node)
return eek_theme_node_lookup_color (priv->parent_node, property_name, inherit, color);
if (node->parent_node)
return eek_theme_node_lookup_color (node->parent_node, property_name, inherit, color);
else
break;
}
}
}
if (inherit && priv->parent_node)
return eek_theme_node_lookup_color (priv->parent_node, property_name, inherit, color);
if (inherit && node->parent_node)
return eek_theme_node_lookup_color (node->parent_node, property_name, inherit, color);
return FALSE;
}
@ -601,19 +575,16 @@ eek_theme_node_lookup_double (EekThemeNode *node,
gboolean inherit,
double *value)
{
EekThemeNodePrivate *priv;
gboolean result = FALSE;
int i;
g_return_val_if_fail (EEK_IS_THEME_NODE(node), FALSE);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
ensure_properties (node);
for (i = priv->n_properties - 1; i >= 0; i--)
for (i = node->n_properties - 1; i >= 0; i--)
{
CRDeclaration *decl = priv->properties[i];
CRDeclaration *decl = node->properties[i];
if (strcmp (decl->property->stryng->str, property_name) == 0)
{
@ -628,8 +599,8 @@ eek_theme_node_lookup_double (EekThemeNode *node,
}
}
if (!result && inherit && priv->parent_node)
result = eek_theme_node_lookup_double (priv->parent_node, property_name, inherit, value);
if (!result && inherit && node->parent_node)
result = eek_theme_node_lookup_double (node->parent_node, property_name, inherit, value);
return result;
}
@ -841,18 +812,15 @@ get_length_internal (EekThemeNode *node,
const char *suffixed,
gdouble *length)
{
EekThemeNodePrivate *priv;
int i;
g_return_val_if_fail (EEK_IS_THEME_NODE(node), FALSE);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
ensure_properties (node);
for (i = priv->n_properties - 1; i >= 0; i--)
for (i = node->n_properties - 1; i >= 0; i--)
{
CRDeclaration *decl = priv->properties[i];
CRDeclaration *decl = node->properties[i];
if (strcmp (decl->property->stryng->str, property_name) == 0 ||
(suffixed != NULL && strcmp (decl->property->stryng->str, suffixed) == 0))
@ -896,21 +864,18 @@ eek_theme_node_lookup_length (EekThemeNode *node,
gboolean inherit,
gdouble *length)
{
EekThemeNodePrivate *priv;
GetFromTermResult result;
g_return_val_if_fail (EEK_IS_THEME_NODE(node), FALSE);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
result = get_length_internal (node, property_name, NULL, length);
if (result == VALUE_FOUND)
return TRUE;
else if (result == VALUE_INHERIT)
inherit = TRUE;
if (inherit && priv->parent_node &&
eek_theme_node_lookup_length (priv->parent_node, property_name, inherit, length))
if (inherit && node->parent_node &&
eek_theme_node_lookup_length (node->parent_node, property_name, inherit, length))
return TRUE;
else
return FALSE;
@ -954,24 +919,21 @@ do_border_radius_term (EekThemeNode *node,
gboolean bottomright,
gboolean bottomleft)
{
EekThemeNodePrivate *priv;
int value;
g_return_if_fail (EEK_IS_THEME_NODE (node));
priv = EEK_THEME_NODE_GET_PRIVATE(node);
if (get_length_from_term_int (node, term, FALSE, &value) != VALUE_FOUND)
return;
if (topleft)
priv->border_radius[EEK_CORNER_TOPLEFT] = value;
node->border_radius[EEK_CORNER_TOPLEFT] = value;
if (topright)
priv->border_radius[EEK_CORNER_TOPRIGHT] = value;
node->border_radius[EEK_CORNER_TOPRIGHT] = value;
if (bottomright)
priv->border_radius[EEK_CORNER_BOTTOMRIGHT] = value;
node->border_radius[EEK_CORNER_BOTTOMRIGHT] = value;
if (bottomleft)
priv->border_radius[EEK_CORNER_BOTTOMLEFT] = value;
node->border_radius[EEK_CORNER_BOTTOMLEFT] = value;
}
static void
@ -1037,7 +999,6 @@ static void
do_border_property (EekThemeNode *node,
CRDeclaration *decl)
{
EekThemeNodePrivate *priv;
const char *property_name = decl->property->stryng->str + 6; /* Skip 'border' */
EekSide side = (EekSide)-1;
EekColor color;
@ -1048,8 +1009,6 @@ do_border_property (EekThemeNode *node,
g_return_if_fail (EEK_IS_THEME_NODE (node));
priv = EEK_THEME_NODE_GET_PRIVATE(node);
if (g_str_has_prefix (property_name, "-radius"))
{
do_border_radius (node, decl);
@ -1158,46 +1117,43 @@ do_border_property (EekThemeNode *node,
for (j = 0; j < 4; j++)
{
if (color_set)
priv->border_color[j] = color;
node->border_color[j] = color;
if (width_set)
priv->border_width[j] = width;
node->border_width[j] = width;
}
}
else
{
if (color_set)
priv->border_color[side] = color;
node->border_color[side] = color;
if (width_set)
priv->border_width[side] = width;
node->border_width[side] = width;
}
}
void
_eek_theme_node_ensure_geometry (EekThemeNode *node)
{
EekThemeNodePrivate *priv;
int i, j;
g_return_if_fail (EEK_IS_THEME_NODE (node));
priv = EEK_THEME_NODE_GET_PRIVATE(node);
if (priv->geometry_computed)
if (node->geometry_computed)
return;
priv->geometry_computed = TRUE;
node->geometry_computed = TRUE;
ensure_properties (node);
for (j = 0; j < 4; j++)
{
priv->border_width[j] = 0;
priv->border_color[j] = TRANSPARENT_COLOR;
node->border_width[j] = 0;
node->border_color[j] = TRANSPARENT_COLOR;
}
for (i = 0; i < priv->n_properties; i++)
for (i = 0; i < node->n_properties; i++)
{
CRDeclaration *decl = priv->properties[i];
CRDeclaration *decl = node->properties[i];
const char *property_name = decl->property->stryng->str;
if (g_str_has_prefix (property_name, "border"))
@ -1209,32 +1165,24 @@ int
eek_theme_node_get_border_width (EekThemeNode *node,
EekSide side)
{
EekThemeNodePrivate *priv;
g_return_val_if_fail (EEK_IS_THEME_NODE (node), 0.);
g_return_val_if_fail (side >= EEK_SIDE_TOP && side <= EEK_SIDE_LEFT, 0.);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
_eek_theme_node_ensure_geometry (node);
return priv->border_width[side];
return node->border_width[side];
}
int
eek_theme_node_get_border_radius (EekThemeNode *node,
EekCorner corner)
{
EekThemeNodePrivate *priv;
g_return_val_if_fail (EEK_IS_THEME_NODE (node), 0.);
g_return_val_if_fail (corner >= EEK_CORNER_TOPLEFT && corner <= EEK_CORNER_BOTTOMLEFT, 0.);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
_eek_theme_node_ensure_geometry (node);
return priv->border_radius[corner];
return node->border_radius[corner];
}
static GetFromTermResult
@ -1258,21 +1206,20 @@ get_background_color_from_term (EekThemeNode *node,
void
_eek_theme_node_ensure_background (EekThemeNode *node)
{
EekThemeNodePrivate *priv = EEK_THEME_NODE_GET_PRIVATE(node);
int i;
if (priv->background_computed)
if (node->background_computed)
return;
priv->background_computed = TRUE;
priv->background_color = TRANSPARENT_COLOR;
priv->background_gradient_type = EEK_GRADIENT_NONE;
node->background_computed = TRUE;
node->background_color = TRANSPARENT_COLOR;
node->background_gradient_type = EEK_GRADIENT_NONE;
ensure_properties (node);
for (i = 0; i < priv->n_properties; i++)
for (i = 0; i < node->n_properties; i++)
{
CRDeclaration *decl = priv->properties[i];
CRDeclaration *decl = node->properties[i];
const char *property_name = decl->property->stryng->str;
if (g_str_has_prefix (property_name, "background"))
@ -1290,25 +1237,25 @@ _eek_theme_node_ensure_background (EekThemeNode *node)
CRTerm *term;
/* background: property sets all terms to specified or default values */
priv->background_color = TRANSPARENT_COLOR;
node->background_color = TRANSPARENT_COLOR;
for (term = decl->value; term; term = term->next)
{
GetFromTermResult result = get_background_color_from_term (node, term, &priv->background_color);
GetFromTermResult result = get_background_color_from_term (node, term, &node->background_color);
if (result == VALUE_FOUND)
{
/* color stored in node->background_color */
}
else if (result == VALUE_INHERIT)
{
if (priv->parent_node)
if (node->parent_node)
{
eek_theme_node_get_background_color (priv->parent_node, &priv->background_color);
eek_theme_node_get_background_color (node->parent_node, &node->background_color);
}
}
else if (term_is_none (term))
{
/* leave priv->background_color as transparent */
/* leave node->background_color as transparent */
}
}
}
@ -1319,15 +1266,15 @@ _eek_theme_node_ensure_background (EekThemeNode *node)
if (decl->value == NULL || decl->value->next != NULL)
continue;
result = get_background_color_from_term (node, decl->value, &priv->background_color);
result = get_background_color_from_term (node, decl->value, &node->background_color);
if (result == VALUE_FOUND)
{
/* color stored in node->background_color */
}
else if (result == VALUE_INHERIT)
{
if (priv->parent_node)
eek_theme_node_get_background_color (priv->parent_node, &priv->background_color);
if (node->parent_node)
eek_theme_node_get_background_color (node->parent_node, &node->background_color);
}
}
else if (strcmp (property_name, "-gradient-direction") == 0)
@ -1335,19 +1282,19 @@ _eek_theme_node_ensure_background (EekThemeNode *node)
CRTerm *term = decl->value;
if (strcmp (term->content.str->stryng->str, "vertical") == 0)
{
priv->background_gradient_type = EEK_GRADIENT_VERTICAL;
node->background_gradient_type = EEK_GRADIENT_VERTICAL;
}
else if (strcmp (term->content.str->stryng->str, "horizontal") == 0)
{
priv->background_gradient_type = EEK_GRADIENT_HORIZONTAL;
node->background_gradient_type = EEK_GRADIENT_HORIZONTAL;
}
else if (strcmp (term->content.str->stryng->str, "radial") == 0)
{
priv->background_gradient_type = EEK_GRADIENT_RADIAL;
node->background_gradient_type = EEK_GRADIENT_RADIAL;
}
else if (strcmp (term->content.str->stryng->str, "none") == 0)
{
priv->background_gradient_type = EEK_GRADIENT_NONE;
node->background_gradient_type = EEK_GRADIENT_NONE;
}
else
{
@ -1357,11 +1304,11 @@ _eek_theme_node_ensure_background (EekThemeNode *node)
}
else if (strcmp (property_name, "-gradient-start") == 0)
{
get_color_from_term (node, decl->value, &priv->background_color);
get_color_from_term (node, decl->value, &node->background_color);
}
else if (strcmp (property_name, "-gradient-end") == 0)
{
get_color_from_term (node, decl->value, &priv->background_gradient_end);
get_color_from_term (node, decl->value, &node->background_gradient_end);
}
}
}
@ -1370,14 +1317,11 @@ void
eek_theme_node_get_background_color (EekThemeNode *node,
EekColor *color)
{
EekThemeNodePrivate *priv;
g_return_if_fail (EEK_IS_THEME_NODE (node));
_eek_theme_node_ensure_background (node);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
*color = priv->background_color;
*color = node->background_color;
}
void
@ -1385,43 +1329,35 @@ eek_theme_node_get_border_color (EekThemeNode *node,
EekSide side,
EekColor *color)
{
EekThemeNodePrivate *priv;
g_return_if_fail (EEK_IS_THEME_NODE (node));
g_return_if_fail (side >= EEK_SIDE_TOP && side <= EEK_SIDE_LEFT);
priv = EEK_THEME_NODE_GET_PRIVATE(node);
_eek_theme_node_ensure_geometry (node);
*color = priv->border_color[side];
*color = node->border_color[side];
}
void
eek_theme_node_get_foreground_color (EekThemeNode *node,
EekColor *color)
{
EekThemeNodePrivate *priv;
g_assert (EEK_IS_THEME_NODE (node));
priv = EEK_THEME_NODE_GET_PRIVATE(node);
if (!priv->foreground_computed)
if (!node->foreground_computed)
{
int i;
priv->foreground_computed = TRUE;
node->foreground_computed = TRUE;
ensure_properties (node);
for (i = priv->n_properties - 1; i >= 0; i--)
for (i = node->n_properties - 1; i >= 0; i--)
{
CRDeclaration *decl = priv->properties[i];
CRDeclaration *decl = node->properties[i];
if (strcmp (decl->property->stryng->str, "color") == 0)
{
GetFromTermResult result = get_color_from_term (node, decl->value, &priv->foreground_color);
GetFromTermResult result = get_color_from_term (node, decl->value, &node->foreground_color);
if (result == VALUE_FOUND)
goto out;
else if (result == VALUE_INHERIT)
@ -1429,14 +1365,14 @@ eek_theme_node_get_foreground_color (EekThemeNode *node,
}
}
if (priv->parent_node)
eek_theme_node_get_foreground_color (priv->parent_node, &priv->foreground_color);
if (node->parent_node)
eek_theme_node_get_foreground_color (node->parent_node, &node->foreground_color);
else
priv->foreground_color = BLACK_COLOR; /* default to black */
node->foreground_color = BLACK_COLOR; /* default to black */
}
out:
*color = priv->foreground_color;
*color = node->foreground_color;
}
void
@ -1445,18 +1381,14 @@ eek_theme_node_get_background_gradient (EekThemeNode *node,
EekColor *start,
EekColor *end)
{
EekThemeNodePrivate *priv;
g_assert (EEK_IS_THEME_NODE (node));
priv = EEK_THEME_NODE_GET_PRIVATE(node);
_eek_theme_node_ensure_background (node);
*type = priv->background_gradient_type;
*type = node->background_gradient_type;
if (*type != EEK_GRADIENT_NONE)
{
*start = priv->background_color;
*end = priv->background_gradient_end;
*start = node->background_color;
*end = node->background_gradient_end;
}
}

View File

@ -67,16 +67,6 @@ typedef enum {
typedef struct _EekThemeNodeClass EekThemeNodeClass;
typedef struct _EekThemeNodePrivate EekThemeNodePrivate;
struct _EekThemeNode {
GObject parent;
EekThemeNodePrivate *priv;
};
struct _EekThemeNodeClass {
GObjectClass parent_class;
};
GType eek_theme_node_get_type
(void) G_GNUC_CONST;