diff options
author | Benjamin Otte <otte@redhat.com> | 2011-06-13 03:45:18 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-06-13 15:01:52 +0200 |
commit | 3aa73bebea53dd8c3d644680a663fdd4f33935ff (patch) | |
tree | 6d53f57b1012632fddb6f44a2836f27c71a9034d /gtk/gtkstyleproperty.c | |
parent | 016e0c1a3e6b4b47bd95d777b155c30a6430dbd3 (diff) | |
download | gtk+-3aa73bebea53dd8c3d644680a663fdd4f33935ff.tar.gz |
styleproperty: Add border-*-color style properties
And make border-color a shorthand
Diffstat (limited to 'gtk/gtkstyleproperty.c')
-rw-r--r-- | gtk/gtkstyleproperty.c | 181 |
1 files changed, 178 insertions, 3 deletions
diff --git a/gtk/gtkstyleproperty.c b/gtk/gtkstyleproperty.c index 09d05c8542..27cc9b26e7 100644 --- a/gtk/gtkstyleproperty.c +++ b/gtk/gtkstyleproperty.c @@ -1510,6 +1510,81 @@ border_radius_value_print (const GValue *value, } } +static gboolean +border_color_value_parse (GtkCssParser *parser, + GFile *base, + GValue *value) +{ + if (_gtk_css_parser_try (parser, "transparent", TRUE)) + { + GdkRGBA transparent = { 0, 0, 0, 0 }; + + g_value_set_boxed (value, &transparent); + + return TRUE; + } + + return rgba_value_parse (parser, base, value); +} + +static gboolean +border_color_shorthand_value_parse (GtkCssParser *parser, + GFile *base, + GValue *value) +{ + GtkSymbolicColor *symbolic; + GPtrArray *array; + + array = g_ptr_array_new_with_free_func ((GDestroyNotify) gtk_symbolic_color_unref); + + do + { + if (_gtk_css_parser_try (parser, "transparent", TRUE)) + { + GdkRGBA transparent = { 0, 0, 0, 0 }; + + symbolic = gtk_symbolic_color_new_literal (&transparent); + } + else + { + symbolic = _gtk_css_parser_read_symbolic_color (parser); + + if (symbolic == NULL) + return FALSE; + } + + g_ptr_array_add (array, symbolic); + } + while (array->len < 4 && + !_gtk_css_parser_is_eof (parser) && + !_gtk_css_parser_begins_with (parser, ';') && + !_gtk_css_parser_begins_with (parser, '}')); + + switch (array->len) + { + default: + g_assert_not_reached (); + break; + case 1: + g_ptr_array_add (array, gtk_symbolic_color_ref (g_ptr_array_index (array, 0))); + /* fall through */ + case 2: + g_ptr_array_add (array, gtk_symbolic_color_ref (g_ptr_array_index (array, 0))); + /* fall through */ + case 3: + g_ptr_array_add (array, gtk_symbolic_color_ref (g_ptr_array_index (array, 1))); + /* fall through */ + case 4: + break; + } + + g_value_unset (value); + g_value_init (value, G_TYPE_PTR_ARRAY); + g_value_set_boxed (value, array); + + return TRUE; +} + /*** PACKING ***/ static GParameter * @@ -1679,6 +1754,62 @@ pack_border_radius (GValue *value, g_free (top_left); } +static GParameter * +unpack_border_color (const GValue *value, + guint *n_params) +{ + GParameter *parameter = g_new0 (GParameter, 4); + GType type; + + type = G_VALUE_TYPE (value); + if (type == G_TYPE_PTR_ARRAY) + type = GTK_TYPE_SYMBOLIC_COLOR; + + parameter[0].name = "border-top-color"; + g_value_init (¶meter[0].value, type); + parameter[1].name = "border-right-color"; + g_value_init (¶meter[1].value, type); + parameter[2].name = "border-bottom-color"; + g_value_init (¶meter[2].value, type); + parameter[3].name = "border-left-color"; + g_value_init (¶meter[3].value, type); + + if (G_VALUE_TYPE (value) == G_TYPE_PTR_ARRAY) + { + GPtrArray *array = g_value_get_boxed (value); + guint i; + + for (i = 0; i < 4; i++) + g_value_set_boxed (¶meter[i].value, g_ptr_array_index (array, i)); + } + else + { + /* can be RGBA or symbolic color */ + gpointer p = g_value_get_boxed (value); + + g_value_set_boxed (¶meter[0].value, p); + g_value_set_boxed (¶meter[1].value, p); + g_value_set_boxed (¶meter[2].value, p); + g_value_set_boxed (¶meter[3].value, p); + } + + *n_params = 4; + return parameter; +} + +static void +pack_border_color (GValue *value, + GtkStyleProperties *props, + GtkStateFlags state) +{ + /* NB: We are a color property, so we have to resolve to a color here. + * So we just resolve to a color. We pick one and stick to it. + * Lesson learned: Don't query border-color shorthand, query the + * real properties instead. */ + g_value_unset (value); + gtk_style_properties_get_property (props, "border-top-color", state, value); +} + /*** default values ***/ static void @@ -2286,17 +2417,61 @@ gtk_style_property_init (void) "Border style", GTK_TYPE_BORDER_STYLE, GTK_BORDER_STYLE_NONE, 0)); - _gtk_style_property_register (g_param_spec_boxed ("border-color", - "Border color", - "Border color", + _gtk_style_property_register (g_param_spec_boxed ("border-top-color", + "Border top color", + "Border top color", + GDK_TYPE_RGBA, 0), + 0, + NULL, + NULL, + NULL, + border_color_value_parse, + NULL, + border_color_default_value); + _gtk_style_property_register (g_param_spec_boxed ("border-right-color", + "Border right color", + "Border right color", + GDK_TYPE_RGBA, 0), + 0, + NULL, + NULL, + NULL, + border_color_value_parse, + NULL, + border_color_default_value); + _gtk_style_property_register (g_param_spec_boxed ("border-bottom-color", + "Border bottom color", + "Border bottom color", GDK_TYPE_RGBA, 0), 0, NULL, NULL, NULL, + border_color_value_parse, + NULL, + border_color_default_value); + _gtk_style_property_register (g_param_spec_boxed ("border-left-color", + "Border left color", + "Border left color", + GDK_TYPE_RGBA, 0), + 0, + NULL, NULL, NULL, + border_color_value_parse, + NULL, border_color_default_value); + _gtk_style_property_register (g_param_spec_boxed ("border-color", + "Border color", + "Border color", + GDK_TYPE_RGBA, 0), + 0, + NULL, + unpack_border_color, + pack_border_color, + border_color_shorthand_value_parse, + NULL, + NULL); gtk_style_properties_register_property (NULL, g_param_spec_boxed ("background-image", |