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_compute (GtkCssValue *value,
40 GtkStyleContext *context)
42 return _gtk_css_value_ref (value);
46 gtk_css_value_enum_equal (const GtkCssValue *enum1,
47 const GtkCssValue *enum2)
49 return enum1 == enum2;
53 gtk_css_value_enum_transition (GtkCssValue *start,
61 gtk_css_value_enum_print (const GtkCssValue *value,
64 g_string_append (string, value->name);
69 static const GtkCssValueClass GTK_CSS_VALUE_BORDER_STYLE = {
70 gtk_css_value_enum_free,
71 gtk_css_value_enum_compute,
72 gtk_css_value_enum_equal,
73 gtk_css_value_enum_transition,
74 gtk_css_value_enum_print
77 static GtkCssValue border_style_values[] = {
78 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_NONE, "none" },
79 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_SOLID, "solid" },
80 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_INSET, "inset" },
81 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_OUTSET, "outset" },
82 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_HIDDEN, "hidden" },
83 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOTTED, "dotted" },
84 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DASHED, "dashed" },
85 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOUBLE, "double" },
86 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_GROOVE, "groove" },
87 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_RIDGE, "ridge" }
91 _gtk_css_border_style_value_new (GtkBorderStyle border_style)
93 g_return_val_if_fail (border_style < G_N_ELEMENTS (border_style_values), NULL);
95 return _gtk_css_value_ref (&border_style_values[border_style]);
99 _gtk_css_border_style_value_try_parse (GtkCssParser *parser)
103 g_return_val_if_fail (parser != NULL, NULL);
105 for (i = 0; i < G_N_ELEMENTS (border_style_values); i++)
107 if (_gtk_css_parser_try (parser, border_style_values[i].name, TRUE))
108 return _gtk_css_value_ref (&border_style_values[i]);
115 _gtk_css_border_style_value_get (const GtkCssValue *value)
117 g_return_val_if_fail (value->class == >K_CSS_VALUE_BORDER_STYLE, GTK_BORDER_STYLE_NONE);
124 static const GtkCssValueClass GTK_CSS_VALUE_FONT_STYLE = {
125 gtk_css_value_enum_free,
126 gtk_css_value_enum_compute,
127 gtk_css_value_enum_equal,
128 gtk_css_value_enum_transition,
129 gtk_css_value_enum_print
132 static GtkCssValue font_style_values[] = {
133 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_NORMAL, "normal" },
134 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_OBLIQUE, "oblique" },
135 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_ITALIC, "italic" }
139 _gtk_css_font_style_value_new (PangoStyle font_style)
141 g_return_val_if_fail (font_style < G_N_ELEMENTS (font_style_values), NULL);
143 return _gtk_css_value_ref (&font_style_values[font_style]);
147 _gtk_css_font_style_value_try_parse (GtkCssParser *parser)
151 g_return_val_if_fail (parser != NULL, NULL);
153 for (i = 0; i < G_N_ELEMENTS (font_style_values); i++)
155 if (_gtk_css_parser_try (parser, font_style_values[i].name, TRUE))
156 return _gtk_css_value_ref (&font_style_values[i]);
163 _gtk_css_font_style_value_get (const GtkCssValue *value)
165 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_STYLE, PANGO_STYLE_NORMAL);
172 static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT = {
173 gtk_css_value_enum_free,
174 gtk_css_value_enum_compute,
175 gtk_css_value_enum_equal,
176 gtk_css_value_enum_transition,
177 gtk_css_value_enum_print
180 static GtkCssValue font_variant_values[] = {
181 { >K_CSS_VALUE_FONT_VARIANT, 1, PANGO_VARIANT_NORMAL, "normal" },
182 { >K_CSS_VALUE_FONT_VARIANT, 1, PANGO_VARIANT_SMALL_CAPS, "small-caps" }
186 _gtk_css_font_variant_value_new (PangoVariant font_variant)
188 g_return_val_if_fail (font_variant < G_N_ELEMENTS (font_variant_values), NULL);
190 return _gtk_css_value_ref (&font_variant_values[font_variant]);
194 _gtk_css_font_variant_value_try_parse (GtkCssParser *parser)
198 g_return_val_if_fail (parser != NULL, NULL);
200 for (i = 0; i < G_N_ELEMENTS (font_variant_values); i++)
202 if (_gtk_css_parser_try (parser, font_variant_values[i].name, TRUE))
203 return _gtk_css_value_ref (&font_variant_values[i]);
210 _gtk_css_font_variant_value_get (const GtkCssValue *value)
212 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_VARIANT, PANGO_VARIANT_NORMAL);
219 static const GtkCssValueClass GTK_CSS_VALUE_FONT_WEIGHT = {
220 gtk_css_value_enum_free,
221 gtk_css_value_enum_compute,
222 gtk_css_value_enum_equal,
223 gtk_css_value_enum_transition,
224 gtk_css_value_enum_print
227 static GtkCssValue font_weight_values[] = {
228 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_THIN, "100" },
229 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRALIGHT, "200" },
230 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_LIGHT, "300" },
231 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_NORMAL, "normal" },
232 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_MEDIUM, "500" },
233 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_SEMIBOLD, "600" },
234 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_BOLD, "bold" },
235 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRABOLD, "800" },
236 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_HEAVY, "900" }
240 _gtk_css_font_weight_value_new (PangoWeight font_weight)
245 w = ((font_weight + 50) / 100) * 100;
247 for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
249 if (font_weight_values[i].value == w)
250 return _gtk_css_value_ref (&font_weight_values[i]);
253 g_return_val_if_reached (NULL);
257 _gtk_css_font_weight_value_try_parse (GtkCssParser *parser)
261 g_return_val_if_fail (parser != NULL, NULL);
263 for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
265 if (_gtk_css_parser_try (parser, font_weight_values[i].name, TRUE))
266 return _gtk_css_value_ref (&font_weight_values[i]);
268 /* special cases go here */
269 if (_gtk_css_parser_try (parser, "400", TRUE))
270 return _gtk_css_value_ref (&font_weight_values[3]);
271 if (_gtk_css_parser_try (parser, "700", TRUE))
272 return _gtk_css_value_ref (&font_weight_values[6]);
278 _gtk_css_font_weight_value_get (const GtkCssValue *value)
280 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_WEIGHT, PANGO_WEIGHT_NORMAL);
287 static const GtkCssValueClass GTK_CSS_VALUE_AREA = {
288 gtk_css_value_enum_free,
289 gtk_css_value_enum_compute,
290 gtk_css_value_enum_equal,
291 gtk_css_value_enum_transition,
292 gtk_css_value_enum_print
295 static GtkCssValue area_values[] = {
296 { >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_BORDER_BOX, "border-box" },
297 { >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_PADDING_BOX, "padding-box" },
298 { >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_CONTENT_BOX, "content-box" }
302 _gtk_css_area_value_new (GtkCssArea area)
306 for (i = 0; i < G_N_ELEMENTS (area_values); i++)
308 if (area_values[i].value == area)
309 return _gtk_css_value_ref (&area_values[i]);
312 g_return_val_if_reached (NULL);
316 _gtk_css_area_value_try_parse (GtkCssParser *parser)
320 g_return_val_if_fail (parser != NULL, NULL);
322 for (i = 0; i < G_N_ELEMENTS (area_values); i++)
324 if (_gtk_css_parser_try (parser, area_values[i].name, TRUE))
325 return _gtk_css_value_ref (&area_values[i]);
332 _gtk_css_area_value_get (const GtkCssValue *value)
334 g_return_val_if_fail (value->class == >K_CSS_VALUE_AREA, GTK_CSS_AREA_BORDER_BOX);