1/* GTK - The GIMP Toolkit
2 * Copyright (C) 2011 Benjamin Otte <otte@gnome.org>
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef __GTK_CSS_TYPES_PRIVATE_H__
19#define __GTK_CSS_TYPES_PRIVATE_H__
20
21#include <glib-object.h>
22#include <gsk/gsk.h>
23
24#include <gtk/gtkenums.h>
25
26G_BEGIN_DECLS
27
28typedef struct _GtkCssNode GtkCssNode;
29typedef struct _GtkCssNodeDeclaration GtkCssNodeDeclaration;
30typedef struct _GtkCssStyle GtkCssStyle;
31typedef struct _GtkCssStaticStyle GtkCssStaticStyle;
32
33#define GTK_CSS_CHANGE_CLASS (1ULL << 0)
34#define GTK_CSS_CHANGE_NAME (1ULL << 1)
35#define GTK_CSS_CHANGE_ID (1ULL << 2)
36#define GTK_CSS_CHANGE_FIRST_CHILD (1ULL << 3)
37#define GTK_CSS_CHANGE_LAST_CHILD (1ULL << 4)
38#define GTK_CSS_CHANGE_NTH_CHILD (1ULL << 5)
39#define GTK_CSS_CHANGE_NTH_LAST_CHILD (1ULL << 6)
40#define GTK_CSS_CHANGE_STATE (1ULL << 7)
41#define GTK_CSS_CHANGE_HOVER (1ULL << 8)
42#define GTK_CSS_CHANGE_DISABLED (1ULL << 9)
43#define GTK_CSS_CHANGE_BACKDROP (1ULL << 10)
44#define GTK_CSS_CHANGE_SELECTED (1ULL << 11)
45
46#define GTK_CSS_CHANGE_SIBLING_SHIFT 12
47
48#define GTK_CSS_CHANGE_SIBLING_CLASS (1ULL << 12)
49#define GTK_CSS_CHANGE_SIBLING_NAME (1ULL << 13)
50#define GTK_CSS_CHANGE_SIBLING_ID (1ULL << 14)
51#define GTK_CSS_CHANGE_SIBLING_FIRST_CHILD (1ULL << 15)
52#define GTK_CSS_CHANGE_SIBLING_LAST_CHILD (1ULL << 16)
53#define GTK_CSS_CHANGE_SIBLING_NTH_CHILD (1ULL << 17)
54#define GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD (1ULL << 18)
55#define GTK_CSS_CHANGE_SIBLING_STATE (1ULL << 19)
56#define GTK_CSS_CHANGE_SIBLING_HOVER (1ULL << 20)
57#define GTK_CSS_CHANGE_SIBLING_DISABLED (1ULL << 21)
58#define GTK_CSS_CHANGE_SIBLING_BACKDROP (1ULL << 22)
59#define GTK_CSS_CHANGE_SIBLING_SELECTED (1ULL << 23)
60
61#define GTK_CSS_CHANGE_PARENT_SHIFT (GTK_CSS_CHANGE_SIBLING_SHIFT + GTK_CSS_CHANGE_SIBLING_SHIFT)
62
63#define GTK_CSS_CHANGE_PARENT_CLASS (1ULL << 24)
64#define GTK_CSS_CHANGE_PARENT_NAME (1ULL << 25)
65#define GTK_CSS_CHANGE_PARENT_ID (1ULL << 26)
66#define GTK_CSS_CHANGE_PARENT_FIRST_CHILD (1ULL << 27)
67#define GTK_CSS_CHANGE_PARENT_LAST_CHILD (1ULL << 28)
68#define GTK_CSS_CHANGE_PARENT_NTH_CHILD (1ULL << 29)
69#define GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD (1ULL << 30)
70#define GTK_CSS_CHANGE_PARENT_STATE (1ULL << 31)
71#define GTK_CSS_CHANGE_PARENT_HOVER (1ULL << 32)
72#define GTK_CSS_CHANGE_PARENT_DISABLED (1ULL << 33)
73#define GTK_CSS_CHANGE_PARENT_BACKDROP (1ULL << 34)
74#define GTK_CSS_CHANGE_PARENT_SELECTED (1ULL << 35)
75
76#define GTK_CSS_CHANGE_PARENT_SIBLING_SHIFT (GTK_CSS_CHANGE_PARENT_SHIFT + GTK_CSS_CHANGE_SIBLING_SHIFT)
77
78#define GTK_CSS_CHANGE_PARENT_SIBLING_CLASS (1ULL << 36)
79#define GTK_CSS_CHANGE_PARENT_SIBLING_NAME (1ULL << 37)
80#define GTK_CSS_CHANGE_PARENT_SIBLING_ID (1ULL << 38)
81#define GTK_CSS_CHANGE_PARENT_SIBLING_FIRST_CHILD (1ULL << 39)
82#define GTK_CSS_CHANGE_PARENT_SIBLING_LAST_CHILD (1ULL << 40)
83#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD (1ULL << 41)
84#define GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD (1ULL << 42)
85#define GTK_CSS_CHANGE_PARENT_SIBLING_STATE (1ULL << 43)
86#define GTK_CSS_CHANGE_PARENT_SIBLING_HOVER (1ULL << 44)
87#define GTK_CSS_CHANGE_PARENT_SIBLING_DISABLED (1ULL << 45)
88#define GTK_CSS_CHANGE_PARENT_SIBLING_BACKDROP (1ULL << 46)
89#define GTK_CSS_CHANGE_PARENT_SIBLING_SELECTED (1ULL << 47)
90
91/* add more */
92#define GTK_CSS_CHANGE_SOURCE (1ULL << 48)
93#define GTK_CSS_CHANGE_PARENT_STYLE (1ULL << 49)
94#define GTK_CSS_CHANGE_TIMESTAMP (1ULL << 50)
95#define GTK_CSS_CHANGE_ANIMATIONS (1ULL << 51)
96
97#define GTK_CSS_CHANGE_RESERVED_BIT (1ULL << 62)
98
99typedef guint64 GtkCssChange;
100
101#define GTK_CSS_CHANGE_POSITION (GTK_CSS_CHANGE_FIRST_CHILD | \
102 GTK_CSS_CHANGE_LAST_CHILD | \
103 GTK_CSS_CHANGE_NTH_CHILD | \
104 GTK_CSS_CHANGE_NTH_LAST_CHILD)
105#define GTK_CSS_CHANGE_SIBLING_POSITION (GTK_CSS_CHANGE_POSITION << GTK_CSS_CHANGE_SIBLING_SHIFT)
106
107#define GTK_CSS_CHANGE_ANY_SELF (GTK_CSS_CHANGE_CLASS | \
108 GTK_CSS_CHANGE_NAME | \
109 GTK_CSS_CHANGE_ID | \
110 GTK_CSS_CHANGE_POSITION | \
111 GTK_CSS_CHANGE_STATE | \
112 GTK_CSS_CHANGE_DISABLED | \
113 GTK_CSS_CHANGE_BACKDROP | \
114 GTK_CSS_CHANGE_SELECTED | \
115 GTK_CSS_CHANGE_HOVER)
116#define GTK_CSS_CHANGE_ANY_SIBLING (GTK_CSS_CHANGE_ANY_SELF << GTK_CSS_CHANGE_SIBLING_SHIFT)
117#define GTK_CSS_CHANGE_ANY_PARENT (GTK_CSS_CHANGE_ANY_SELF << GTK_CSS_CHANGE_PARENT_SHIFT)
118#define GTK_CSS_CHANGE_ANY_PARENT_SIBLING (GTK_CSS_CHANGE_ANY_SELF << GTK_CSS_CHANGE_PARENT_SIBLING_SHIFT)
119
120#define GTK_CSS_CHANGE_ANY (GTK_CSS_CHANGE_ANY_SELF | \
121 GTK_CSS_CHANGE_ANY_SIBLING | \
122 GTK_CSS_CHANGE_ANY_PARENT | \
123 GTK_CSS_CHANGE_ANY_PARENT_SIBLING | \
124 GTK_CSS_CHANGE_SOURCE | \
125 GTK_CSS_CHANGE_PARENT_STYLE | \
126 GTK_CSS_CHANGE_TIMESTAMP | \
127 GTK_CSS_CHANGE_ANIMATIONS)
128
129/*
130 * GtkCssAffects:
131 * @GTK_CSS_AFFECTS_CONTENT: The content rendering is affected.
132 * This does not include things that affect the font. For those,
133 * see @GTK_CSS_AFFECTS_TEXT.
134 * @GTK_CSS_AFFECTS_BACKGROUND: The background rendering is affected.
135 * @GTK_CSS_AFFECTS_BORDER: The border styling is affected.
136 * @GTK_CSS_AFFECTS_TEXT_ATTRS: Text attributes are affected.
137 * @GTK_CSS_AFFECTS_TEXT_SIZE: Text size is affected.
138 * @GTK_CSS_AFFECTS_TEXT_CONTENT: Text rendering is affected, but size or
139 * attributes are not.
140 * @GTK_CSS_AFFECTS_ICON_SIZE: Icon size is affected.
141 * @GTK_CSS_AFFECTS_ICON_TEXTURE: The icon texture has changed and needs to be
142 * reloaded.
143 * @GTK_CSS_AFFECTS_ICON_REDRAW: Icons need to be redrawn (both symbolic and
144 * non-symbolic).
145 * @GTK_CSS_AFFECTS_ICON_REDRAW_SYMBOLIC: Symbolic icons need to be redrawn.
146 * @GTK_CSS_AFFECTS_OUTLINE: The outline styling is affected.
147 * @GTK_CSS_AFFECTS_SIZE: Changes in this property may have an effect
148 * on the allocated size of the element. Changes in these properties
149 * should cause a recomputation of the element's allocated size.
150 * @GTK_CSS_AFFECTS_POSTEFFECT: An effect is applied after drawing that changes
151 * @GTK_CSS_AFFECTS_TEXT: Affects anything related to text rendering.
152 * @GTK_CSS_AFFECTS_REDRAW: Affects anything that requires redraw.
153 * @GTK_CSS_AFFECTS_TRANSFORM: Affects the element transformation.
154 *
155 * The generic effects that a CSS property can have. If a value is
156 * set, then the property will have an influence on that feature.
157 *
158 * Note that multiple values can be set.
159 */
160typedef enum {
161 GTK_CSS_AFFECTS_CONTENT = (1 << 0),
162 GTK_CSS_AFFECTS_BACKGROUND = (1 << 1),
163 GTK_CSS_AFFECTS_BORDER = (1 << 2),
164 GTK_CSS_AFFECTS_TEXT_ATTRS = (1 << 3),
165 GTK_CSS_AFFECTS_TEXT_SIZE = (1 << 4),
166 GTK_CSS_AFFECTS_TEXT_CONTENT = (1 << 5),
167 GTK_CSS_AFFECTS_ICON_SIZE = (1 << 6),
168 GTK_CSS_AFFECTS_ICON_TEXTURE = (1 << 7),
169 GTK_CSS_AFFECTS_ICON_REDRAW = (1 << 8),
170 GTK_CSS_AFFECTS_ICON_REDRAW_SYMBOLIC = (1 << 9),
171 GTK_CSS_AFFECTS_OUTLINE = (1 << 10),
172 GTK_CSS_AFFECTS_SIZE = (1 << 11),
173 GTK_CSS_AFFECTS_POSTEFFECT = (1 << 12),
174 GTK_CSS_AFFECTS_TRANSFORM = (1 << 13),
175} GtkCssAffects;
176
177#define GTK_CSS_AFFECTS_REDRAW (GTK_CSS_AFFECTS_CONTENT | \
178 GTK_CSS_AFFECTS_BACKGROUND | \
179 GTK_CSS_AFFECTS_BORDER | \
180 GTK_CSS_AFFECTS_OUTLINE | \
181 GTK_CSS_AFFECTS_POSTEFFECT)
182
183#define GTK_CSS_AFFECTS_TEXT (GTK_CSS_AFFECTS_TEXT_SIZE | \
184 GTK_CSS_AFFECTS_TEXT_CONTENT)
185
186
187enum { /*< skip >*/
188 GTK_CSS_PROPERTY_COLOR,
189 GTK_CSS_PROPERTY_DPI,
190 GTK_CSS_PROPERTY_FONT_SIZE,
191 GTK_CSS_PROPERTY_ICON_PALETTE,
192 GTK_CSS_PROPERTY_BACKGROUND_COLOR,
193 GTK_CSS_PROPERTY_FONT_FAMILY,
194 GTK_CSS_PROPERTY_FONT_STYLE,
195 GTK_CSS_PROPERTY_FONT_WEIGHT,
196 GTK_CSS_PROPERTY_FONT_STRETCH,
197 GTK_CSS_PROPERTY_LETTER_SPACING,
198 GTK_CSS_PROPERTY_TEXT_DECORATION_LINE,
199 GTK_CSS_PROPERTY_TEXT_DECORATION_COLOR,
200 GTK_CSS_PROPERTY_TEXT_DECORATION_STYLE,
201 GTK_CSS_PROPERTY_TEXT_TRANSFORM,
202 GTK_CSS_PROPERTY_FONT_KERNING,
203 GTK_CSS_PROPERTY_FONT_VARIANT_LIGATURES,
204 GTK_CSS_PROPERTY_FONT_VARIANT_POSITION,
205 GTK_CSS_PROPERTY_FONT_VARIANT_CAPS,
206 GTK_CSS_PROPERTY_FONT_VARIANT_NUMERIC,
207 GTK_CSS_PROPERTY_FONT_VARIANT_ALTERNATES,
208 GTK_CSS_PROPERTY_FONT_VARIANT_EAST_ASIAN,
209 GTK_CSS_PROPERTY_TEXT_SHADOW,
210 GTK_CSS_PROPERTY_BOX_SHADOW,
211 GTK_CSS_PROPERTY_MARGIN_TOP,
212 GTK_CSS_PROPERTY_MARGIN_LEFT,
213 GTK_CSS_PROPERTY_MARGIN_BOTTOM,
214 GTK_CSS_PROPERTY_MARGIN_RIGHT,
215 GTK_CSS_PROPERTY_PADDING_TOP,
216 GTK_CSS_PROPERTY_PADDING_LEFT,
217 GTK_CSS_PROPERTY_PADDING_BOTTOM,
218 GTK_CSS_PROPERTY_PADDING_RIGHT,
219 GTK_CSS_PROPERTY_BORDER_TOP_STYLE,
220 GTK_CSS_PROPERTY_BORDER_TOP_WIDTH,
221 GTK_CSS_PROPERTY_BORDER_LEFT_STYLE,
222 GTK_CSS_PROPERTY_BORDER_LEFT_WIDTH,
223 GTK_CSS_PROPERTY_BORDER_BOTTOM_STYLE,
224 GTK_CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
225 GTK_CSS_PROPERTY_BORDER_RIGHT_STYLE,
226 GTK_CSS_PROPERTY_BORDER_RIGHT_WIDTH,
227 GTK_CSS_PROPERTY_BORDER_TOP_LEFT_RADIUS,
228 GTK_CSS_PROPERTY_BORDER_TOP_RIGHT_RADIUS,
229 GTK_CSS_PROPERTY_BORDER_BOTTOM_RIGHT_RADIUS,
230 GTK_CSS_PROPERTY_BORDER_BOTTOM_LEFT_RADIUS,
231 GTK_CSS_PROPERTY_OUTLINE_STYLE,
232 GTK_CSS_PROPERTY_OUTLINE_WIDTH,
233 GTK_CSS_PROPERTY_OUTLINE_OFFSET,
234 GTK_CSS_PROPERTY_BACKGROUND_CLIP,
235 GTK_CSS_PROPERTY_BACKGROUND_ORIGIN,
236 GTK_CSS_PROPERTY_BACKGROUND_SIZE,
237 GTK_CSS_PROPERTY_BACKGROUND_POSITION,
238 GTK_CSS_PROPERTY_BORDER_TOP_COLOR,
239 GTK_CSS_PROPERTY_BORDER_RIGHT_COLOR,
240 GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR,
241 GTK_CSS_PROPERTY_BORDER_LEFT_COLOR,
242 GTK_CSS_PROPERTY_OUTLINE_COLOR,
243 GTK_CSS_PROPERTY_BACKGROUND_REPEAT,
244 GTK_CSS_PROPERTY_BACKGROUND_IMAGE,
245 GTK_CSS_PROPERTY_BACKGROUND_BLEND_MODE,
246 GTK_CSS_PROPERTY_BORDER_IMAGE_SOURCE,
247 GTK_CSS_PROPERTY_BORDER_IMAGE_REPEAT,
248 GTK_CSS_PROPERTY_BORDER_IMAGE_SLICE,
249 GTK_CSS_PROPERTY_BORDER_IMAGE_WIDTH,
250 GTK_CSS_PROPERTY_ICON_SOURCE,
251 GTK_CSS_PROPERTY_ICON_SIZE,
252 GTK_CSS_PROPERTY_ICON_SHADOW,
253 GTK_CSS_PROPERTY_ICON_STYLE,
254 GTK_CSS_PROPERTY_ICON_TRANSFORM,
255 GTK_CSS_PROPERTY_ICON_FILTER,
256 GTK_CSS_PROPERTY_BORDER_SPACING,
257 GTK_CSS_PROPERTY_TRANSFORM,
258 GTK_CSS_PROPERTY_TRANSFORM_ORIGIN,
259 GTK_CSS_PROPERTY_MIN_WIDTH,
260 GTK_CSS_PROPERTY_MIN_HEIGHT,
261 GTK_CSS_PROPERTY_TRANSITION_PROPERTY,
262 GTK_CSS_PROPERTY_TRANSITION_DURATION,
263 GTK_CSS_PROPERTY_TRANSITION_TIMING_FUNCTION,
264 GTK_CSS_PROPERTY_TRANSITION_DELAY,
265 GTK_CSS_PROPERTY_ANIMATION_NAME,
266 GTK_CSS_PROPERTY_ANIMATION_DURATION,
267 GTK_CSS_PROPERTY_ANIMATION_TIMING_FUNCTION,
268 GTK_CSS_PROPERTY_ANIMATION_ITERATION_COUNT,
269 GTK_CSS_PROPERTY_ANIMATION_DIRECTION,
270 GTK_CSS_PROPERTY_ANIMATION_PLAY_STATE,
271 GTK_CSS_PROPERTY_ANIMATION_DELAY,
272 GTK_CSS_PROPERTY_ANIMATION_FILL_MODE,
273 GTK_CSS_PROPERTY_OPACITY,
274 GTK_CSS_PROPERTY_FILTER,
275 GTK_CSS_PROPERTY_CARET_COLOR,
276 GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR,
277 GTK_CSS_PROPERTY_FONT_FEATURE_SETTINGS,
278 GTK_CSS_PROPERTY_FONT_VARIATION_SETTINGS,
279 GTK_CSS_PROPERTY_LINE_HEIGHT,
280 /* add more */
281 GTK_CSS_PROPERTY_N_PROPERTIES
282};
283
284typedef enum /*< skip >*/ {
285 GTK_CSS_AREA_BORDER_BOX,
286 GTK_CSS_AREA_PADDING_BOX,
287 GTK_CSS_AREA_CONTENT_BOX
288} GtkCssArea;
289
290typedef enum /*< skip >*/ {
291 GTK_CSS_DIRECTION_NORMAL,
292 GTK_CSS_DIRECTION_REVERSE,
293 GTK_CSS_DIRECTION_ALTERNATE,
294 GTK_CSS_DIRECTION_ALTERNATE_REVERSE
295} GtkCssDirection;
296
297typedef enum /*< skip >*/ {
298 GTK_CSS_PLAY_STATE_RUNNING,
299 GTK_CSS_PLAY_STATE_PAUSED
300} GtkCssPlayState;
301
302typedef enum /*< skip >*/ {
303 GTK_CSS_FILL_NONE,
304 GTK_CSS_FILL_FORWARDS,
305 GTK_CSS_FILL_BACKWARDS,
306 GTK_CSS_FILL_BOTH
307} GtkCssFillMode;
308
309typedef enum /*< skip >*/ {
310 GTK_CSS_ICON_STYLE_REQUESTED,
311 GTK_CSS_ICON_STYLE_REGULAR,
312 GTK_CSS_ICON_STYLE_SYMBOLIC
313} GtkCssIconStyle;
314
315typedef enum /*< skip >*/ {
316 /* relative font sizes */
317 GTK_CSS_FONT_SIZE_SMALLER,
318 GTK_CSS_FONT_SIZE_LARGER,
319 /* absolute font sizes */
320 GTK_CSS_FONT_SIZE_XX_SMALL,
321 GTK_CSS_FONT_SIZE_X_SMALL,
322 GTK_CSS_FONT_SIZE_SMALL,
323 GTK_CSS_FONT_SIZE_MEDIUM,
324 GTK_CSS_FONT_SIZE_LARGE,
325 GTK_CSS_FONT_SIZE_X_LARGE,
326 GTK_CSS_FONT_SIZE_XX_LARGE
327} GtkCssFontSize;
328
329typedef enum /*< skip >*/ {
330 GTK_CSS_TEXT_DECORATION_LINE_NONE = 1 << 0,
331 GTK_CSS_TEXT_DECORATION_LINE_UNDERLINE = 1 << 1,
332 GTK_CSS_TEXT_DECORATION_LINE_OVERLINE = 1 << 2,
333 GTK_CSS_TEXT_DECORATION_LINE_LINE_THROUGH = 1 << 3
334} GtkTextDecorationLine;
335
336typedef enum /*< skip >*/ {
337 GTK_CSS_TEXT_DECORATION_STYLE_SOLID,
338 GTK_CSS_TEXT_DECORATION_STYLE_DOUBLE,
339 GTK_CSS_TEXT_DECORATION_STYLE_WAVY
340} GtkTextDecorationStyle;
341
342typedef enum /*< skip >*/ {
343 GTK_CSS_TEXT_TRANSFORM_NONE,
344 GTK_CSS_TEXT_TRANSFORM_LOWERCASE,
345 GTK_CSS_TEXT_TRANSFORM_UPPERCASE,
346 GTK_CSS_TEXT_TRANSFORM_CAPITALIZE,
347} GtkTextTransform;
348
349/* for the order in arrays */
350typedef enum /*< skip >*/ {
351 GTK_CSS_TOP,
352 GTK_CSS_RIGHT,
353 GTK_CSS_BOTTOM,
354 GTK_CSS_LEFT
355} GtkCssSide;
356
357typedef enum /*< skip >*/ {
358 GTK_CSS_DIMENSION_PERCENTAGE,
359 GTK_CSS_DIMENSION_NUMBER,
360 GTK_CSS_DIMENSION_LENGTH,
361 GTK_CSS_DIMENSION_ANGLE,
362 GTK_CSS_DIMENSION_TIME
363} GtkCssDimension;
364
365typedef enum /*< skip >*/ {
366 /* CSS term: <number> */
367 GTK_CSS_NUMBER,
368 /* CSS term: <percentage> */
369 GTK_CSS_PERCENT,
370 /* CSS term: <length> */
371 GTK_CSS_PX,
372 GTK_CSS_PT,
373 GTK_CSS_EM,
374 GTK_CSS_EX,
375 GTK_CSS_REM,
376 GTK_CSS_PC,
377 GTK_CSS_IN,
378 GTK_CSS_CM,
379 GTK_CSS_MM,
380 /* CSS term: <angle> */
381 GTK_CSS_RAD,
382 GTK_CSS_DEG,
383 GTK_CSS_GRAD,
384 GTK_CSS_TURN,
385 /* CSS term: <time> */
386 GTK_CSS_S,
387 GTK_CSS_MS,
388} GtkCssUnit;
389
390typedef enum /*< skip >*/ {
391 GTK_CSS_FONT_KERNING_AUTO,
392 GTK_CSS_FONT_KERNING_NORMAL,
393 GTK_CSS_FONT_KERNING_NONE
394} GtkCssFontKerning;
395
396typedef enum /*< skip >*/ {
397 GTK_CSS_FONT_VARIANT_LIGATURE_NORMAL = 1 << 0,
398 GTK_CSS_FONT_VARIANT_LIGATURE_NONE = 1 << 1,
399 GTK_CSS_FONT_VARIANT_LIGATURE_COMMON_LIGATURES = 1 << 2,
400 GTK_CSS_FONT_VARIANT_LIGATURE_NO_COMMON_LIGATURES = 1 << 3,
401 GTK_CSS_FONT_VARIANT_LIGATURE_DISCRETIONARY_LIGATURES = 1 << 4,
402 GTK_CSS_FONT_VARIANT_LIGATURE_NO_DISCRETIONARY_LIGATURES = 1 << 5,
403 GTK_CSS_FONT_VARIANT_LIGATURE_HISTORICAL_LIGATURES = 1 << 6,
404 GTK_CSS_FONT_VARIANT_LIGATURE_NO_HISTORICAL_LIGATURES = 1 << 7,
405 GTK_CSS_FONT_VARIANT_LIGATURE_CONTEXTUAL = 1 << 8,
406 GTK_CSS_FONT_VARIANT_LIGATURE_NO_CONTEXTUAL = 1 << 9
407} GtkCssFontVariantLigature;
408
409typedef enum /*< skip >*/ {
410 GTK_CSS_FONT_VARIANT_POSITION_NORMAL,
411 GTK_CSS_FONT_VARIANT_POSITION_SUB,
412 GTK_CSS_FONT_VARIANT_POSITION_SUPER
413} GtkCssFontVariantPosition;
414
415typedef enum /*< skip >*/ {
416 GTK_CSS_FONT_VARIANT_NUMERIC_NORMAL = 1 << 0,
417 GTK_CSS_FONT_VARIANT_NUMERIC_LINING_NUMS = 1 << 1,
418 GTK_CSS_FONT_VARIANT_NUMERIC_OLDSTYLE_NUMS = 1 << 2,
419 GTK_CSS_FONT_VARIANT_NUMERIC_PROPORTIONAL_NUMS = 1 << 3,
420 GTK_CSS_FONT_VARIANT_NUMERIC_TABULAR_NUMS = 1 << 4,
421 GTK_CSS_FONT_VARIANT_NUMERIC_DIAGONAL_FRACTIONS = 1 << 5,
422 GTK_CSS_FONT_VARIANT_NUMERIC_STACKED_FRACTIONS = 1 << 6,
423 GTK_CSS_FONT_VARIANT_NUMERIC_ORDINAL = 1 << 7,
424 GTK_CSS_FONT_VARIANT_NUMERIC_SLASHED_ZERO = 1 << 8
425} GtkCssFontVariantNumeric;
426
427typedef enum /*< skip >*/ {
428 GTK_CSS_FONT_VARIANT_CAPS_NORMAL,
429 GTK_CSS_FONT_VARIANT_CAPS_SMALL_CAPS,
430 GTK_CSS_FONT_VARIANT_CAPS_ALL_SMALL_CAPS,
431 GTK_CSS_FONT_VARIANT_CAPS_PETITE_CAPS,
432 GTK_CSS_FONT_VARIANT_CAPS_ALL_PETITE_CAPS,
433 GTK_CSS_FONT_VARIANT_CAPS_UNICASE,
434 GTK_CSS_FONT_VARIANT_CAPS_TITLING_CAPS
435} GtkCssFontVariantCaps;
436
437typedef enum /*< skip >*/ {
438 GTK_CSS_FONT_VARIANT_ALTERNATE_NORMAL,
439 GTK_CSS_FONT_VARIANT_ALTERNATE_HISTORICAL_FORMS
440} GtkCssFontVariantAlternate;
441
442typedef enum /*< skip >*/ {
443 GTK_CSS_FONT_VARIANT_EAST_ASIAN_NORMAL = 1 << 0,
444 GTK_CSS_FONT_VARIANT_EAST_ASIAN_JIS78 = 1 << 1,
445 GTK_CSS_FONT_VARIANT_EAST_ASIAN_JIS83 = 1 << 2,
446 GTK_CSS_FONT_VARIANT_EAST_ASIAN_JIS90 = 1 << 3,
447 GTK_CSS_FONT_VARIANT_EAST_ASIAN_JIS04 = 1 << 4,
448 GTK_CSS_FONT_VARIANT_EAST_ASIAN_SIMPLIFIED = 1 << 5,
449 GTK_CSS_FONT_VARIANT_EAST_ASIAN_TRADITIONAL = 1 << 6,
450 GTK_CSS_FONT_VARIANT_EAST_ASIAN_FULL_WIDTH = 1 << 7,
451 GTK_CSS_FONT_VARIANT_EAST_ASIAN_PROPORTIONAL = 1 << 8,
452 GTK_CSS_FONT_VARIANT_EAST_ASIAN_RUBY = 1 << 9
453} GtkCssFontVariantEastAsian;
454
455static inline GtkCssChange
456_gtk_css_change_for_sibling (GtkCssChange match)
457{
458#define BASE_STATES ( GTK_CSS_CHANGE_CLASS \
459 | GTK_CSS_CHANGE_NAME \
460 | GTK_CSS_CHANGE_ID \
461 | GTK_CSS_CHANGE_FIRST_CHILD \
462 | GTK_CSS_CHANGE_LAST_CHILD \
463 | GTK_CSS_CHANGE_NTH_CHILD \
464 | GTK_CSS_CHANGE_NTH_LAST_CHILD \
465 | GTK_CSS_CHANGE_STATE \
466 | GTK_CSS_CHANGE_HOVER \
467 | GTK_CSS_CHANGE_DISABLED \
468 | GTK_CSS_CHANGE_SELECTED \
469 | GTK_CSS_CHANGE_BACKDROP)
470
471#define KEEP_STATES ( ~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE) \
472 | GTK_CSS_CHANGE_NTH_CHILD \
473 | GTK_CSS_CHANGE_NTH_LAST_CHILD)
474
475 return (match & KEEP_STATES) | ((match & BASE_STATES) << GTK_CSS_CHANGE_SIBLING_SHIFT);
476
477#undef BASE_STATES
478#undef KEEP_STATES
479}
480
481static inline GtkCssChange
482_gtk_css_change_for_child (GtkCssChange match)
483{
484#define BASE_STATES ( GTK_CSS_CHANGE_CLASS \
485 | GTK_CSS_CHANGE_NAME \
486 | GTK_CSS_CHANGE_ID \
487 | GTK_CSS_CHANGE_FIRST_CHILD \
488 | GTK_CSS_CHANGE_LAST_CHILD \
489 | GTK_CSS_CHANGE_NTH_CHILD \
490 | GTK_CSS_CHANGE_NTH_LAST_CHILD \
491 | GTK_CSS_CHANGE_STATE \
492 | GTK_CSS_CHANGE_HOVER \
493 | GTK_CSS_CHANGE_DISABLED \
494 | GTK_CSS_CHANGE_BACKDROP \
495 | GTK_CSS_CHANGE_SELECTED \
496 | GTK_CSS_CHANGE_SIBLING_CLASS \
497 | GTK_CSS_CHANGE_SIBLING_NAME \
498 | GTK_CSS_CHANGE_SIBLING_ID \
499 | GTK_CSS_CHANGE_SIBLING_FIRST_CHILD \
500 | GTK_CSS_CHANGE_SIBLING_LAST_CHILD \
501 | GTK_CSS_CHANGE_SIBLING_NTH_CHILD \
502 | GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD \
503 | GTK_CSS_CHANGE_SIBLING_STATE \
504 | GTK_CSS_CHANGE_SIBLING_HOVER \
505 | GTK_CSS_CHANGE_SIBLING_DISABLED \
506 | GTK_CSS_CHANGE_SIBLING_BACKDROP \
507 | GTK_CSS_CHANGE_SIBLING_SELECTED)
508
509#define KEEP_STATES (~(BASE_STATES|GTK_CSS_CHANGE_SOURCE|GTK_CSS_CHANGE_PARENT_STYLE))
510
511 return (match & KEEP_STATES) | ((match & BASE_STATES) << GTK_CSS_CHANGE_PARENT_SHIFT);
512
513#undef BASE_STATES
514#undef KEEP_STATES
515}
516
517GtkCssDimension gtk_css_unit_get_dimension (GtkCssUnit unit) G_GNUC_CONST;
518
519char * gtk_css_change_to_string (GtkCssChange change) G_GNUC_MALLOC;
520void gtk_css_change_print (GtkCssChange change,
521 GString *string);
522
523const char * gtk_css_pseudoclass_name (GtkStateFlags flags) G_GNUC_CONST;
524
525/* These hash functions are selected so they achieve 2 things:
526 * 1. collision free among each other
527 * Hashing the CSS selectors "button", ".button" and "#button" should give different results.
528 * So we multiply the hash values with distinct prime numbers.
529 * 2. generate small numbers
530 * It's why the code uses quarks instead of interned strings. Interned strings are random
531 * pointers, quarks are numbers increasing from 0.
532 * Both of these goals should achieve a bloom filter for selector matching that is as free
533 * of collisions as possible.
534 */
535static inline guint
536gtk_css_hash_class (GQuark klass)
537{
538 return klass * 5;
539}
540static inline guint
541gtk_css_hash_name (GQuark name)
542{
543 return name * 7;
544}
545static inline guint
546gtk_css_hash_id (GQuark id)
547{
548 return id * 11;
549}
550
551G_END_DECLS
552
553#endif /* __GTK_CSS_TYPES_PRIVATE_H__ */
554

source code of gtk/gtk/gtkcsstypesprivate.h