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
42static 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
49static 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
56static 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
68static 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
91static const int icon_props[] = {
92 GTK_CSS_PROPERTY_ICON_SIZE,
93 GTK_CSS_PROPERTY_ICON_SHADOW,
94 GTK_CSS_PROPERTY_ICON_STYLE,
95};
96
97static 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
104static 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};
117static 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
131static 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
142static 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
149static 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
163static 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) \
176void \
177gtk_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\
198static inline void \
199gtk_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} \
220static GtkBitmask * gtk_css_ ## NAME ## _values_mask; \
221static GtkCssValues * gtk_css_ ## NAME ## _initial_values; \
222\
223static GtkCssValues * gtk_css_ ## NAME ## _create_initial_values (void); \
224\
225static void \
226gtk_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\
239static inline gboolean \
240gtk_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
246DEFINE_VALUES (CORE, Core, core)
247DEFINE_VALUES (BACKGROUND, Background, background)
248DEFINE_VALUES (BORDER, Border, border)
249DEFINE_VALUES (ICON, Icon, icon)
250DEFINE_VALUES (OUTLINE, Outline, outline)
251DEFINE_VALUES (FONT, Font, font)
252DEFINE_VALUES (FONT_VARIANT, FontVariant, font_variant)
253DEFINE_VALUES (ANIMATION, Animation, animation)
254DEFINE_VALUES (TRANSITION, Transition, transition)
255DEFINE_VALUES (SIZE, Size, size)
256DEFINE_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 */
270static void
271verify_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
300G_DEFINE_TYPE (GtkCssStaticStyle, gtk_css_static_style, GTK_TYPE_CSS_STYLE)
301
302static GtkCssSection *
303gtk_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
315static void
316gtk_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
329static GtkCssStaticStyle *
330gtk_css_static_style_get_static_style (GtkCssStyle *style)
331{
332 return (GtkCssStaticStyle *)style;
333}
334
335static void
336gtk_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
361static void
362gtk_css_static_style_init (GtkCssStaticStyle *style)
363{
364}
365
366static void
367maybe_unref_section (gpointer section)
368{
369 if (section)
370 gtk_css_section_unref (section);
371}
372
373static inline void
374gtk_css_take_value (GtkCssValue **variable,
375 GtkCssValue *value)
376{
377 if (*variable)
378 gtk_css_value_unref (value: *variable);
379 *variable = value;
380}
381
382static void
383gtk_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
690static GtkCssStyle *default_style;
691
692static void
693clear_default_style (gpointer data)
694{
695 g_set_object (&default_style, NULL);
696}
697
698GtkCssStyle *
699gtk_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
723static GtkCssValues *
724gtk_css_core_create_initial_values (void)
725{
726 return NULL;
727
728}
729static GtkCssValues *
730gtk_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
749static GtkCssValues *
750gtk_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
780static GtkCssValues *
781gtk_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
795static GtkCssValues *
796gtk_css_icon_create_initial_values (void)
797{
798 return NULL;
799}
800
801static GtkCssValues *
802gtk_css_font_create_initial_values (void)
803{
804 return NULL;
805}
806
807static GtkCssValues *
808gtk_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
829static GtkCssValues *
830gtk_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
848static GtkCssValues *
849gtk_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
863static GtkCssValues *
864gtk_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
885static GtkCssValues *
886gtk_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
903static void
904gtk_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
999GtkCssStyle *
1000gtk_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
1037G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_TOP_STYLE == GTK_CSS_PROPERTY_BORDER_TOP_WIDTH - 1);
1038G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE == GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH - 1);
1039G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE == GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH - 1);
1040G_STATIC_ASSERT (GTK_CSS_PROPERTY_BORDER_LEFT_STYLE == GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH - 1);
1041G_STATIC_ASSERT (GTK_CSS_PROPERTY_OUTLINE_STYLE == GTK_CSS_PROPERTY_OUTLINE_WIDTH - 1);
1042
1043static void
1044gtk_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
1104GtkCssChange
1105gtk_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

source code of gtk/gtk/gtkcssstaticstyle.c