From: Paolo Borelli Date: Sun, 5 Jul 2015 16:59:27 +0000 (+0200) Subject: css: add support for text-decoration-line X-Git-Tag: archive/raspbian/4.4.1+ds1-2+rpi1^2~18^2~24^2~9137 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=384df61c90a25e813fa3441f35b572e890175080;p=gtk4.git css: add support for text-decoration-line --- diff --git a/gtk/gtkcssenumvalue.c b/gtk/gtkcssenumvalue.c index add4af3d19..15d9b4af10 100644 --- a/gtk/gtkcssenumvalue.c +++ b/gtk/gtkcssenumvalue.c @@ -553,6 +553,52 @@ _gtk_css_font_stretch_value_get (const GtkCssValue *value) return value->value; } +/* GtkTextDecorationLine */ + +static const GtkCssValueClass GTK_CSS_VALUE_TEXT_DECORATION_LINE = { + gtk_css_value_enum_free, + gtk_css_value_enum_compute, + gtk_css_value_enum_equal, + gtk_css_value_enum_transition, + gtk_css_value_enum_print +}; + +static GtkCssValue text_decoration_line_values[] = { + { >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_NONE, "none" }, + { >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE, "underline" }, + { >K_CSS_VALUE_TEXT_DECORATION_LINE, 1, GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH, "line-through" }, +}; + +GtkCssValue * +_gtk_css_text_decoration_line_value_new (GtkTextDecorationLine line) +{ + g_return_val_if_fail (line < G_N_ELEMENTS (text_decoration_line_values), NULL); + + return _gtk_css_value_ref (&text_decoration_line_values[line]); +} + +GtkCssValue *_gtk_css_text_decoration_line_value_try_parse (GtkCssParser *parser) +{ + guint i; + + g_return_val_if_fail (parser != NULL, NULL); + + for (i = 0; i < G_N_ELEMENTS (text_decoration_line_values); i++) + { + if (_gtk_css_parser_try (parser, text_decoration_line_values[i].name, TRUE)) + return _gtk_css_value_ref (&text_decoration_line_values[i]); + } + + return NULL; +} + +GtkTextDecorationLine _gtk_css_text_decoration_line_value_get (const GtkCssValue *value) +{ + g_return_val_if_fail (value->class == >K_CSS_VALUE_TEXT_DECORATION_LINE, GTK_CSS_TEXT_DECORATION_LINE_NONE); + + return value->value; +} + /* GtkCssArea */ static const GtkCssValueClass GTK_CSS_VALUE_AREA = { diff --git a/gtk/gtkcssenumvalueprivate.h b/gtk/gtkcssenumvalueprivate.h index ad09adbb97..008b548adc 100644 --- a/gtk/gtkcssenumvalueprivate.h +++ b/gtk/gtkcssenumvalueprivate.h @@ -52,6 +52,10 @@ GtkCssValue * _gtk_css_font_stretch_value_new (PangoStretch stretc GtkCssValue * _gtk_css_font_stretch_value_try_parse (GtkCssParser *parser); PangoStretch _gtk_css_font_stretch_value_get (const GtkCssValue *value); +GtkCssValue * _gtk_css_text_decoration_line_value_new (GtkTextDecorationLine line); +GtkCssValue * _gtk_css_text_decoration_line_value_try_parse (GtkCssParser *parser); +GtkTextDecorationLine _gtk_css_text_decoration_line_value_get (const GtkCssValue *value); + GtkCssValue * _gtk_css_area_value_new (GtkCssArea area); GtkCssValue * _gtk_css_area_value_try_parse (GtkCssParser *parser); GtkCssArea _gtk_css_area_value_get (const GtkCssValue *value); diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index 3971b94eb5..8eecc36110 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -617,6 +617,18 @@ parse_letter_spacing (GtkCssStyleProperty *property, return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH); } +static GtkCssValue * +parse_text_decoration_line (GtkCssStyleProperty *property, + GtkCssParser *parser) +{ + GtkCssValue *value = _gtk_css_text_decoration_line_value_try_parse (parser); + + if (value == NULL) + _gtk_css_parser_error (parser, "unknown value for property"); + + return value; +} + static GtkCssValue * box_shadow_value_parse (GtkCssStyleProperty *property, GtkCssParser *parser) @@ -1082,6 +1094,16 @@ _gtk_css_style_property_init_properties (void) NULL, _gtk_css_number_value_new (0.0, GTK_CSS_PX)); + gtk_css_style_property_register ("text-decoration-line", + GTK_CSS_PROPERTY_TEXT_DECORATION_LINE, + G_TYPE_NONE, + 0, + GTK_CSS_AFFECTS_TEXT | GTK_CSS_AFFECTS_TEXT_ATTRS, + parse_text_decoration_line, + NULL, + NULL, + _gtk_css_text_decoration_line_value_new (GTK_CSS_TEXT_DECORATION_LINE_NONE)); + gtk_css_style_property_register ("text-shadow", GTK_CSS_PROPERTY_TEXT_SHADOW, G_TYPE_NONE, diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h index 76cae9731c..cac528efd1 100644 --- a/gtk/gtkcsstypesprivate.h +++ b/gtk/gtkcsstypesprivate.h @@ -119,6 +119,7 @@ enum { /*< skip >*/ GTK_CSS_PROPERTY_FONT_WEIGHT, GTK_CSS_PROPERTY_FONT_STRETCH, GTK_CSS_PROPERTY_LETTER_SPACING, + GTK_CSS_PROPERTY_TEXT_DECORATION_LINE, GTK_CSS_PROPERTY_TEXT_SHADOW, GTK_CSS_PROPERTY_BOX_SHADOW, GTK_CSS_PROPERTY_MARGIN_TOP, @@ -238,6 +239,12 @@ typedef enum /*< skip >*/ { GTK_CSS_FONT_SIZE_XX_LARGE } GtkCssFontSize; +typedef enum /*< skip >*/ { + GTK_CSS_TEXT_DECORATION_LINE_NONE, + GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE, + GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH +} GtkTextDecorationLine; + /* for the order in arrays */ typedef enum /*< skip >*/ { GTK_CSS_TOP, diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c index c34edd1013..51c4a1c8aa 100644 --- a/gtk/gtkstylecontext.c +++ b/gtk/gtkstylecontext.c @@ -3148,21 +3148,45 @@ _gtk_style_context_get_icon_extents (GtkStyleContext *context, extents->height += border.top + border.bottom; } +static PangoAttrList * +add_pango_attr(PangoAttrList *attrs, PangoAttribute *attr) +{ + if (attrs == NULL) + attrs = pango_attr_list_new (); + + pango_attr_list_insert (attrs, attr); + + return attrs; +} + PangoAttrList * _gtk_style_context_get_pango_attributes (GtkStyleContext *context) { - gint letter_spacing; PangoAttrList *attrs = NULL; + GtkTextDecorationLine decoration_line; + gint letter_spacing; + /* text-decoration */ + decoration_line = _gtk_css_text_decoration_line_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_DECORATION_LINE)); + + switch (decoration_line) + { + case GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE: + attrs = add_pango_attr (attrs, pango_attr_underline_new (PANGO_UNDERLINE_SINGLE)); + break; + case GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH: + attrs = add_pango_attr (attrs, pango_attr_strikethrough_new (TRUE)); + break; + case GTK_CSS_TEXT_DECORATION_LINE_NONE: + default: + break; + } + + /* letter-spacing */ letter_spacing = _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_LETTER_SPACING), 100); if (letter_spacing != 0) { - PangoAttribute *letter_spacing_attr; - - letter_spacing_attr = pango_attr_letter_spacing_new (letter_spacing * PANGO_SCALE); - - attrs = pango_attr_list_new (); - pango_attr_list_insert (attrs, letter_spacing_attr); + attrs = add_pango_attr (attrs, pango_attr_letter_spacing_new (letter_spacing * PANGO_SCALE)); } return attrs;