]> Pileus Git - ~andy/gtk/blob - gtk/gtkcssenumvalue.c
cssvalue: Add enum values for the pango enums
[~andy/gtk] / gtk / gtkcssenumvalue.c
1 /* GTK - The GIMP Toolkit
2  * Copyright (C) 2011 Red Hat, Inc.
3  *
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.
8  *
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.
13  *
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/>.
16  */
17
18 #include "config.h"
19
20 #include "gtkcssenumvalueprivate.h"
21
22 #include "gtkstylepropertyprivate.h"
23
24 /* repeated API */
25
26 struct _GtkCssValue {
27   GTK_CSS_VALUE_BASE
28   int value;
29   const char *name;
30 };
31
32 static void
33 gtk_css_value_enum_free (GtkCssValue *value)
34 {
35   g_slice_free (GtkCssValue, value);
36 }
37
38 static gboolean
39 gtk_css_value_enum_equal (const GtkCssValue *enum1,
40                           const GtkCssValue *enum2)
41 {
42   return enum1 == enum2;
43 }
44
45 static void
46 gtk_css_value_enum_print (const GtkCssValue *value,
47                           GString           *string)
48 {
49   g_string_append (string, value->name);
50 }
51
52 /* GtkBorderStyle */
53
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
58 };
59
60 static GtkCssValue border_style_values[] = {
61   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_NONE, "none" },
62   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_SOLID, "solid" },
63   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_INSET, "inset" },
64   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_OUTSET, "outset" },
65   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_HIDDEN, "hidden" },
66   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOTTED, "dotted" },
67   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DASHED, "dashed" },
68   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_DOUBLE, "double" },
69   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_GROOVE, "groove" },
70   { &GTK_CSS_VALUE_BORDER_STYLE, 1, GTK_BORDER_STYLE_RIDGE, "ridge" }
71 };
72
73 GtkCssValue *
74 _gtk_css_border_style_value_new (GtkBorderStyle border_style)
75 {
76   g_return_val_if_fail (border_style < G_N_ELEMENTS (border_style_values), NULL);
77
78   return _gtk_css_value_ref (&border_style_values[border_style]);
79 }
80
81 GtkCssValue *
82 _gtk_css_border_style_value_try_parse (GtkCssParser *parser)
83 {
84   guint i;
85
86   g_return_val_if_fail (parser != NULL, NULL);
87
88   for (i = 0; i < G_N_ELEMENTS (border_style_values); i++)
89     {
90       if (_gtk_css_parser_try (parser, border_style_values[i].name, TRUE))
91         return _gtk_css_value_ref (&border_style_values[i]);
92     }
93
94   return NULL;
95 }
96
97 GtkBorderStyle
98 _gtk_css_border_style_value_get (const GtkCssValue *value)
99 {
100   g_return_val_if_fail (value->class == &GTK_CSS_VALUE_BORDER_STYLE, GTK_BORDER_STYLE_NONE);
101
102   return value->value;
103 }
104
105 /* PangoStyle */
106
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
111 };
112
113 static GtkCssValue font_style_values[] = {
114   { &GTK_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_NORMAL, "normal" },
115   { &GTK_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_OBLIQUE, "oblique" },
116   { &GTK_CSS_VALUE_FONT_STYLE, 1, PANGO_STYLE_ITALIC, "italic" }
117 };
118
119 GtkCssValue *
120 _gtk_css_font_style_value_new (PangoStyle font_style)
121 {
122   g_return_val_if_fail (font_style < G_N_ELEMENTS (font_style_values), NULL);
123
124   return _gtk_css_value_ref (&font_style_values[font_style]);
125 }
126
127 GtkCssValue *
128 _gtk_css_font_style_value_try_parse (GtkCssParser *parser)
129 {
130   guint i;
131
132   g_return_val_if_fail (parser != NULL, NULL);
133
134   for (i = 0; i < G_N_ELEMENTS (font_style_values); i++)
135     {
136       if (_gtk_css_parser_try (parser, font_style_values[i].name, TRUE))
137         return _gtk_css_value_ref (&font_style_values[i]);
138     }
139
140   return NULL;
141 }
142
143 PangoStyle
144 _gtk_css_font_style_value_get (const GtkCssValue *value)
145 {
146   g_return_val_if_fail (value->class == &GTK_CSS_VALUE_FONT_STYLE, PANGO_STYLE_NORMAL);
147
148   return value->value;
149 }
150
151 /* PangoVariant */
152
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
157 };
158
159 static GtkCssValue font_variant_values[] = {
160   { &GTK_CSS_VALUE_FONT_VARIANT, 1, PANGO_VARIANT_NORMAL, "normal" },
161   { &GTK_CSS_VALUE_FONT_VARIANT, 1, PANGO_VARIANT_SMALL_CAPS, "small-caps" }
162 };
163
164 GtkCssValue *
165 _gtk_css_font_variant_value_new (PangoVariant font_variant)
166 {
167   g_return_val_if_fail (font_variant < G_N_ELEMENTS (font_variant_values), NULL);
168
169   return _gtk_css_value_ref (&font_variant_values[font_variant]);
170 }
171
172 GtkCssValue *
173 _gtk_css_font_variant_value_try_parse (GtkCssParser *parser)
174 {
175   guint i;
176
177   g_return_val_if_fail (parser != NULL, NULL);
178
179   for (i = 0; i < G_N_ELEMENTS (font_variant_values); i++)
180     {
181       if (_gtk_css_parser_try (parser, font_variant_values[i].name, TRUE))
182         return _gtk_css_value_ref (&font_variant_values[i]);
183     }
184
185   return NULL;
186 }
187
188 PangoVariant
189 _gtk_css_font_variant_value_get (const GtkCssValue *value)
190 {
191   g_return_val_if_fail (value->class == &GTK_CSS_VALUE_FONT_VARIANT, PANGO_VARIANT_NORMAL);
192
193   return value->value;
194 }
195
196 /* PangoWeight */
197
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
202 };
203
204 static GtkCssValue font_weight_values[] = {
205   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_THIN, "100" },
206   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRALIGHT, "200" },
207   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_LIGHT, "300" },
208   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_NORMAL, "normal" },
209   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_MEDIUM, "500" },
210   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_SEMIBOLD, "600" },
211   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_BOLD, "bold" },
212   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_ULTRABOLD, "800" },
213   { &GTK_CSS_VALUE_FONT_WEIGHT, 1, PANGO_WEIGHT_HEAVY, "900" }
214 };
215
216 GtkCssValue *
217 _gtk_css_font_weight_value_new (PangoWeight font_weight)
218 {
219   guint i;
220
221   for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
222     {
223       if (font_weight_values[i].value == font_weight)
224         return _gtk_css_value_ref (&font_weight_values[i]);
225     }
226
227   g_return_val_if_reached (NULL);
228 }
229
230 GtkCssValue *
231 _gtk_css_font_weight_value_try_parse (GtkCssParser *parser)
232 {
233   guint i;
234
235   g_return_val_if_fail (parser != NULL, NULL);
236
237   for (i = 0; i < G_N_ELEMENTS (font_weight_values); i++)
238     {
239       if (_gtk_css_parser_try (parser, font_weight_values[i].name, TRUE))
240         return _gtk_css_value_ref (&font_weight_values[i]);
241     }
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]);
247
248   return NULL;
249 }
250
251 PangoWeight
252 _gtk_css_font_weight_value_get (const GtkCssValue *value)
253 {
254   g_return_val_if_fail (value->class == &GTK_CSS_VALUE_FONT_WEIGHT, PANGO_WEIGHT_NORMAL);
255
256   return value->value;
257 }
258