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 | |
25 | void |
26 | gtk_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 | |
108 | GtkCssDimension |
109 | gtk_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 | |
146 | char * |
147 | gtk_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 | |
156 | const char * |
157 | gtk_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 | |