1 | /* |
2 | * Copyright © 2012 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.1 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 | * Authors: Benjamin Otte <otte@gnome.org> |
18 | */ |
19 | |
20 | #include "config.h" |
21 | |
22 | #include "gtkcssstaticstyleprivate.h" |
23 | |
24 | #include "gtkcssanimationprivate.h" |
25 | #include "gtkcssarrayvalueprivate.h" |
26 | #include "gtkcssenumvalueprivate.h" |
27 | #include "gtkcssinheritvalueprivate.h" |
28 | #include "gtkcssinitialvalueprivate.h" |
29 | #include "gtkcssnumbervalueprivate.h" |
30 | #include "gtkcssshorthandpropertyprivate.h" |
31 | #include "gtkcssstringvalueprivate.h" |
32 | #include "gtkcssstylepropertyprivate.h" |
33 | #include "gtkcsstransitionprivate.h" |
34 | #include "gtkprivate.h" |
35 | #include "gtkintl.h" |
36 | #include "gtksettings.h" |
37 | #include "gtkstyleanimationprivate.h" |
38 | #include "gtkstylepropertyprivate.h" |
39 | #include "gtkstyleproviderprivate.h" |
40 | #include "gtkcssdimensionvalueprivate.h" |
41 | |
42 | static void gtk_css_static_style_compute_value (GtkCssStaticStyle *style, |
43 | GtkStyleProvider *provider, |
44 | GtkCssStyle *parent_style, |
45 | guint id, |
46 | GtkCssValue *specified, |
47 | GtkCssSection *section); |
48 | |
49 | static const int core_props[] = { |
50 | GTK_CSS_PROPERTY_COLOR, |
51 | GTK_CSS_PROPERTY_DPI, |
52 | GTK_CSS_PROPERTY_FONT_SIZE, |
53 | GTK_CSS_PROPERTY_ICON_PALETTE |
54 | }; |
55 | |
56 | static const int background_props[] = { |
57 | GTK_CSS_PROPERTY_BACKGROUND_COLOR, |
58 | GTK_CSS_PROPERTY_BOX_SHADOW, |
59 | GTK_CSS_PROPERTY_BACKGROUND_CLIP, |
60 | GTK_CSS_PROPERTY_BACKGROUND_ORIGIN, |
61 | GTK_CSS_PROPERTY_BACKGROUND_SIZE, |
62 | GTK_CSS_PROPERTY_BACKGROUND_POSITION, |
63 | GTK_CSS_PROPERTY_BACKGROUND_REPEAT, |
64 | GTK_CSS_PROPERTY_BACKGROUND_IMAGE, |
65 | GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE |
66 | }; |
67 | |
68 | static const int border_props[] = { |
69 | GTK_CSS_PROPERTY_BORDER_TOP_STYLE, |
70 | GTK_CSS_PROPERTY_BORDER_TOP_WIDTH, |
71 | GTK_CSS_PROPERTY_BORDER_LEFT_STYLE, |
72 | GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH, |
73 | GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE, |
74 | GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH, |
75 | GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE, |
76 | GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH, |
77 | GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS, |
78 | GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS, |
79 | GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS, |
80 | GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS, |
81 | GTK_CSS_PROPERTY_BORDER_TOP_COLOR, |
82 | GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR, |
83 | GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR, |
84 | GTK_CSS_PROPERTY_BORDER_LEFT_COLOR, |
85 | GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE, |
86 | GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT, |
87 | GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE, |
88 | GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH |
89 | }; |
90 | |
91 | static const int icon_props[] = { |
92 | GTK_CSS_PROPERTY_ICON_SIZE, |
93 | GTK_CSS_PROPERTY_ICON_SHADOW, |
94 | GTK_CSS_PROPERTY_ICON_STYLE, |
95 | }; |
96 | |
97 | static const int outline_props[] = { |
98 | GTK_CSS_PROPERTY_OUTLINE_STYLE, |
99 | GTK_CSS_PROPERTY_OUTLINE_WIDTH, |
100 | GTK_CSS_PROPERTY_OUTLINE_OFFSET, |
101 | GTK_CSS_PROPERTY_OUTLINE_COLOR, |
102 | }; |
103 | |
104 | static const int font_props[] = { |
105 | GTK_CSS_PROPERTY_FONT_FAMILY, |
106 | GTK_CSS_PROPERTY_FONT_STYLE, |
107 | GTK_CSS_PROPERTY_FONT_WEIGHT, |
108 | GTK_CSS_PROPERTY_FONT_STRETCH, |
109 | GTK_CSS_PROPERTY_LETTER_SPACING, |
110 | GTK_CSS_PROPERTY_TEXT_SHADOW, |
111 | GTK_CSS_PROPERTY_CARET_COLOR, |
112 | GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR, |
113 | GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS, |
114 | GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS, |
115 | GTK_CSS_PROPERTY_LINE_HEIGHT, |
116 | }; |
117 | static const int font_variant_props[] = { |
118 | GTK_CSS_PROPERTY_TEXT_DECORATION_LINE, |
119 | GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR, |
120 | GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE, |
121 | GTK_CSS_PROPERTY_TEXT_TRANSFORM, |
122 | GTK_CSS_PROPERTY_FONT_KERNING, |
123 | GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES, |
124 | GTK_CSS_PROPERTY_FONT_VARIANT_POSITION, |
125 | GTK_CSS_PROPERTY_FONT_VARIANT_CAPS, |
126 | GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC, |
127 | GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES, |
128 | GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN, |
129 | }; |
130 | |
131 | static const int animation_props[] = { |
132 | GTK_CSS_PROPERTY_ANIMATION_NAME, |
133 | GTK_CSS_PROPERTY_ANIMATION_DURATION, |
134 | GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION, |
135 | GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT, |
136 | GTK_CSS_PROPERTY_ANIMATION_DIRECTION, |
137 | GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE, |
138 | GTK_CSS_PROPERTY_ANIMATION_DELAY, |
139 | GTK_CSS_PROPERTY_ANIMATION_FILL_MODE, |
140 | }; |
141 | |
142 | static const int transition_props[] = { |
143 | GTK_CSS_PROPERTY_TRANSITION_PROPERTY, |
144 | GTK_CSS_PROPERTY_TRANSITION_DURATION, |
145 | GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION, |
146 | GTK_CSS_PROPERTY_TRANSITION_DELAY, |
147 | }; |
148 | |
149 | static const int size_props[] = { |
150 | GTK_CSS_PROPERTY_MARGIN_TOP, |
151 | GTK_CSS_PROPERTY_MARGIN_LEFT, |
152 | GTK_CSS_PROPERTY_MARGIN_BOTTOM, |
153 | GTK_CSS_PROPERTY_MARGIN_RIGHT, |
154 | GTK_CSS_PROPERTY_PADDING_TOP, |
155 | GTK_CSS_PROPERTY_PADDING_LEFT, |
156 | GTK_CSS_PROPERTY_PADDING_BOTTOM, |
157 | GTK_CSS_PROPERTY_PADDING_RIGHT, |
158 | GTK_CSS_PROPERTY_BORDER_SPACING, |
159 | GTK_CSS_PROPERTY_MIN_WIDTH, |
160 | GTK_CSS_PROPERTY_MIN_HEIGHT, |
161 | }; |
162 | |
163 | static const int other_props[] = { |
164 | GTK_CSS_PROPERTY_ICON_SOURCE, |
165 | GTK_CSS_PROPERTY_ICON_TRANSFORM, |
166 | GTK_CSS_PROPERTY_ICON_FILTER, |
167 | GTK_CSS_PROPERTY_TRANSFORM, |
168 | GTK_CSS_PROPERTY_TRANSFORM_ORIGIN, |
169 | GTK_CSS_PROPERTY_OPACITY, |
170 | GTK_CSS_PROPERTY_FILTER, |
171 | }; |
172 | |
173 | #define GET_VALUES(v) (GtkCssValue **)((guint8*)(v) + sizeof (GtkCssValues)) |
174 | |
175 | #define DEFINE_VALUES(ENUM, TYPE, NAME) \ |
176 | void \ |
177 | gtk_css_## NAME ## _values_compute_changes_and_affects (GtkCssStyle *style1, \ |
178 | GtkCssStyle *style2, \ |
179 | GtkBitmask **changes, \ |
180 | GtkCssAffects *affects) \ |
181 | { \ |
182 | GtkCssValue **g1 = GET_VALUES (style1->NAME); \ |
183 | GtkCssValue **g2 = GET_VALUES (style2->NAME); \ |
184 | int i; \ |
185 | for (i = 0; i < G_N_ELEMENTS (NAME ## _props); i++) \ |
186 | { \ |
187 | GtkCssValue *v1 = g1[i] ? g1[i] : style1->core->color; \ |
188 | GtkCssValue *v2 = g2[i] ? g2[i] : style2->core->color; \ |
189 | if (!_gtk_css_value_equal (v1, v2)) \ |
190 | { \ |
191 | guint id = NAME ## _props[i]; \ |
192 | *changes = _gtk_bitmask_set (*changes, id, TRUE); \ |
193 | *affects |= _gtk_css_style_property_get_affects (_gtk_css_style_property_lookup_by_id (id)); \ |
194 | } \ |
195 | } \ |
196 | } \ |
197 | \ |
198 | static inline void \ |
199 | gtk_css_ ## NAME ## _values_new_compute (GtkCssStaticStyle *sstyle, \ |
200 | GtkStyleProvider *provider, \ |
201 | GtkCssStyle *parent_style, \ |
202 | GtkCssLookup *lookup) \ |
203 | { \ |
204 | GtkCssStyle *style = (GtkCssStyle *)sstyle; \ |
205 | int i; \ |
206 | \ |
207 | style->NAME = (GtkCss ## TYPE ## Values *)gtk_css_values_new (GTK_CSS_ ## ENUM ## _VALUES); \ |
208 | \ |
209 | for (i = 0; i < G_N_ELEMENTS (NAME ## _props); i++) \ |
210 | { \ |
211 | guint id = NAME ## _props[i]; \ |
212 | gtk_css_static_style_compute_value (sstyle, \ |
213 | provider, \ |
214 | parent_style, \ |
215 | id, \ |
216 | lookup->values[id].value, \ |
217 | lookup->values[id].section); \ |
218 | } \ |
219 | } \ |
220 | static GtkBitmask * gtk_css_ ## NAME ## _values_mask; \ |
221 | static GtkCssValues * gtk_css_ ## NAME ## _initial_values; \ |
222 | \ |
223 | static GtkCssValues * gtk_css_ ## NAME ## _create_initial_values (void); \ |
224 | \ |
225 | static void \ |
226 | gtk_css_ ## NAME ## _values_init (void) \ |
227 | { \ |
228 | int i; \ |
229 | gtk_css_ ## NAME ## _values_mask = _gtk_bitmask_new (); \ |
230 | for (i = 0; i < G_N_ELEMENTS(NAME ## _props); i++) \ |
231 | { \ |
232 | guint id = NAME ## _props[i]; \ |
233 | gtk_css_ ## NAME ## _values_mask = _gtk_bitmask_set (gtk_css_ ## NAME ## _values_mask, id, TRUE); \ |
234 | } \ |
235 | \ |
236 | gtk_css_ ## NAME ## _initial_values = gtk_css_ ## NAME ## _create_initial_values (); \ |
237 | } \ |
238 | \ |
239 | static inline gboolean \ |
240 | gtk_css_ ## NAME ## _values_unset (const GtkCssLookup *lookup) \ |
241 | { \ |
242 | const GtkBitmask *set_values = _gtk_css_lookup_get_set_values (lookup); \ |
243 | return !_gtk_bitmask_intersects (set_values, gtk_css_ ## NAME ## _values_mask); \ |
244 | } |
245 | |
246 | DEFINE_VALUES (CORE, Core, core) |
247 | DEFINE_VALUES (BACKGROUND, Background, background) |
248 | DEFINE_VALUES (BORDER, Border, border) |
249 | DEFINE_VALUES (ICON, Icon, icon) |
250 | DEFINE_VALUES (OUTLINE, Outline, outline) |
251 | DEFINE_VALUES (FONT, Font, font) |
252 | DEFINE_VALUES (FONT_VARIANT, FontVariant, font_variant) |
253 | DEFINE_VALUES (ANIMATION, Animation, animation) |
254 | DEFINE_VALUES (TRANSITION, Transition, transition) |
255 | DEFINE_VALUES (SIZE, Size, size) |
256 | DEFINE_VALUES (OTHER, Other, other) |
257 | |
258 | #define VERIFY_MASK(NAME) \ |
259 | { \ |
260 | GtkBitmask *copy; \ |
261 | copy = _gtk_bitmask_intersect (_gtk_bitmask_copy (gtk_css_ ## NAME ## _values_mask), all); \ |
262 | g_assert (_gtk_bitmask_equals (copy, gtk_css_ ## NAME ## _values_mask)); \ |
263 | _gtk_bitmask_free (copy); \ |
264 | } \ |
265 | all = _gtk_bitmask_subtract (all, gtk_css_ ## NAME ## _values_mask); |
266 | |
267 | /* Verify that every style property is present in one group, and none |
268 | * is present in more than one group. |
269 | */ |
270 | static void |
271 | verify_style_groups (void) |
272 | { |
273 | GtkBitmask *all; |
274 | guint id; |
275 | |
276 | all = _gtk_bitmask_new (); |
277 | |
278 | for (id = 0; id < GTK_CSS_PROPERTY_N_PROPERTIES; id++) |
279 | all = _gtk_bitmask_set (mask: all, index_: id, TRUE); |
280 | |
281 | VERIFY_MASK (core); |
282 | VERIFY_MASK (background); |
283 | VERIFY_MASK (border); |
284 | VERIFY_MASK (icon); |
285 | VERIFY_MASK (outline); |
286 | VERIFY_MASK (font); |
287 | VERIFY_MASK (font_variant); |
288 | VERIFY_MASK (animation); |
289 | VERIFY_MASK (transition); |
290 | VERIFY_MASK (size); |
291 | VERIFY_MASK (other); |
292 | |
293 | g_assert (_gtk_bitmask_is_empty (all)); |
294 | |
295 | _gtk_bitmask_free (mask: all); |
296 | } |
297 | |
298 | #undef VERIFY_MASK |
299 | |
300 | G_DEFINE_TYPE (GtkCssStaticStyle, gtk_css_static_style, GTK_TYPE_CSS_STYLE) |
301 | |
302 | static GtkCssSection * |
303 | gtk_css_static_style_get_section (GtkCssStyle *style, |
304 | guint id) |
305 | { |
306 | GtkCssStaticStyle *sstyle = GTK_CSS_STATIC_STYLE (style); |
307 | |
308 | if (sstyle->sections == NULL || |
309 | id >= sstyle->sections->len) |
310 | return NULL; |
311 | |
312 | return g_ptr_array_index (sstyle->sections, id); |
313 | } |
314 | |
315 | static void |
316 | gtk_css_static_style_dispose (GObject *object) |
317 | { |
318 | GtkCssStaticStyle *style = GTK_CSS_STATIC_STYLE (object); |
319 | |
320 | if (style->sections) |
321 | { |
322 | g_ptr_array_unref (array: style->sections); |
323 | style->sections = NULL; |
324 | } |
325 | |
326 | G_OBJECT_CLASS (gtk_css_static_style_parent_class)->dispose (object); |
327 | } |
328 | |
329 | static GtkCssStaticStyle * |
330 | gtk_css_static_style_get_static_style (GtkCssStyle *style) |
331 | { |
332 | return (GtkCssStaticStyle *)style; |
333 | } |
334 | |
335 | static void |
336 | gtk_css_static_style_class_init (GtkCssStaticStyleClass *klass) |
337 | { |
338 | GObjectClass *object_class = G_OBJECT_CLASS (klass); |
339 | GtkCssStyleClass *style_class = GTK_CSS_STYLE_CLASS (klass); |
340 | |
341 | object_class->dispose = gtk_css_static_style_dispose; |
342 | |
343 | style_class->get_section = gtk_css_static_style_get_section; |
344 | style_class->get_static_style = gtk_css_static_style_get_static_style; |
345 | |
346 | gtk_css_core_values_init (); |
347 | gtk_css_background_values_init (); |
348 | gtk_css_border_values_init (); |
349 | gtk_css_icon_values_init (); |
350 | gtk_css_outline_values_init (); |
351 | gtk_css_font_values_init (); |
352 | gtk_css_font_variant_values_init (); |
353 | gtk_css_animation_values_init (); |
354 | gtk_css_transition_values_init (); |
355 | gtk_css_size_values_init (); |
356 | gtk_css_other_values_init (); |
357 | |
358 | verify_style_groups (); |
359 | } |
360 | |
361 | static void |
362 | gtk_css_static_style_init (GtkCssStaticStyle *style) |
363 | { |
364 | } |
365 | |
366 | static void |
367 | maybe_unref_section (gpointer section) |
368 | { |
369 | if (section) |
370 | gtk_css_section_unref (section); |
371 | } |
372 | |
373 | static inline void |
374 | gtk_css_take_value (GtkCssValue **variable, |
375 | GtkCssValue *value) |
376 | { |
377 | if (*variable) |
378 | gtk_css_value_unref (value: *variable); |
379 | *variable = value; |
380 | } |
381 | |
382 | static void |
383 | gtk_css_static_style_set_value (GtkCssStaticStyle *sstyle, |
384 | guint id, |
385 | GtkCssValue *value, |
386 | GtkCssSection *section) |
387 | { |
388 | GtkCssStyle *style = (GtkCssStyle *)sstyle; |
389 | |
390 | switch (id) |
391 | { |
392 | case GTK_CSS_PROPERTY_COLOR: |
393 | gtk_css_take_value (variable: &style->core->color, value); |
394 | break; |
395 | case GTK_CSS_PROPERTY_DPI: |
396 | gtk_css_take_value (variable: &style->core->dpi, value); |
397 | break; |
398 | case GTK_CSS_PROPERTY_FONT_SIZE: |
399 | gtk_css_take_value (variable: &style->core->font_size, value); |
400 | break; |
401 | case GTK_CSS_PROPERTY_ICON_PALETTE: |
402 | gtk_css_take_value (variable: &style->core->icon_palette, value); |
403 | break; |
404 | case GTK_CSS_PROPERTY_BACKGROUND_COLOR: |
405 | gtk_css_take_value (variable: &style->background->background_color, value); |
406 | break; |
407 | case GTK_CSS_PROPERTY_FONT_FAMILY: |
408 | gtk_css_take_value (variable: &style->font->font_family, value); |
409 | break; |
410 | case GTK_CSS_PROPERTY_FONT_STYLE: |
411 | gtk_css_take_value (variable: &style->font->font_style, value); |
412 | break; |
413 | case GTK_CSS_PROPERTY_FONT_WEIGHT: |
414 | gtk_css_take_value (variable: &style->font->font_weight, value); |
415 | break; |
416 | case GTK_CSS_PROPERTY_FONT_STRETCH: |
417 | gtk_css_take_value (variable: &style->font->font_stretch, value); |
418 | break; |
419 | case GTK_CSS_PROPERTY_LETTER_SPACING: |
420 | gtk_css_take_value (variable: &style->font->letter_spacing, value); |
421 | break; |
422 | case GTK_CSS_PROPERTY_LINE_HEIGHT: |
423 | gtk_css_take_value (variable: &style->font->line_height, value); |
424 | break; |
425 | case GTK_CSS_PROPERTY_TEXT_DECORATION_LINE: |
426 | gtk_css_take_value (variable: &style->font_variant->text_decoration_line, value); |
427 | break; |
428 | case GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR: |
429 | gtk_css_take_value (variable: &style->font_variant->text_decoration_color, value); |
430 | break; |
431 | case GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE: |
432 | gtk_css_take_value (variable: &style->font_variant->text_decoration_style, value); |
433 | break; |
434 | case GTK_CSS_PROPERTY_TEXT_TRANSFORM: |
435 | gtk_css_take_value (variable: &style->font_variant->text_transform, value); |
436 | break; |
437 | case GTK_CSS_PROPERTY_FONT_KERNING: |
438 | gtk_css_take_value (variable: &style->font_variant->font_kerning, value); |
439 | break; |
440 | case GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES: |
441 | gtk_css_take_value (variable: &style->font_variant->font_variant_ligatures, value); |
442 | break; |
443 | case GTK_CSS_PROPERTY_FONT_VARIANT_POSITION: |
444 | gtk_css_take_value (variable: &style->font_variant->font_variant_position, value); |
445 | break; |
446 | case GTK_CSS_PROPERTY_FONT_VARIANT_CAPS: |
447 | gtk_css_take_value (variable: &style->font_variant->font_variant_caps, value); |
448 | break; |
449 | case GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC: |
450 | gtk_css_take_value (variable: &style->font_variant->font_variant_numeric, value); |
451 | break; |
452 | case GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES: |
453 | gtk_css_take_value (variable: &style->font_variant->font_variant_alternates, value); |
454 | break; |
455 | case GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN: |
456 | gtk_css_take_value (variable: &style->font_variant->font_variant_east_asian, value); |
457 | break; |
458 | case GTK_CSS_PROPERTY_TEXT_SHADOW: |
459 | gtk_css_take_value (variable: &style->font->text_shadow, value); |
460 | break; |
461 | case GTK_CSS_PROPERTY_BOX_SHADOW: |
462 | gtk_css_take_value (variable: &style->background->box_shadow, value); |
463 | break; |
464 | case GTK_CSS_PROPERTY_MARGIN_TOP: |
465 | gtk_css_take_value (variable: &style->size->margin_top, value); |
466 | break; |
467 | case GTK_CSS_PROPERTY_MARGIN_LEFT: |
468 | gtk_css_take_value (variable: &style->size->margin_left, value); |
469 | break; |
470 | case GTK_CSS_PROPERTY_MARGIN_BOTTOM: |
471 | gtk_css_take_value (variable: &style->size->margin_bottom, value); |
472 | break; |
473 | case GTK_CSS_PROPERTY_MARGIN_RIGHT: |
474 | gtk_css_take_value (variable: &style->size->margin_right, value); |
475 | break; |
476 | case GTK_CSS_PROPERTY_PADDING_TOP: |
477 | gtk_css_take_value (variable: &style->size->padding_top, value); |
478 | break; |
479 | case GTK_CSS_PROPERTY_PADDING_LEFT: |
480 | gtk_css_take_value (variable: &style->size->padding_left, value); |
481 | break; |
482 | case GTK_CSS_PROPERTY_PADDING_BOTTOM: |
483 | gtk_css_take_value (variable: &style->size->padding_bottom, value); |
484 | break; |
485 | case GTK_CSS_PROPERTY_PADDING_RIGHT: |
486 | gtk_css_take_value (variable: &style->size->padding_right, value); |
487 | break; |
488 | case GTK_CSS_PROPERTY_BORDER_TOP_STYLE: |
489 | gtk_css_take_value (variable: &style->border->border_top_style, value); |
490 | break; |
491 | case GTK_CSS_PROPERTY_BORDER_TOP_WIDTH: |
492 | gtk_css_take_value (variable: &style->border->border_top_width, value); |
493 | break; |
494 | case GTK_CSS_PROPERTY_BORDER_LEFT_STYLE: |
495 | gtk_css_take_value (variable: &style->border->border_left_style, value); |
496 | break; |
497 | case GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH: |
498 | gtk_css_take_value (variable: &style->border->border_left_width, value); |
499 | break; |
500 | case GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE: |
501 | gtk_css_take_value (variable: &style->border->border_bottom_style, value); |
502 | break; |
503 | case GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH: |
504 | gtk_css_take_value (variable: &style->border->border_bottom_width, value); |
505 | break; |
506 | case GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE: |
507 | gtk_css_take_value (variable: &style->border->border_right_style, value); |
508 | break; |
509 | case GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH: |
510 | gtk_css_take_value (variable: &style->border->border_right_width, value); |
511 | break; |
512 | case GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS: |
513 | gtk_css_take_value (variable: &style->border->border_top_left_radius, value); |
514 | break; |
515 | case GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS: |
516 | gtk_css_take_value (variable: &style->border->border_top_right_radius, value); |
517 | break; |
518 | case GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS: |
519 | gtk_css_take_value (variable: &style->border->border_bottom_right_radius, value); |
520 | break; |
521 | case GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS: |
522 | gtk_css_take_value (variable: &style->border->border_bottom_left_radius, value); |
523 | break; |
524 | case GTK_CSS_PROPERTY_OUTLINE_STYLE: |
525 | gtk_css_take_value (variable: &style->outline->outline_style, value); |
526 | break; |
527 | case GTK_CSS_PROPERTY_OUTLINE_WIDTH: |
528 | gtk_css_take_value (variable: &style->outline->outline_width, value); |
529 | break; |
530 | case GTK_CSS_PROPERTY_OUTLINE_OFFSET: |
531 | gtk_css_take_value (variable: &style->outline->outline_offset, value); |
532 | break; |
533 | case GTK_CSS_PROPERTY_BACKGROUND_CLIP: |
534 | gtk_css_take_value (variable: &style->background->background_clip, value); |
535 | break; |
536 | case GTK_CSS_PROPERTY_BACKGROUND_ORIGIN: |
537 | gtk_css_take_value (variable: &style->background->background_origin, value); |
538 | break; |
539 | case GTK_CSS_PROPERTY_BACKGROUND_SIZE: |
540 | gtk_css_take_value (variable: &style->background->background_size, value); |
541 | break; |
542 | case GTK_CSS_PROPERTY_BACKGROUND_POSITION: |
543 | gtk_css_take_value (variable: &style->background->background_position, value); |
544 | break; |
545 | case GTK_CSS_PROPERTY_BORDER_TOP_COLOR: |
546 | gtk_css_take_value (variable: &style->border->border_top_color, value); |
547 | break; |
548 | case GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR: |
549 | gtk_css_take_value (variable: &style->border->border_right_color, value); |
550 | break; |
551 | case GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR: |
552 | gtk_css_take_value (variable: &style->border->border_bottom_color, value); |
553 | break; |
554 | case GTK_CSS_PROPERTY_BORDER_LEFT_COLOR: |
555 | gtk_css_take_value (variable: &style->border->border_left_color, value); |
556 | break; |
557 | case GTK_CSS_PROPERTY_OUTLINE_COLOR: |
558 | gtk_css_take_value (variable: &style->outline->outline_color, value); |
559 | break; |
560 | case GTK_CSS_PROPERTY_BACKGROUND_REPEAT: |
561 | gtk_css_take_value (variable: &style->background->background_repeat, value); |
562 | break; |
563 | case GTK_CSS_PROPERTY_BACKGROUND_IMAGE: |
564 | gtk_css_take_value (variable: &style->background->background_image, value); |
565 | break; |
566 | case GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE: |
567 | gtk_css_take_value (variable: &style->background->background_blend_mode, value); |
568 | break; |
569 | case GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE: |
570 | gtk_css_take_value (variable: &style->border->border_image_source, value); |
571 | break; |
572 | case GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT: |
573 | gtk_css_take_value (variable: &style->border->border_image_repeat, value); |
574 | break; |
575 | case GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE: |
576 | gtk_css_take_value (variable: &style->border->border_image_slice, value); |
577 | break; |
578 | case GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH: |
579 | gtk_css_take_value (variable: &style->border->border_image_width, value); |
580 | break; |
581 | case GTK_CSS_PROPERTY_ICON_SOURCE: |
582 | gtk_css_take_value (variable: &style->other->icon_source, value); |
583 | break; |
584 | case GTK_CSS_PROPERTY_ICON_SIZE: |
585 | gtk_css_take_value (variable: &style->icon->icon_size, value); |
586 | break; |
587 | case GTK_CSS_PROPERTY_ICON_SHADOW: |
588 | gtk_css_take_value (variable: &style->icon->icon_shadow, value); |
589 | break; |
590 | case GTK_CSS_PROPERTY_ICON_STYLE: |
591 | gtk_css_take_value (variable: &style->icon->icon_style, value); |
592 | break; |
593 | case GTK_CSS_PROPERTY_ICON_TRANSFORM: |
594 | gtk_css_take_value (variable: &style->other->icon_transform, value); |
595 | break; |
596 | case GTK_CSS_PROPERTY_ICON_FILTER: |
597 | gtk_css_take_value (variable: &style->other->icon_filter, value); |
598 | break; |
599 | case GTK_CSS_PROPERTY_BORDER_SPACING: |
600 | gtk_css_take_value (variable: &style->size->border_spacing, value); |
601 | break; |
602 | case GTK_CSS_PROPERTY_TRANSFORM: |
603 | gtk_css_take_value (variable: &style->other->transform, value); |
604 | break; |
605 | case GTK_CSS_PROPERTY_TRANSFORM_ORIGIN: |
606 | gtk_css_take_value (variable: &style->other->transform_origin, value); |
607 | break; |
608 | case GTK_CSS_PROPERTY_MIN_WIDTH: |
609 | gtk_css_take_value (variable: &style->size->min_width, value); |
610 | break; |
611 | case GTK_CSS_PROPERTY_MIN_HEIGHT: |
612 | gtk_css_take_value (variable: &style->size->min_height, value); |
613 | break; |
614 | case GTK_CSS_PROPERTY_TRANSITION_PROPERTY: |
615 | gtk_css_take_value (variable: &style->transition->transition_property, value); |
616 | break; |
617 | case GTK_CSS_PROPERTY_TRANSITION_DURATION: |
618 | gtk_css_take_value (variable: &style->transition->transition_duration, value); |
619 | break; |
620 | case GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION: |
621 | gtk_css_take_value (variable: &style->transition->transition_timing_function, value); |
622 | break; |
623 | case GTK_CSS_PROPERTY_TRANSITION_DELAY: |
624 | gtk_css_take_value (variable: &style->transition->transition_delay, value); |
625 | break; |
626 | case GTK_CSS_PROPERTY_ANIMATION_NAME: |
627 | gtk_css_take_value (variable: &style->animation->animation_name, value); |
628 | break; |
629 | case GTK_CSS_PROPERTY_ANIMATION_DURATION: |
630 | gtk_css_take_value (variable: &style->animation->animation_duration, value); |
631 | break; |
632 | case GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION: |
633 | gtk_css_take_value (variable: &style->animation->animation_timing_function, value); |
634 | break; |
635 | case GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT: |
636 | gtk_css_take_value (variable: &style->animation->animation_iteration_count, value); |
637 | break; |
638 | case GTK_CSS_PROPERTY_ANIMATION_DIRECTION: |
639 | gtk_css_take_value (variable: &style->animation->animation_direction, value); |
640 | break; |
641 | case GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE: |
642 | gtk_css_take_value (variable: &style->animation->animation_play_state, value); |
643 | break; |
644 | case GTK_CSS_PROPERTY_ANIMATION_DELAY: |
645 | gtk_css_take_value (variable: &style->animation->animation_delay, value); |
646 | break; |
647 | case GTK_CSS_PROPERTY_ANIMATION_FILL_MODE: |
648 | gtk_css_take_value (variable: &style->animation->animation_fill_mode, value); |
649 | break; |
650 | case GTK_CSS_PROPERTY_OPACITY: |
651 | gtk_css_take_value (variable: &style->other->opacity, value); |
652 | break; |
653 | case GTK_CSS_PROPERTY_FILTER: |
654 | gtk_css_take_value (variable: &style->other->filter, value); |
655 | break; |
656 | case GTK_CSS_PROPERTY_CARET_COLOR: |
657 | gtk_css_take_value (variable: &style->font->caret_color, value); |
658 | break; |
659 | case GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR: |
660 | gtk_css_take_value (variable: &style->font->secondary_caret_color, value); |
661 | break; |
662 | case GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS: |
663 | gtk_css_take_value (variable: &style->font->font_feature_settings, value); |
664 | break; |
665 | case GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS: |
666 | gtk_css_take_value (variable: &style->font->font_variation_settings, value); |
667 | break; |
668 | |
669 | default: |
670 | g_assert_not_reached (); |
671 | break; |
672 | } |
673 | |
674 | if (sstyle->sections && sstyle->sections->len > id && g_ptr_array_index (sstyle->sections, id)) |
675 | { |
676 | gtk_css_section_unref (g_ptr_array_index (sstyle->sections, id)); |
677 | g_ptr_array_index (sstyle->sections, id) = NULL; |
678 | } |
679 | |
680 | if (section) |
681 | { |
682 | if (sstyle->sections == NULL) |
683 | sstyle->sections = g_ptr_array_new_with_free_func (element_free_func: maybe_unref_section); |
684 | if (sstyle->sections->len <= id) |
685 | g_ptr_array_set_size (array: sstyle->sections, length: id + 1); |
686 | g_ptr_array_index (sstyle->sections, id) = gtk_css_section_ref (section); |
687 | } |
688 | } |
689 | |
690 | static GtkCssStyle *default_style; |
691 | |
692 | static void |
693 | clear_default_style (gpointer data) |
694 | { |
695 | g_set_object (&default_style, NULL); |
696 | } |
697 | |
698 | GtkCssStyle * |
699 | gtk_css_static_style_get_default (void) |
700 | { |
701 | /* FIXME: This really depends on the screen, but we don't have |
702 | * a screen at hand when we call this function, and in practice, |
703 | * the default style is always replaced by something else |
704 | * before we use it. |
705 | */ |
706 | if (default_style == NULL) |
707 | { |
708 | GtkCountingBloomFilter filter = GTK_COUNTING_BLOOM_FILTER_INIT; |
709 | GtkSettings *settings; |
710 | |
711 | settings = gtk_settings_get_default (); |
712 | default_style = gtk_css_static_style_new_compute (GTK_STYLE_PROVIDER (settings), |
713 | filter: &filter, |
714 | NULL, |
715 | change: 0); |
716 | g_object_set_data_full (G_OBJECT (settings), I_("gtk-default-style" ), |
717 | data: default_style, destroy: clear_default_style); |
718 | } |
719 | |
720 | return default_style; |
721 | } |
722 | |
723 | static GtkCssValues * |
724 | gtk_css_core_create_initial_values (void) |
725 | { |
726 | return NULL; |
727 | |
728 | } |
729 | static GtkCssValues * |
730 | gtk_css_background_create_initial_values (void) |
731 | { |
732 | GtkCssBackgroundValues *values; |
733 | |
734 | values = (GtkCssBackgroundValues *)gtk_css_values_new (type: GTK_CSS_BACKGROUND_INITIAL_VALUES); |
735 | |
736 | values->background_color = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BACKGROUND_COLOR, NULL, NULL, NULL); |
737 | values->box_shadow = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BOX_SHADOW, NULL, NULL, NULL); |
738 | values->background_clip = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BACKGROUND_CLIP, NULL, NULL, NULL); |
739 | values->background_origin = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BACKGROUND_ORIGIN, NULL, NULL, NULL); |
740 | values->background_size = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BACKGROUND_SIZE, NULL, NULL, NULL); |
741 | values->background_position = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BACKGROUND_POSITION, NULL, NULL, NULL); |
742 | values->background_repeat = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BACKGROUND_REPEAT, NULL, NULL, NULL); |
743 | values->background_image = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BACKGROUND_IMAGE, NULL, NULL, NULL); |
744 | values->background_blend_mode = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE, NULL, NULL, NULL); |
745 | |
746 | return (GtkCssValues *)values; |
747 | } |
748 | |
749 | static GtkCssValues * |
750 | gtk_css_border_create_initial_values (void) |
751 | { |
752 | GtkCssBorderValues *values; |
753 | |
754 | values = (GtkCssBorderValues *)gtk_css_values_new (type: GTK_CSS_BORDER_INITIAL_VALUES); |
755 | |
756 | values->border_top_style = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_TOP_STYLE, NULL, NULL, NULL); |
757 | values->border_top_width = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_TOP_WIDTH, NULL, NULL, NULL); |
758 | values->border_left_style = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_LEFT_STYLE, NULL, NULL, NULL); |
759 | values->border_left_width = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH, NULL, NULL, NULL); |
760 | values->border_bottom_style = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE, NULL, NULL, NULL); |
761 | values->border_bottom_width = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH, NULL, NULL, NULL); |
762 | values->border_right_style = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE, NULL, NULL, NULL); |
763 | values->border_right_width = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH, NULL, NULL, NULL); |
764 | values->border_top_left_radius = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS, NULL, NULL, NULL); |
765 | values->border_top_right_radius = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS, NULL, NULL, NULL); |
766 | values->border_bottom_left_radius = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS, NULL, NULL, NULL); |
767 | values->border_bottom_right_radius = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS, NULL, NULL, NULL); |
768 | values->border_top_color = NULL; |
769 | values->border_right_color = NULL; |
770 | values->border_bottom_color = NULL; |
771 | values->border_left_color = NULL; |
772 | values->border_image_source = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE, NULL, NULL, NULL); |
773 | values->border_image_repeat = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT, NULL, NULL, NULL); |
774 | values->border_image_slice = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE, NULL, NULL, NULL); |
775 | values->border_image_width = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH, NULL, NULL, NULL); |
776 | |
777 | return (GtkCssValues *)values; |
778 | } |
779 | |
780 | static GtkCssValues * |
781 | gtk_css_outline_create_initial_values (void) |
782 | { |
783 | GtkCssOutlineValues *values; |
784 | |
785 | values = (GtkCssOutlineValues *)gtk_css_values_new (type: GTK_CSS_OUTLINE_INITIAL_VALUES); |
786 | |
787 | values->outline_style = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_OUTLINE_STYLE, NULL, NULL, NULL); |
788 | values->outline_width = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_OUTLINE_WIDTH, NULL, NULL, NULL); |
789 | values->outline_offset = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_OUTLINE_OFFSET, NULL, NULL, NULL); |
790 | values->outline_color = NULL; |
791 | |
792 | return (GtkCssValues *)values; |
793 | } |
794 | |
795 | static GtkCssValues * |
796 | gtk_css_icon_create_initial_values (void) |
797 | { |
798 | return NULL; |
799 | } |
800 | |
801 | static GtkCssValues * |
802 | gtk_css_font_create_initial_values (void) |
803 | { |
804 | return NULL; |
805 | } |
806 | |
807 | static GtkCssValues * |
808 | gtk_css_font_variant_create_initial_values (void) |
809 | { |
810 | GtkCssFontVariantValues *values; |
811 | |
812 | values = (GtkCssFontVariantValues *)gtk_css_values_new (type: GTK_CSS_FONT_VARIANT_INITIAL_VALUES); |
813 | |
814 | values->text_decoration_line = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TEXT_DECORATION_LINE, NULL, NULL, NULL); |
815 | values->text_decoration_color = NULL; |
816 | values->text_decoration_style = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE, NULL, NULL, NULL); |
817 | values->text_transform = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TEXT_TRANSFORM, NULL, NULL, NULL); |
818 | values->font_kerning = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_FONT_KERNING, NULL, NULL, NULL); |
819 | values->font_variant_ligatures = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES, NULL, NULL, NULL); |
820 | values->font_variant_position = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_FONT_VARIANT_POSITION, NULL, NULL, NULL); |
821 | values->font_variant_caps = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_FONT_VARIANT_CAPS, NULL, NULL, NULL); |
822 | values->font_variant_numeric = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC, NULL, NULL, NULL); |
823 | values->font_variant_alternates = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES, NULL, NULL, NULL); |
824 | values->font_variant_east_asian = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN, NULL, NULL, NULL); |
825 | |
826 | return (GtkCssValues *)values; |
827 | } |
828 | |
829 | static GtkCssValues * |
830 | gtk_css_animation_create_initial_values (void) |
831 | { |
832 | GtkCssAnimationValues *values; |
833 | |
834 | values = (GtkCssAnimationValues *)gtk_css_values_new (type: GTK_CSS_ANIMATION_INITIAL_VALUES); |
835 | |
836 | values->animation_name = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ANIMATION_NAME, NULL, NULL, NULL); |
837 | values->animation_duration = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ANIMATION_DURATION, NULL, NULL, NULL); |
838 | values->animation_timing_function = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION, NULL, NULL, NULL); |
839 | values->animation_iteration_count = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT, NULL, NULL, NULL); |
840 | values->animation_direction = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ANIMATION_DIRECTION, NULL, NULL, NULL); |
841 | values->animation_play_state = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE, NULL, NULL, NULL); |
842 | values->animation_delay = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ANIMATION_DELAY, NULL, NULL, NULL); |
843 | values->animation_fill_mode = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ANIMATION_FILL_MODE, NULL, NULL, NULL); |
844 | |
845 | return (GtkCssValues *)values; |
846 | } |
847 | |
848 | static GtkCssValues * |
849 | gtk_css_transition_create_initial_values (void) |
850 | { |
851 | GtkCssTransitionValues *values; |
852 | |
853 | values = (GtkCssTransitionValues *)gtk_css_values_new (type: GTK_CSS_TRANSITION_INITIAL_VALUES); |
854 | |
855 | values->transition_property = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TRANSITION_PROPERTY, NULL, NULL, NULL); |
856 | values->transition_duration = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TRANSITION_DURATION, NULL, NULL, NULL); |
857 | values->transition_timing_function = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION, NULL, NULL, NULL); |
858 | values->transition_delay = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TRANSITION_DELAY, NULL, NULL, NULL); |
859 | |
860 | return (GtkCssValues *)values; |
861 | } |
862 | |
863 | static GtkCssValues * |
864 | gtk_css_size_create_initial_values (void) |
865 | { |
866 | GtkCssSizeValues *values; |
867 | |
868 | values = (GtkCssSizeValues *)gtk_css_values_new (type: GTK_CSS_SIZE_INITIAL_VALUES); |
869 | |
870 | values->margin_top = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_MARGIN_TOP, NULL, NULL, NULL); |
871 | values->margin_left = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_MARGIN_LEFT, NULL, NULL, NULL); |
872 | values->margin_bottom = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_MARGIN_BOTTOM, NULL, NULL, NULL); |
873 | values->margin_right = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_MARGIN_RIGHT, NULL, NULL, NULL); |
874 | values->padding_top = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_PADDING_TOP, NULL, NULL, NULL); |
875 | values->padding_left = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_PADDING_LEFT, NULL, NULL, NULL); |
876 | values->padding_bottom = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_PADDING_BOTTOM, NULL, NULL, NULL); |
877 | values->padding_right = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_PADDING_RIGHT, NULL, NULL, NULL); |
878 | values->border_spacing = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_BORDER_SPACING, NULL, NULL, NULL); |
879 | values->min_width = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_MIN_WIDTH, NULL, NULL, NULL); |
880 | values->min_height = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_MIN_HEIGHT, NULL, NULL, NULL); |
881 | |
882 | return (GtkCssValues *)values; |
883 | } |
884 | |
885 | static GtkCssValues * |
886 | gtk_css_other_create_initial_values (void) |
887 | { |
888 | GtkCssOtherValues *values; |
889 | |
890 | values = (GtkCssOtherValues *)gtk_css_values_new (type: GTK_CSS_OTHER_INITIAL_VALUES); |
891 | |
892 | values->icon_source = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ICON_SOURCE, NULL, NULL, NULL); |
893 | values->icon_transform = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ICON_TRANSFORM, NULL, NULL, NULL); |
894 | values->icon_filter = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_ICON_FILTER, NULL, NULL, NULL); |
895 | values->transform = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TRANSFORM, NULL, NULL, NULL); |
896 | values->transform_origin = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_TRANSFORM_ORIGIN, NULL, NULL, NULL); |
897 | values->opacity = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_OPACITY, NULL, NULL, NULL); |
898 | values->filter = _gtk_css_initial_value_new_compute (property_id: GTK_CSS_PROPERTY_FILTER, NULL, NULL, NULL); |
899 | |
900 | return (GtkCssValues *)values; |
901 | } |
902 | |
903 | static void |
904 | gtk_css_lookup_resolve (GtkCssLookup *lookup, |
905 | GtkStyleProvider *provider, |
906 | GtkCssStaticStyle *sstyle, |
907 | GtkCssStyle *parent_style) |
908 | { |
909 | GtkCssStyle *style = (GtkCssStyle *)sstyle; |
910 | |
911 | gtk_internal_return_if_fail (lookup != NULL); |
912 | gtk_internal_return_if_fail (GTK_IS_STYLE_PROVIDER (provider)); |
913 | gtk_internal_return_if_fail (GTK_IS_CSS_STATIC_STYLE (style)); |
914 | gtk_internal_return_if_fail (parent_style == NULL || GTK_IS_CSS_STYLE (parent_style)); |
915 | |
916 | if (_gtk_bitmask_is_empty (mask: _gtk_css_lookup_get_set_values (lookup))) |
917 | { |
918 | style->background = (GtkCssBackgroundValues *)gtk_css_values_ref (values: gtk_css_background_initial_values); |
919 | style->border = (GtkCssBorderValues *)gtk_css_values_ref (values: gtk_css_border_initial_values); |
920 | style->outline = (GtkCssOutlineValues *)gtk_css_values_ref (values: gtk_css_outline_initial_values); |
921 | style->font_variant = (GtkCssFontVariantValues *)gtk_css_values_ref (values: gtk_css_font_variant_initial_values); |
922 | style->animation = (GtkCssAnimationValues *)gtk_css_values_ref (values: gtk_css_animation_initial_values); |
923 | style->transition = (GtkCssTransitionValues *)gtk_css_values_ref (values: gtk_css_transition_initial_values); |
924 | style->size = (GtkCssSizeValues *)gtk_css_values_ref (values: gtk_css_size_initial_values); |
925 | style->other = (GtkCssOtherValues *)gtk_css_values_ref (values: gtk_css_other_initial_values); |
926 | |
927 | if (parent_style) |
928 | { |
929 | style->core = (GtkCssCoreValues *)gtk_css_values_ref (values: (GtkCssValues *)parent_style->core); |
930 | style->icon = (GtkCssIconValues *)gtk_css_values_ref (values: (GtkCssValues *)parent_style->icon); |
931 | style->font = (GtkCssFontValues *)gtk_css_values_ref (values: (GtkCssValues *)parent_style->font); |
932 | } |
933 | else |
934 | { |
935 | gtk_css_core_values_new_compute (sstyle, provider, parent_style, lookup); |
936 | gtk_css_icon_values_new_compute (sstyle, provider, parent_style, lookup); |
937 | gtk_css_font_values_new_compute (sstyle, provider, parent_style, lookup); |
938 | } |
939 | |
940 | return; |
941 | } |
942 | |
943 | if (parent_style && gtk_css_core_values_unset (lookup)) |
944 | style->core = (GtkCssCoreValues *)gtk_css_values_ref (values: (GtkCssValues *)parent_style->core); |
945 | else |
946 | gtk_css_core_values_new_compute (sstyle, provider, parent_style, lookup); |
947 | |
948 | if (gtk_css_background_values_unset (lookup)) |
949 | style->background = (GtkCssBackgroundValues *)gtk_css_values_ref (values: gtk_css_background_initial_values); |
950 | else |
951 | gtk_css_background_values_new_compute (sstyle, provider, parent_style, lookup); |
952 | |
953 | if (gtk_css_border_values_unset (lookup)) |
954 | style->border = (GtkCssBorderValues *)gtk_css_values_ref (values: gtk_css_border_initial_values); |
955 | else |
956 | gtk_css_border_values_new_compute (sstyle, provider, parent_style, lookup); |
957 | |
958 | if (parent_style && gtk_css_icon_values_unset (lookup)) |
959 | style->icon = (GtkCssIconValues *)gtk_css_values_ref (values: (GtkCssValues *)parent_style->icon); |
960 | else |
961 | gtk_css_icon_values_new_compute (sstyle, provider, parent_style, lookup); |
962 | |
963 | if (gtk_css_outline_values_unset (lookup)) |
964 | style->outline = (GtkCssOutlineValues *)gtk_css_values_ref (values: gtk_css_outline_initial_values); |
965 | else |
966 | gtk_css_outline_values_new_compute (sstyle, provider, parent_style, lookup); |
967 | |
968 | if (parent_style && gtk_css_font_values_unset (lookup)) |
969 | style->font = (GtkCssFontValues *)gtk_css_values_ref (values: (GtkCssValues *)parent_style->font); |
970 | else |
971 | gtk_css_font_values_new_compute (sstyle, provider, parent_style, lookup); |
972 | |
973 | if (gtk_css_font_variant_values_unset (lookup)) |
974 | style->font_variant = (GtkCssFontVariantValues *)gtk_css_values_ref (values: gtk_css_font_variant_initial_values); |
975 | else |
976 | gtk_css_font_variant_values_new_compute (sstyle, provider, parent_style, lookup); |
977 | |
978 | if (gtk_css_animation_values_unset (lookup)) |
979 | style->animation = (GtkCssAnimationValues *)gtk_css_values_ref (values: gtk_css_animation_initial_values); |
980 | else |
981 | gtk_css_animation_values_new_compute (sstyle, provider, parent_style, lookup); |
982 | |
983 | if (gtk_css_transition_values_unset (lookup)) |
984 | style->transition = (GtkCssTransitionValues *)gtk_css_values_ref (values: gtk_css_transition_initial_values); |
985 | else |
986 | gtk_css_transition_values_new_compute (sstyle, provider, parent_style, lookup); |
987 | |
988 | if (gtk_css_size_values_unset (lookup)) |
989 | style->size = (GtkCssSizeValues *)gtk_css_values_ref (values: gtk_css_size_initial_values); |
990 | else |
991 | gtk_css_size_values_new_compute (sstyle, provider, parent_style, lookup); |
992 | |
993 | if (gtk_css_other_values_unset (lookup)) |
994 | style->other = (GtkCssOtherValues *)gtk_css_values_ref (values: gtk_css_other_initial_values); |
995 | else |
996 | gtk_css_other_values_new_compute (sstyle, provider, parent_style, lookup); |
997 | } |
998 | |
999 | GtkCssStyle * |
1000 | gtk_css_static_style_new_compute (GtkStyleProvider *provider, |
1001 | const GtkCountingBloomFilter *filter, |
1002 | GtkCssNode *node, |
1003 | GtkCssChange change) |
1004 | { |
1005 | GtkCssStaticStyle *result; |
1006 | GtkCssLookup lookup; |
1007 | GtkCssNode *parent; |
1008 | |
1009 | _gtk_css_lookup_init (lookup: &lookup); |
1010 | |
1011 | if (node) |
1012 | gtk_style_provider_lookup (provider, |
1013 | filter, |
1014 | node, |
1015 | lookup: &lookup, |
1016 | out_change: change == 0 ? &change : NULL); |
1017 | |
1018 | result = g_object_new (GTK_TYPE_CSS_STATIC_STYLE, NULL); |
1019 | |
1020 | result->change = change; |
1021 | |
1022 | if (node) |
1023 | parent = gtk_css_node_get_parent (cssnode: node); |
1024 | else |
1025 | parent = NULL; |
1026 | |
1027 | gtk_css_lookup_resolve (lookup: &lookup, |
1028 | provider, |
1029 | sstyle: result, |
1030 | parent_style: parent ? gtk_css_node_get_style (cssnode: parent) : NULL); |
1031 | |
1032 | _gtk_css_lookup_destroy (lookup: &lookup); |
1033 | |
1034 | return GTK_CSS_STYLE (result); |
1035 | } |
1036 | |
1037 | G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_TOP_STYLE == GTK_CSS_PROPERTY_BORDER_TOP_WIDTH - 1); |
1038 | G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE == GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH - 1); |
1039 | G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE == GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH - 1); |
1040 | G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_LEFT_STYLE == GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH - 1); |
1041 | G_STATIC_ASSERT (GTK_CSS_PROPERTY_OUTLINE_STYLE == GTK_CSS_PROPERTY_OUTLINE_WIDTH - 1); |
1042 | |
1043 | static void |
1044 | gtk_css_static_style_compute_value (GtkCssStaticStyle *style, |
1045 | GtkStyleProvider *provider, |
1046 | GtkCssStyle *parent_style, |
1047 | guint id, |
1048 | GtkCssValue *specified, |
1049 | GtkCssSection *section) |
1050 | { |
1051 | GtkCssValue *value; |
1052 | GtkBorderStyle border_style; |
1053 | |
1054 | gtk_internal_return_if_fail (id < GTK_CSS_PROPERTY_N_PROPERTIES); |
1055 | |
1056 | /* special case according to http://dev.w3.org/csswg/css-backgrounds/#the-border-width */ |
1057 | switch (id) |
1058 | { |
1059 | /* We have them ordered in gtkcssstylepropertyimpl.c accordingly, so the |
1060 | * border styles are already computed when we compute the border widths. |
1061 | * |
1062 | * Note that we rely on ..._STYLE == ..._WIDTH - 1 here. |
1063 | */ |
1064 | case GTK_CSS_PROPERTY_BORDER_TOP_WIDTH: |
1065 | case GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH: |
1066 | case GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH: |
1067 | case GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH: |
1068 | case GTK_CSS_PROPERTY_OUTLINE_WIDTH: |
1069 | border_style = _gtk_css_border_style_value_get (value: gtk_css_style_get_value (style: (GtkCssStyle *)style, id: id - 1)); |
1070 | if (border_style == GTK_BORDER_STYLE_NONE || border_style == GTK_BORDER_STYLE_HIDDEN) |
1071 | { |
1072 | gtk_css_static_style_set_value (sstyle: style, id, value: gtk_css_dimension_value_new (value: 0, unit: GTK_CSS_NUMBER), section); |
1073 | return; |
1074 | } |
1075 | break; |
1076 | |
1077 | default: |
1078 | /* Go ahead */ |
1079 | break; |
1080 | } |
1081 | |
1082 | /* http://www.w3.org/TR/css3-cascade/#cascade |
1083 | * Then, for every element, the value for each property can be found |
1084 | * by following this pseudo-algorithm: |
1085 | * 1) Identify all declarations that apply to the element |
1086 | */ |
1087 | if (specified) |
1088 | { |
1089 | value = _gtk_css_value_compute (value: specified, property_id: id, provider, style: (GtkCssStyle *)style, parent_style); |
1090 | } |
1091 | else if (parent_style && _gtk_css_style_property_is_inherit (property: _gtk_css_style_property_lookup_by_id (id))) |
1092 | { |
1093 | /* Just take the style from the parent */ |
1094 | value = _gtk_css_value_ref (value: gtk_css_style_get_value (style: parent_style, id)); |
1095 | } |
1096 | else |
1097 | { |
1098 | value = _gtk_css_initial_value_new_compute (property_id: id, provider, style: (GtkCssStyle *)style, parent_style); |
1099 | } |
1100 | |
1101 | gtk_css_static_style_set_value (sstyle: style, id, value, section); |
1102 | } |
1103 | |
1104 | GtkCssChange |
1105 | gtk_css_static_style_get_change (GtkCssStaticStyle *style) |
1106 | { |
1107 | g_return_val_if_fail (GTK_IS_CSS_STATIC_STYLE (style), GTK_CSS_CHANGE_ANY); |
1108 | |
1109 | return style->change; |
1110 | } |
1111 | |