[gtk+/wip/pbor/css-text-attributes: 4/7] css: add support for text-decoration-line
- From: Paolo Borelli <pborelli src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/pbor/css-text-attributes: 4/7] css: add support for text-decoration-line
- Date: Sun, 5 Jul 2015 21:27:00 +0000 (UTC)
commit e654dc30d6377a0673c8171e954c996c138dc509
Author: Paolo Borelli <pborelli gnome org>
Date: Sun Jul 5 18:59:27 2015 +0200
css: add support for text-decoration-line
gtk/gtkcssenumvalue.c | 46 +++++++++++++++++++++++++++++++++++++++++
gtk/gtkcssenumvalueprivate.h | 4 +++
gtk/gtkcssstylepropertyimpl.c | 22 +++++++++++++++++++
gtk/gtkcsstypesprivate.h | 7 ++++++
gtk/gtkstylecontext.c | 38 +++++++++++++++++++++++++++------
5 files changed, 110 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkcssenumvalue.c b/gtk/gtkcssenumvalue.c
index add4af3..15d9b4a 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 ad09adb..008b548 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 511165f..ff32f20 100644
--- a/gtk/gtkcssstylepropertyimpl.c
+++ b/gtk/gtkcssstylepropertyimpl.c
@@ -620,6 +620,18 @@ parse_letter_spacing (GtkCssStyleProperty *property,
}
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)
{
@@ -1084,6 +1096,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,
+ GTK_STYLE_PROPERTY_ANIMATED,
+ 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 76cae97..cac528e 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 c34edd1..51c4a1c 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;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]