[gtk+/win32-theme2: 1/18] Save a generic boxes source in GtkImageBorder
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/win32-theme2: 1/18] Save a generic boxes source in GtkImageBorder
- Date: Fri, 18 Nov 2011 15:57:33 +0000 (UTC)
commit e953465e33b4ba9b7c72b6dc3be4fe5db69efe7f
Author: Alexander Larsson <alexl redhat com>
Date: Tue Nov 15 16:26:46 2011 +0100
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.
gtk/gtkborderimage.c | 30 +++++++++++++++++-------------
gtk/gtkborderimageprivate.h | 3 ++-
gtk/gtkstyleproperty.c | 16 +++++++++-------
3 files changed, 28 insertions(+), 21 deletions(-)
---
diff --git a/gtk/gtkborderimage.c b/gtk/gtkborderimage.c
index 2fbe850..dd82591 100644
--- a/gtk/gtkborderimage.c
+++ b/gtk/gtkborderimage.c
@@ -54,7 +54,8 @@ enum {
struct _GtkBorderImage {
cairo_pattern_t *source;
- GtkGradient *source_gradient;
+ gpointer source_boxed;
+ GType boxed_type;
GtkBorder slice;
GtkBorder *width;
@@ -90,18 +91,21 @@ _gtk_border_image_new (cairo_pattern_t *pattern,
}
GtkBorderImage *
-_gtk_border_image_new_for_gradient (GtkGradient *gradient,
- GtkBorder *slice,
- GtkBorder *width,
- GtkCssBorderImageRepeat *repeat)
+_gtk_border_image_new_for_boxed (GType boxed_type,
+ gpointer boxed,
+ GtkBorder *slice,
+ GtkBorder *width,
+ GtkCssBorderImageRepeat *repeat)
{
GtkBorderImage *image;
image = g_slice_new0 (GtkBorderImage);
+
image->ref_count = 1;
- if (gradient != NULL)
- image->source_gradient = gtk_gradient_ref (gradient);
+ if (boxed != NULL)
+ image->source_boxed = g_boxed_copy (boxed_type, boxed);
+ image->boxed_type = boxed_type;
if (slice != NULL)
image->slice = *slice;
@@ -137,8 +141,8 @@ _gtk_border_image_unref (GtkBorderImage *image)
if (image->source != NULL)
cairo_pattern_destroy (image->source);
- if (image->source_gradient != NULL)
- gtk_gradient_unref (image->source_gradient);
+ if (image->source_boxed != NULL)
+ g_boxed_free (image->boxed_type, image->source_boxed);
if (image->width != NULL)
gtk_border_free (image->width);
@@ -157,8 +161,8 @@ _gtk_border_image_unpack (const GValue *value,
parameter[0].name = "border-image-source";
if ((image != NULL) &&
- (image->source_gradient != NULL))
- g_value_init (¶meter[0].value, GTK_TYPE_GRADIENT);
+ (image->source_boxed != NULL))
+ g_value_init (¶meter[0].value, image->boxed_type);
else
g_value_init (¶meter[0].value, CAIRO_GOBJECT_TYPE_PATTERN);
@@ -173,8 +177,8 @@ _gtk_border_image_unpack (const GValue *value,
if (image != NULL)
{
- if (image->source_gradient != NULL)
- g_value_set_boxed (¶meter[0].value, image->source_gradient);
+ if (image->source_boxed != NULL)
+ g_value_set_boxed (¶meter[0].value, image->source_boxed);
else
g_value_set_boxed (¶meter[0].value, image->source);
diff --git a/gtk/gtkborderimageprivate.h b/gtk/gtkborderimageprivate.h
index 585be67..563ce29 100644
--- a/gtk/gtkborderimageprivate.h
+++ b/gtk/gtkborderimageprivate.h
@@ -42,7 +42,8 @@ GtkBorderImage * _gtk_border_image_new (cairo_pattern_t *sour
GtkBorder *slice,
GtkBorder *width,
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 *width,
GtkCssBorderImageRepeat *repeat);
diff --git a/gtk/gtkstyleproperty.c b/gtk/gtkstyleproperty.c
index 8913d92..99b804f 100644
--- a/gtk/gtkstyleproperty.c
+++ b/gtk/gtkstyleproperty.c
@@ -1250,7 +1250,8 @@ border_image_value_parse (GtkCssParser *parser,
{
GValue temp = G_VALUE_INIT;
cairo_pattern_t *pattern = NULL;
- GtkGradient *gradient = NULL;
+ gconstpointer *boxed = NULL;
+ GType boxed_type;
GtkBorder slice, *width = NULL, *parsed_slice;
GtkCssBorderImageRepeat repeat, *parsed_repeat;
gboolean retval = FALSE;
@@ -1261,8 +1262,9 @@ border_image_value_parse (GtkCssParser *parser,
if (!pattern_value_parse (parser, base, &temp))
return FALSE;
- if (G_VALUE_TYPE (&temp) == GTK_TYPE_GRADIENT)
- gradient = g_value_dup_boxed (&temp);
+ boxed_type = G_VALUE_TYPE (&temp);
+ if (boxed_type != CAIRO_GOBJECT_TYPE_PATTERN)
+ boxed = g_value_dup_boxed (&temp);
else
pattern = g_value_dup_boxed (&temp);
@@ -1297,8 +1299,8 @@ border_image_value_parse (GtkCssParser *parser,
g_value_unset (&temp);
- if (gradient != NULL)
- image = _gtk_border_image_new_for_gradient (gradient, &slice, width, &repeat);
+ if (boxed != NULL)
+ image = _gtk_border_image_new_for_boxed (boxed_type, boxed, &slice, width, &repeat);
else if (pattern != NULL)
image = _gtk_border_image_new (pattern, &slice, width, &repeat);
@@ -1312,8 +1314,8 @@ border_image_value_parse (GtkCssParser *parser,
if (pattern != NULL)
cairo_pattern_destroy (pattern);
- if (gradient != NULL)
- gtk_gradient_unref (gradient);
+ if (boxed != NULL)
+ g_boxed_free (boxed_type, boxed);
if (width != NULL)
gtk_border_free (width);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]