css: add support for text-decoration-line
This commit is contained in:
@ -553,6 +553,52 @@ _gtk_css_font_stretch_value_get (const GtkCssValue *value)
|
|||||||
return value->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 */
|
/* GtkCssArea */
|
||||||
|
|
||||||
static const GtkCssValueClass GTK_CSS_VALUE_AREA = {
|
static const GtkCssValueClass GTK_CSS_VALUE_AREA = {
|
||||||
|
|||||||
@ -52,6 +52,10 @@ GtkCssValue * _gtk_css_font_stretch_value_new (PangoStretch stretc
|
|||||||
GtkCssValue * _gtk_css_font_stretch_value_try_parse (GtkCssParser *parser);
|
GtkCssValue * _gtk_css_font_stretch_value_try_parse (GtkCssParser *parser);
|
||||||
PangoStretch _gtk_css_font_stretch_value_get (const GtkCssValue *value);
|
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_new (GtkCssArea area);
|
||||||
GtkCssValue * _gtk_css_area_value_try_parse (GtkCssParser *parser);
|
GtkCssValue * _gtk_css_area_value_try_parse (GtkCssParser *parser);
|
||||||
GtkCssArea _gtk_css_area_value_get (const GtkCssValue *value);
|
GtkCssArea _gtk_css_area_value_get (const GtkCssValue *value);
|
||||||
|
|||||||
@ -617,6 +617,18 @@ parse_letter_spacing (GtkCssStyleProperty *property,
|
|||||||
return _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH);
|
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 *
|
static GtkCssValue *
|
||||||
box_shadow_value_parse (GtkCssStyleProperty *property,
|
box_shadow_value_parse (GtkCssStyleProperty *property,
|
||||||
GtkCssParser *parser)
|
GtkCssParser *parser)
|
||||||
@ -1082,6 +1094,16 @@ _gtk_css_style_property_init_properties (void)
|
|||||||
NULL,
|
NULL,
|
||||||
_gtk_css_number_value_new (0.0, GTK_CSS_PX));
|
_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_style_property_register ("text-shadow",
|
||||||
GTK_CSS_PROPERTY_TEXT_SHADOW,
|
GTK_CSS_PROPERTY_TEXT_SHADOW,
|
||||||
G_TYPE_NONE,
|
G_TYPE_NONE,
|
||||||
|
|||||||
@ -119,6 +119,7 @@ enum { /*< skip >*/
|
|||||||
GTK_CSS_PROPERTY_FONT_WEIGHT,
|
GTK_CSS_PROPERTY_FONT_WEIGHT,
|
||||||
GTK_CSS_PROPERTY_FONT_STRETCH,
|
GTK_CSS_PROPERTY_FONT_STRETCH,
|
||||||
GTK_CSS_PROPERTY_LETTER_SPACING,
|
GTK_CSS_PROPERTY_LETTER_SPACING,
|
||||||
|
GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
|
||||||
GTK_CSS_PROPERTY_TEXT_SHADOW,
|
GTK_CSS_PROPERTY_TEXT_SHADOW,
|
||||||
GTK_CSS_PROPERTY_BOX_SHADOW,
|
GTK_CSS_PROPERTY_BOX_SHADOW,
|
||||||
GTK_CSS_PROPERTY_MARGIN_TOP,
|
GTK_CSS_PROPERTY_MARGIN_TOP,
|
||||||
@ -238,6 +239,12 @@ typedef enum /*< skip >*/ {
|
|||||||
GTK_CSS_FONT_SIZE_XX_LARGE
|
GTK_CSS_FONT_SIZE_XX_LARGE
|
||||||
} GtkCssFontSize;
|
} 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 */
|
/* for the order in arrays */
|
||||||
typedef enum /*< skip >*/ {
|
typedef enum /*< skip >*/ {
|
||||||
GTK_CSS_TOP,
|
GTK_CSS_TOP,
|
||||||
|
|||||||
@ -3148,21 +3148,45 @@ _gtk_style_context_get_icon_extents (GtkStyleContext *context,
|
|||||||
extents->height += border.top + border.bottom;
|
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 *
|
PangoAttrList *
|
||||||
_gtk_style_context_get_pango_attributes (GtkStyleContext *context)
|
_gtk_style_context_get_pango_attributes (GtkStyleContext *context)
|
||||||
{
|
{
|
||||||
gint letter_spacing;
|
|
||||||
PangoAttrList *attrs = NULL;
|
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);
|
letter_spacing = _gtk_css_number_value_get (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_LETTER_SPACING), 100);
|
||||||
if (letter_spacing != 0)
|
if (letter_spacing != 0)
|
||||||
{
|
{
|
||||||
PangoAttribute *letter_spacing_attr;
|
attrs = add_pango_attr (attrs, pango_attr_letter_spacing_new (letter_spacing * PANGO_SCALE));
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return attrs;
|
return attrs;
|
||||||
|
|||||||
Reference in New Issue
Block a user