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,
41 GtkStyleProviderPrivate *provider,
42 GtkCssComputedValues *values,
43 GtkCssComputedValues *parent_values,
44 GtkCssDependencies *dependencies)
46 return _gtk_css_value_ref (value);
50 gtk_css_value_enum_equal (const GtkCssValue *enum1,
51 const GtkCssValue *enum2)
53 return enum1 == enum2;
57 gtk_css_value_enum_transition (GtkCssValue *start,
66 gtk_css_value_enum_print (const GtkCssValue *value,
69 g_string_append (string, value->name);
74 static const GtkCssValueClass GTK_CSS_VALUE_BORDER_STYLE = {
75 gtk_css_value_enum_free,
76 gtk_css_value_enum_compute,
77 gtk_css_value_enum_equal,
78 gtk_css_value_enum_transition,
79 gtk_css_value_enum_print
82 static GtkCssValue border_style_values[] = {
83 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_NONE, "none" },
84 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_SOLID, "solid" },
85 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_INSET, "inset" },
86 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_OUTSET, "outset" },
87 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_HIDDEN, "hidden" },
88 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOTTED, "dotted" },
89 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DASHED, "dashed" },
90 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOUBLE, "double" },
91 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_GROOVE, "groove" },
92 { >K_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_RIDGE, "ridge" }
96 _gtk_css_border_style_value_new (GtkBorderStyle border_style)
98 g_return_val_if_fail (border_style < G_N_ELEMENTS (border_style_values), NULL);
100 return _gtk_css_value_ref (&border_style_values[border_style]);
104 _gtk_css_border_style_value_try_parse (GtkCssParser *parser)
108 g_return_val_if_fail (parser != NULL, NULL);
110 for (i = 0; i < G_N_ELEMENTS (border_style_values); i++)
112 if (_gtk_css_parser_try (parser, border_style_values[i].name, TRUE))
113 return _gtk_css_value_ref (&border_style_values[i]);
120 _gtk_css_border_style_value_get (const GtkCssValue *value)
122 g_return_val_if_fail (value->class == >K_CSS_VALUE_BORDER_STYLE, GTK_BORDER_STYLE_NONE);
129 static const GtkCssValueClass GTK_CSS_VALUE_FONT_STYLE = {
130 gtk_css_value_enum_free,
131 gtk_css_value_enum_compute,
132 gtk_css_value_enum_equal,
133 gtk_css_value_enum_transition,
134 gtk_css_value_enum_print
137 static GtkCssValue font_style_values[] = {
138 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_NORMAL, "normal" },
139 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_OBLIQUE, "oblique" },
140 { >K_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_ITALIC, "italic" }
144 _gtk_css_font_style_value_new (PangoStyle font_style)
146 g_return_val_if_fail (font_style < G_N_ELEMENTS (font_style_values), NULL);
148 return _gtk_css_value_ref (&font_style_values[font_style]);
152 _gtk_css_font_style_value_try_parse (GtkCssParser *parser)
156 g_return_val_if_fail (parser != NULL, NULL);
158 for (i = 0; i < G_N_ELEMENTS (font_style_values); i++)
160 if (_gtk_css_parser_try (parser, font_style_values[i].name, TRUE))
161 return _gtk_css_value_ref (&font_style_values[i]);
168 _gtk_css_font_style_value_get (const GtkCssValue *value)
170 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_STYLE, PANGO_STYLE_NORMAL);
177 static const GtkCssValueClass GTK_CSS_VALUE_FONT_VARIANT = {
178 gtk_css_value_enum_free,
179 gtk_css_value_enum_compute,
180 gtk_css_value_enum_equal,
181 gtk_css_value_enum_transition,
182 gtk_css_value_enum_print
185 static GtkCssValue font_variant_values[] = {
186 { >K_CSS_VALUE_FONT_VARIANT, 1, PANGO_VARIANT_NORMAL, "normal" },
187 { >K_CSS_VALUE_FONT_VARIANT, 1, PANGO_VARIANT_SMALL_CAPS, "small-caps" }
191 _gtk_css_font_variant_value_new (PangoVariant font_variant)
193 g_return_val_if_fail (font_variant < G_N_ELEMENTS (font_variant_values), NULL);
195 return _gtk_css_value_ref (&font_variant_values[font_variant]);
199 _gtk_css_font_variant_value_try_parse (GtkCssParser *parser)
203 g_return_val_if_fail (parser != NULL, NULL);
205 for (i = 0; i < G_N_ELEMENTS (font_variant_values); i++)
207 if (_gtk_css_parser_try (parser, font_variant_values[i].name, TRUE))
208 return _gtk_css_value_ref (&font_variant_values[i]);
215 _gtk_css_font_variant_value_get (const GtkCssValue *value)
217 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_VARIANT, PANGO_VARIANT_NORMAL);
224 static const GtkCssValueClass GTK_CSS_VALUE_FONT_WEIGHT = {
225 gtk_css_value_enum_free,
226 gtk_css_value_enum_compute,
227 gtk_css_value_enum_equal,
228 gtk_css_value_enum_transition,
229 gtk_css_value_enum_print
232 static GtkCssValue font_weight_values[] = {
233 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_THIN, "100" },
234 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRALIGHT, "200" },
235 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_LIGHT, "300" },
236 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_NORMAL, "normal" },
237 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_MEDIUM, "500" },
238 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_SEMIBOLD, "600" },
239 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_BOLD, "bold" },
240 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRABOLD, "800" },
241 { >K_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_HEAVY, "900" }
245 _gtk_css_font_weight_value_new (PangoWeight font_weight)
250 w = ((font_weight + 50) / 100) * 100;
252 for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
254 if (font_weight_values[i].value == w)
255 return _gtk_css_value_ref (&font_weight_values[i]);
258 g_return_val_if_reached (NULL);
262 _gtk_css_font_weight_value_try_parse (GtkCssParser *parser)
266 g_return_val_if_fail (parser != NULL, NULL);
268 for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
270 if (_gtk_css_parser_try (parser, font_weight_values[i].name, TRUE))
271 return _gtk_css_value_ref (&font_weight_values[i]);
273 /* special cases go here */
274 if (_gtk_css_parser_try (parser, "400", TRUE))
275 return _gtk_css_value_ref (&font_weight_values[3]);
276 if (_gtk_css_parser_try (parser, "700", TRUE))
277 return _gtk_css_value_ref (&font_weight_values[6]);
283 _gtk_css_font_weight_value_get (const GtkCssValue *value)
285 g_return_val_if_fail (value->class == >K_CSS_VALUE_FONT_WEIGHT, PANGO_WEIGHT_NORMAL);
292 static const GtkCssValueClass GTK_CSS_VALUE_AREA = {
293 gtk_css_value_enum_free,
294 gtk_css_value_enum_compute,
295 gtk_css_value_enum_equal,
296 gtk_css_value_enum_transition,
297 gtk_css_value_enum_print
300 static GtkCssValue area_values[] = {
301 { >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_BORDER_BOX, "border-box" },
302 { >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_PADDING_BOX, "padding-box" },
303 { >K_CSS_VALUE_AREA, 1, GTK_CSS_AREA_CONTENT_BOX, "content-box" }
307 _gtk_css_area_value_new (GtkCssArea area)
311 for (i = 0; i < G_N_ELEMENTS (area_values); i++)
313 if (area_values[i].value == area)
314 return _gtk_css_value_ref (&area_values[i]);
317 g_return_val_if_reached (NULL);
321 _gtk_css_area_value_try_parse (GtkCssParser *parser)
325 g_return_val_if_fail (parser != NULL, NULL);
327 for (i = 0; i < G_N_ELEMENTS (area_values); i++)
329 if (_gtk_css_parser_try (parser, area_values[i].name, TRUE))
330 return _gtk_css_value_ref (&area_values[i]);
337 _gtk_css_area_value_get (const GtkCssValue *value)
339 g_return_val_if_fail (value->class == >K_CSS_VALUE_AREA, GTK_CSS_AREA_BORDER_BOX);
344 /* GtkCssDirection */
346 static const GtkCssValueClass GTK_CSS_VALUE_DIRECTION = {
347 gtk_css_value_enum_free,
348 gtk_css_value_enum_compute,
349 gtk_css_value_enum_equal,
350 gtk_css_value_enum_transition,
351 gtk_css_value_enum_print
354 static GtkCssValue direction_values[] = {
355 { >K_CSS_VALUE_DIRECTION, 1, GTK_CSS_DIRECTION_NORMAL, "normal" },
356 { >K_CSS_VALUE_DIRECTION, 1, GTK_CSS_DIRECTION_REVERSE, "reverse" },
357 { >K_CSS_VALUE_DIRECTION, 1, GTK_CSS_DIRECTION_ALTERNATE, "alternate" },
358 { >K_CSS_VALUE_DIRECTION, 1, GTK_CSS_DIRECTION_ALTERNATE_REVERSE, "alternate-reverse" }
362 _gtk_css_direction_value_new (GtkCssDirection direction)
366 for (i = 0; i < G_N_ELEMENTS (direction_values); i++)
368 if (direction_values[i].value == direction)
369 return _gtk_css_value_ref (&direction_values[i]);
372 g_return_val_if_reached (NULL);
376 _gtk_css_direction_value_try_parse (GtkCssParser *parser)
380 g_return_val_if_fail (parser != NULL, NULL);
382 for (i = 0; i < G_N_ELEMENTS (direction_values); i++)
384 if (_gtk_css_parser_try (parser, direction_values[i].name, TRUE))
385 return _gtk_css_value_ref (&direction_values[i]);
392 _gtk_css_direction_value_get (const GtkCssValue *value)
394 g_return_val_if_fail (value->class == >K_CSS_VALUE_DIRECTION, GTK_CSS_DIRECTION_NORMAL);
399 /* GtkCssPlayState */
401 static const GtkCssValueClass GTK_CSS_VALUE_PLAY_STATE = {
402 gtk_css_value_enum_free,
403 gtk_css_value_enum_compute,
404 gtk_css_value_enum_equal,
405 gtk_css_value_enum_transition,
406 gtk_css_value_enum_print
409 static GtkCssValue play_state_values[] = {
410 { >K_CSS_VALUE_PLAY_STATE, 1, GTK_CSS_PLAY_STATE_RUNNING, "running" },
411 { >K_CSS_VALUE_PLAY_STATE, 1, GTK_CSS_PLAY_STATE_PAUSED, "paused" }
415 _gtk_css_play_state_value_new (GtkCssPlayState play_state)
419 for (i = 0; i < G_N_ELEMENTS (play_state_values); i++)
421 if (play_state_values[i].value == play_state)
422 return _gtk_css_value_ref (&play_state_values[i]);
425 g_return_val_if_reached (NULL);
429 _gtk_css_play_state_value_try_parse (GtkCssParser *parser)
433 g_return_val_if_fail (parser != NULL, NULL);
435 for (i = 0; i < G_N_ELEMENTS (play_state_values); i++)
437 if (_gtk_css_parser_try (parser, play_state_values[i].name, TRUE))
438 return _gtk_css_value_ref (&play_state_values[i]);
445 _gtk_css_play_state_value_get (const GtkCssValue *value)
447 g_return_val_if_fail (value->class == >K_CSS_VALUE_PLAY_STATE, GTK_CSS_PLAY_STATE_RUNNING);
454 static const GtkCssValueClass GTK_CSS_VALUE_FILL_MODE = {
455 gtk_css_value_enum_free,
456 gtk_css_value_enum_compute,
457 gtk_css_value_enum_equal,
458 gtk_css_value_enum_transition,
459 gtk_css_value_enum_print
462 static GtkCssValue fill_mode_values[] = {
463 { >K_CSS_VALUE_FILL_MODE, 1, GTK_CSS_FILL_NONE, "none" },
464 { >K_CSS_VALUE_FILL_MODE, 1, GTK_CSS_FILL_FORWARDS, "forwards" },
465 { >K_CSS_VALUE_FILL_MODE, 1, GTK_CSS_FILL_BACKWARDS, "backwards" },
466 { >K_CSS_VALUE_FILL_MODE, 1, GTK_CSS_FILL_BOTH, "both" }
470 _gtk_css_fill_mode_value_new (GtkCssFillMode fill_mode)
474 for (i = 0; i < G_N_ELEMENTS (fill_mode_values); i++)
476 if (fill_mode_values[i].value == fill_mode)
477 return _gtk_css_value_ref (&fill_mode_values[i]);
480 g_return_val_if_reached (NULL);
484 _gtk_css_fill_mode_value_try_parse (GtkCssParser *parser)
488 g_return_val_if_fail (parser != NULL, NULL);
490 for (i = 0; i < G_N_ELEMENTS (fill_mode_values); i++)
492 if (_gtk_css_parser_try (parser, fill_mode_values[i].name, TRUE))
493 return _gtk_css_value_ref (&fill_mode_values[i]);
500 _gtk_css_fill_mode_value_get (const GtkCssValue *value)
502 g_return_val_if_fail (value->class == >K_CSS_VALUE_FILL_MODE, GTK_CSS_FILL_NONE);