Save a generic boxes source in GtkImageBorder

We used to special handle gradient, but we want to be able to store
other sources (that will eventually resolve to cairo patterns).
For instance, this is needed to handle win32 theme part sources.
This commit is contained in:
Alexander Larsson 2011-11-15 16:26:46 +01:00
parent 361fcabbde
commit e953465e33
3 changed files with 28 additions and 21 deletions

View File

@ -54,7 +54,8 @@ enum {
struct _GtkBorderImage { struct _GtkBorderImage {
cairo_pattern_t *source; cairo_pattern_t *source;
GtkGradient *source_gradient; gpointer source_boxed;
GType boxed_type;
GtkBorder slice; GtkBorder slice;
GtkBorder *width; GtkBorder *width;
@ -90,18 +91,21 @@ _gtk_border_image_new (cairo_pattern_t *pattern,
} }
GtkBorderImage * GtkBorderImage *
_gtk_border_image_new_for_gradient (GtkGradient *gradient, _gtk_border_image_new_for_boxed (GType boxed_type,
GtkBorder *slice, gpointer boxed,
GtkBorder *width, GtkBorder *slice,
GtkCssBorderImageRepeat *repeat) GtkBorder *width,
GtkCssBorderImageRepeat *repeat)
{ {
GtkBorderImage *image; GtkBorderImage *image;
image = g_slice_new0 (GtkBorderImage); image = g_slice_new0 (GtkBorderImage);
image->ref_count = 1; image->ref_count = 1;
if (gradient != NULL) if (boxed != NULL)
image->source_gradient = gtk_gradient_ref (gradient); image->source_boxed = g_boxed_copy (boxed_type, boxed);
image->boxed_type = boxed_type;
if (slice != NULL) if (slice != NULL)
image->slice = *slice; image->slice = *slice;
@ -137,8 +141,8 @@ _gtk_border_image_unref (GtkBorderImage *image)
if (image->source != NULL) if (image->source != NULL)
cairo_pattern_destroy (image->source); cairo_pattern_destroy (image->source);
if (image->source_gradient != NULL) if (image->source_boxed != NULL)
gtk_gradient_unref (image->source_gradient); g_boxed_free (image->boxed_type, image->source_boxed);
if (image->width != NULL) if (image->width != NULL)
gtk_border_free (image->width); gtk_border_free (image->width);
@ -157,8 +161,8 @@ _gtk_border_image_unpack (const GValue *value,
parameter[0].name = "border-image-source"; parameter[0].name = "border-image-source";
if ((image != NULL) && if ((image != NULL) &&
(image->source_gradient != NULL)) (image->source_boxed != NULL))
g_value_init (&parameter[0].value, GTK_TYPE_GRADIENT); g_value_init (&parameter[0].value, image->boxed_type);
else else
g_value_init (&parameter[0].value, CAIRO_GOBJECT_TYPE_PATTERN); g_value_init (&parameter[0].value, CAIRO_GOBJECT_TYPE_PATTERN);
@ -173,8 +177,8 @@ _gtk_border_image_unpack (const GValue *value,
if (image != NULL) if (image != NULL)
{ {
if (image->source_gradient != NULL) if (image->source_boxed != NULL)
g_value_set_boxed (&parameter[0].value, image->source_gradient); g_value_set_boxed (&parameter[0].value, image->source_boxed);
else else
g_value_set_boxed (&parameter[0].value, image->source); g_value_set_boxed (&parameter[0].value, image->source);

View File

@ -42,7 +42,8 @@ GtkBorderImage * _gtk_border_image_new (cairo_pattern_t *sour
GtkBorder *slice, GtkBorder *slice,
GtkBorder *width, GtkBorder *width,
GtkCssBorderImageRepeat *repeat); GtkCssBorderImageRepeat *repeat);
GtkBorderImage * _gtk_border_image_new_for_gradient (GtkGradient *gradient, GtkBorderImage * _gtk_border_image_new_for_boxed (GType boxed_type,
gpointer boxed,
GtkBorder *slice, GtkBorder *slice,
GtkBorder *width, GtkBorder *width,
GtkCssBorderImageRepeat *repeat); GtkCssBorderImageRepeat *repeat);

View File

@ -1250,7 +1250,8 @@ border_image_value_parse (GtkCssParser *parser,
{ {
GValue temp = G_VALUE_INIT; GValue temp = G_VALUE_INIT;
cairo_pattern_t *pattern = NULL; cairo_pattern_t *pattern = NULL;
GtkGradient *gradient = NULL; gconstpointer *boxed = NULL;
GType boxed_type;
GtkBorder slice, *width = NULL, *parsed_slice; GtkBorder slice, *width = NULL, *parsed_slice;
GtkCssBorderImageRepeat repeat, *parsed_repeat; GtkCssBorderImageRepeat repeat, *parsed_repeat;
gboolean retval = FALSE; gboolean retval = FALSE;
@ -1261,8 +1262,9 @@ border_image_value_parse (GtkCssParser *parser,
if (!pattern_value_parse (parser, base, &temp)) if (!pattern_value_parse (parser, base, &temp))
return FALSE; return FALSE;
if (G_VALUE_TYPE (&temp) == GTK_TYPE_GRADIENT) boxed_type = G_VALUE_TYPE (&temp);
gradient = g_value_dup_boxed (&temp); if (boxed_type != CAIRO_GOBJECT_TYPE_PATTERN)
boxed = g_value_dup_boxed (&temp);
else else
pattern = g_value_dup_boxed (&temp); pattern = g_value_dup_boxed (&temp);
@ -1297,8 +1299,8 @@ border_image_value_parse (GtkCssParser *parser,
g_value_unset (&temp); g_value_unset (&temp);
if (gradient != NULL) if (boxed != NULL)
image = _gtk_border_image_new_for_gradient (gradient, &slice, width, &repeat); image = _gtk_border_image_new_for_boxed (boxed_type, boxed, &slice, width, &repeat);
else if (pattern != NULL) else if (pattern != NULL)
image = _gtk_border_image_new (pattern, &slice, width, &repeat); image = _gtk_border_image_new (pattern, &slice, width, &repeat);
@ -1312,8 +1314,8 @@ border_image_value_parse (GtkCssParser *parser,
if (pattern != NULL) if (pattern != NULL)
cairo_pattern_destroy (pattern); cairo_pattern_destroy (pattern);
if (gradient != NULL) if (boxed != NULL)
gtk_gradient_unref (gradient); g_boxed_free (boxed_type, boxed);
if (width != NULL) if (width != NULL)
gtk_border_free (width); gtk_border_free (width);