1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 2011 Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
20 #include "gtkcssenumvalueprivate.h"
22 #include "gtkstylepropertyprivate.h"
33 gtk_css_value_enum_free (GtkCssValue *value)
35 g_slice_free (GtkCssValue, value);
39 gtk_css_value_enum_equal (const GtkCssValue *enum1,
40 const GtkCssValue *enum2)
42 return enum1 == enum2;
46 gtk_css_value_enum_print (const GtkCssValue *value,
49 g_string_append (string, value->name);
54 static const GtkCssValueClass GTK_CSS_VALUE_BORDER_STYLE = {
55 gtk_css_value_enum_free,
56 gtk_css_value_enum_equal,
57 gtk_css_value_enum_print
60 static GtkCssValue border_style_values[] = {
61 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_NONE, "none" },
62 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_SOLID, "solid" },
63 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_INSET, "inset" },
64 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_OUTSET, "outset" },
65 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_HIDDEN, "hidden" },
66 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOTTED, "dotted" },
67 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DASHED, "dashed" },
68 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOUBLE, "double" },
69 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_GROOVE, "groove" },
70 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_RIDGE, "ridge" }
74 _gtk_css_border_style_value_new (GtkBorderStyle border_style)
76 g_return_val_if_fail (border_style < G_N_ELEMENTS (border_style_values), NULL);
78 return _gtk_css_value_ref (&border_style_values[border_style]);
82 _gtk_css_border_style_value_try_parse (GtkCssParser *parser)
86 g_return_val_if_fail (parser != NULL, NULL);
88 for (i = 0; i < G_N_ELEMENTS (border_style_values); i++)
90 if (_gtk_css_parser_try (parser, border_style_values[i].name, TRUE))
91 return _gtk_css_value_ref (&border_style_values[i]);
98 _gtk_css_border_style_value_get (const GtkCssValue *value)
100 g_return_val_if_fail (value->class == >K_CSS_VALUE_BORDER_STYLE, GTK_BORDER_STYLE_NONE);
107 static const GtkCssValueClass GTK_CSS_VALUE_FONT_STYLE = {
108 gtk_css_value_enum_free,
109 gtk_css_value_enum_equal,
110 gtk_css_value_enum_print
113 static GtkCssValue font_style_values[] = {
114 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_NORMAL, "normal" },
115 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_OBLIQUE, "oblique" },
116 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_ITALIC, "italic" }
120 _gtk_css_font_style_value_new (PangoStyle font_style)
122 g_return_val_if_fail (font_style < G_N_ELEMENTS (font_style_values), NULL);
124 return _gtk_css_value_ref (&font_style_values[font_style]);
128 _gtk_css_font_style_value_try_parse (GtkCssParser *parser)
132 g_return_val_if_fail (parser != NULL, NULL);
134 for (i = 0; i < G_N_ELEMENTS (font_style_values); i++)
136 if (_gtk_css_parser_try (parser, font_style_values[i].name, TRUE))
137 return _gtk_css_value_ref (&font_style_values[i]);
144 _gtk_css_font_style_value_get (const GtkCssValue *value)
146 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_STYLE, PANGO_STYLE_NORMAL);
153 static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT = {
154 gtk_css_value_enum_free,
155 gtk_css_value_enum_equal,
156 gtk_css_value_enum_print
159 static GtkCssValue font_variant_values[] = {
160 { >K_CSS_VALUE_FONT_VARIANT, 1, PANGO_VARIANT_NORMAL, "normal" },
161 { >K_CSS_VALUE_FONT_VARIANT, 1, PANGO_VARIANT_SMALL_CAPS, "small-caps" }
165 _gtk_css_font_variant_value_new (PangoVariant font_variant)
167 g_return_val_if_fail (font_variant < G_N_ELEMENTS (font_variant_values), NULL);
169 return _gtk_css_value_ref (&font_variant_values[font_variant]);
173 _gtk_css_font_variant_value_try_parse (GtkCssParser *parser)
177 g_return_val_if_fail (parser != NULL, NULL);
179 for (i = 0; i < G_N_ELEMENTS (font_variant_values); i++)
181 if (_gtk_css_parser_try (parser, font_variant_values[i].name, TRUE))
182 return _gtk_css_value_ref (&font_variant_values[i]);
189 _gtk_css_font_variant_value_get (const GtkCssValue *value)
191 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_VARIANT, PANGO_VARIANT_NORMAL);
198 static const GtkCssValueClass GTK_CSS_VALUE_FONT_WEIGHT = {
199 gtk_css_value_enum_free,
200 gtk_css_value_enum_equal,
201 gtk_css_value_enum_print
204 static GtkCssValue font_weight_values[] = {
205 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_THIN, "100" },
206 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRALIGHT, "200" },
207 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_LIGHT, "300" },
208 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_NORMAL, "normal" },
209 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_MEDIUM, "500" },
210 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_SEMIBOLD, "600" },
211 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_BOLD, "bold" },
212 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRABOLD, "800" },
213 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_HEAVY, "900" }
217 _gtk_css_font_weight_value_new (PangoWeight font_weight)
221 for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
223 if (font_weight_values[i].value == font_weight)
224 return _gtk_css_value_ref (&font_weight_values[i]);
227 g_return_val_if_reached (NULL);
231 _gtk_css_font_weight_value_try_parse (GtkCssParser *parser)
235 g_return_val_if_fail (parser != NULL, NULL);
237 for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
239 if (_gtk_css_parser_try (parser, font_weight_values[i].name, TRUE))
240 return _gtk_css_value_ref (&font_weight_values[i]);
242 /* special cases go here */
243 if (_gtk_css_parser_try (parser, "400", TRUE))
244 return _gtk_css_value_ref (&font_weight_values[3]);
245 if (_gtk_css_parser_try (parser, "700", TRUE))
246 return _gtk_css_value_ref (&font_weight_values[6]);
252 _gtk_css_font_weight_value_get (const GtkCssValue *value)
254 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_WEIGHT, PANGO_WEIGHT_NORMAL);