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#include "config.h"
19
20#include "gtkcsstypesprivate.h"
21
22#include "gtkcssnumbervalueprivate.h"
23#include "gtkstylecontextprivate.h"
24
25void
26gtk_css_change_print (GtkCssChange change,
27 GString *string)
28{
29 const struct {
30 GtkCssChange flags;
31 const char *name;
32 } names[] = {
33 { GTK_CSS_CHANGE_CLASS, "class" },
34 { GTK_CSS_CHANGE_NAME, "name" },
35 { GTK_CSS_CHANGE_ID, "id" },
36 { GTK_CSS_CHANGE_FIRST_CHILD, "first-child" },
37 { GTK_CSS_CHANGE_LAST_CHILD, "last-child" },
38 { GTK_CSS_CHANGE_NTH_CHILD, "nth-child" },
39 { GTK_CSS_CHANGE_NTH_LAST_CHILD, "nth-last-child" },
40 { GTK_CSS_CHANGE_STATE, "state" },
41 { GTK_CSS_CHANGE_HOVER, "hover" },
42 { GTK_CSS_CHANGE_DISABLED, "disabled" },
43 { GTK_CSS_CHANGE_BACKDROP, "backdrop" },
44 { GTK_CSS_CHANGE_SELECTED, "selected" },
45
46 { GTK_CSS_CHANGE_SIBLING_CLASS, "sibling-class" },
47 { GTK_CSS_CHANGE_SIBLING_NAME, "sibling-name" },
48 { GTK_CSS_CHANGE_SIBLING_ID, "sibling-id" },
49 { GTK_CSS_CHANGE_SIBLING_FIRST_CHILD, "sibling-first-child" },
50 { GTK_CSS_CHANGE_SIBLING_LAST_CHILD, "sibling-last-child" },
51 { GTK_CSS_CHANGE_SIBLING_NTH_CHILD, "sibling-nth-child" },
52 { GTK_CSS_CHANGE_SIBLING_NTH_LAST_CHILD, "sibling-nth-last-child" },
53 { GTK_CSS_CHANGE_SIBLING_STATE, "sibling-state" },
54 { GTK_CSS_CHANGE_SIBLING_HOVER, "sibling-hover" },
55 { GTK_CSS_CHANGE_SIBLING_DISABLED, "sibling-disabled" },
56 { GTK_CSS_CHANGE_SIBLING_BACKDROP, "sibling-backdrop" },
57 { GTK_CSS_CHANGE_SIBLING_SELECTED, "sibling-selected" },
58
59 { GTK_CSS_CHANGE_PARENT_CLASS, "parent-class" },
60 { GTK_CSS_CHANGE_PARENT_NAME, "parent-name" },
61 { GTK_CSS_CHANGE_PARENT_ID, "parent-id" },
62 { GTK_CSS_CHANGE_PARENT_FIRST_CHILD, "parent-first-child" },
63 { GTK_CSS_CHANGE_PARENT_LAST_CHILD, "parent-last-child" },
64 { GTK_CSS_CHANGE_PARENT_NTH_CHILD, "parent-nth-child" },
65 { GTK_CSS_CHANGE_PARENT_NTH_LAST_CHILD, "parent-nth-last-child" },
66 { GTK_CSS_CHANGE_PARENT_STATE, "parent-state" },
67 { GTK_CSS_CHANGE_PARENT_HOVER, "parent-hover" },
68 { GTK_CSS_CHANGE_PARENT_DISABLED, "parent-disabled" },
69 { GTK_CSS_CHANGE_PARENT_BACKDROP, "parent-backdrop" },
70 { GTK_CSS_CHANGE_PARENT_SELECTED, "parent-selected" },
71
72 { GTK_CSS_CHANGE_PARENT_SIBLING_CLASS, "parent-sibling-class" },
73 { GTK_CSS_CHANGE_PARENT_SIBLING_NAME, "parent-sibling-name" },
74 { GTK_CSS_CHANGE_PARENT_SIBLING_ID, "parent-sibling-id" },
75 { GTK_CSS_CHANGE_PARENT_SIBLING_FIRST_CHILD, "parent-sibling-first-child" },
76 { GTK_CSS_CHANGE_PARENT_SIBLING_LAST_CHILD, "parent-sibling-last-child" },
77 { GTK_CSS_CHANGE_PARENT_SIBLING_NTH_CHILD, "parent-sibling-nth-child" },
78 { GTK_CSS_CHANGE_PARENT_SIBLING_NTH_LAST_CHILD, "parent-sibling-nth-last-child" },
79 { GTK_CSS_CHANGE_PARENT_SIBLING_STATE, "parent-sibling-state" },
80 { GTK_CSS_CHANGE_PARENT_SIBLING_HOVER, "parent-sibling-hover" },
81 { GTK_CSS_CHANGE_PARENT_SIBLING_DISABLED, "parent-sibling-disabled" },
82 { GTK_CSS_CHANGE_PARENT_SIBLING_BACKDROP, "parent-sibling-backdrop" },
83 { GTK_CSS_CHANGE_PARENT_SIBLING_SELECTED, "parent-sibling-selected" },
84
85 { GTK_CSS_CHANGE_SOURCE, "source" },
86 { GTK_CSS_CHANGE_PARENT_STYLE, "parent-style" },
87 { GTK_CSS_CHANGE_TIMESTAMP, "timestamp" },
88 { GTK_CSS_CHANGE_ANIMATIONS, "animations" },
89 };
90 guint i;
91 gboolean first;
92
93 first = TRUE;
94
95 for (i = 0; i < G_N_ELEMENTS (names); i++)
96 {
97 if (change & names[i].flags)
98 {
99 if (first)
100 first = FALSE;
101 else
102 g_string_append (string, val: "|");
103 g_string_append (string, val: names[i].name);
104 }
105 }
106}
107
108GtkCssDimension
109gtk_css_unit_get_dimension (GtkCssUnit unit)
110{
111 switch (unit)
112 {
113 case GTK_CSS_NUMBER:
114 return GTK_CSS_DIMENSION_NUMBER;
115
116 case GTK_CSS_PERCENT:
117 return GTK_CSS_DIMENSION_PERCENTAGE;
118
119 case GTK_CSS_PX:
120 case GTK_CSS_PT:
121 case GTK_CSS_EM:
122 case GTK_CSS_EX:
123 case GTK_CSS_REM:
124 case GTK_CSS_PC:
125 case GTK_CSS_IN:
126 case GTK_CSS_CM:
127 case GTK_CSS_MM:
128 return GTK_CSS_DIMENSION_LENGTH;
129
130 case GTK_CSS_RAD:
131 case GTK_CSS_DEG:
132 case GTK_CSS_GRAD:
133 case GTK_CSS_TURN:
134 return GTK_CSS_DIMENSION_ANGLE;
135
136 case GTK_CSS_S:
137 case GTK_CSS_MS:
138 return GTK_CSS_DIMENSION_TIME;
139
140 default:
141 g_assert_not_reached ();
142 return GTK_CSS_DIMENSION_PERCENTAGE;
143 }
144}
145
146char *
147gtk_css_change_to_string (GtkCssChange change)
148{
149 GString *string = g_string_new (NULL);
150
151 gtk_css_change_print (change, string);
152
153 return g_string_free (string, FALSE);
154}
155
156const char *
157gtk_css_pseudoclass_name (GtkStateFlags state)
158{
159 static const char * state_names[] = {
160 "active",
161 "hover",
162 "selected",
163 "disabled",
164 "indeterminate",
165 "focus",
166 "backdrop",
167 "dir(ltr)",
168 "dir(rtl)",
169 "link",
170 "visited",
171 "checked",
172 "drop(active)",
173 "focus-visible",
174 "focus-within"
175 };
176 guint i;
177
178 for (i = 0; i < G_N_ELEMENTS (state_names); i++)
179 {
180 if (state == (1 << i))
181 return state_names[i];
182 }
183
184 return NULL;
185}
186
187

source code of gtk/gtk/gtkcsstypes.c