1 | #include <gtk/gtk.h> |
2 | |
3 | #include <string.h> |
4 | |
5 | #define SCALABLE_IMAGE_SIZE (128) |
6 | |
7 | static GtkIconTheme * |
8 | get_test_icontheme (gboolean force_reload) |
9 | { |
10 | static GtkIconTheme *icon_theme = NULL; |
11 | const char *current_dir[2]; |
12 | |
13 | if (force_reload) |
14 | g_clear_object (&icon_theme); |
15 | |
16 | if (icon_theme) |
17 | return icon_theme; |
18 | |
19 | icon_theme = gtk_icon_theme_new (); |
20 | gtk_icon_theme_set_theme_name (self: icon_theme, theme_name: "icons" ); |
21 | current_dir[0] = g_test_get_dir (file_type: G_TEST_DIST); |
22 | current_dir[1] = NULL; |
23 | gtk_icon_theme_set_search_path (self: icon_theme, path: current_dir); |
24 | |
25 | return icon_theme; |
26 | } |
27 | |
28 | static char * |
29 | lookup_flags_to_string (GtkIconLookupFlags flags) |
30 | { |
31 | GValue flags_value = { 0, }, string_value = { 0, }; |
32 | char *result; |
33 | |
34 | g_value_init (value: &flags_value, g_type: GTK_TYPE_ICON_LOOKUP_FLAGS); |
35 | g_value_init (value: &string_value, G_TYPE_STRING); |
36 | |
37 | g_value_set_flags (value: &flags_value, v_flags: flags); |
38 | if (!g_value_transform (src_value: &flags_value, dest_value: &string_value)) |
39 | { |
40 | g_assert_not_reached (); |
41 | } |
42 | |
43 | result = g_value_dup_string (value: &string_value); |
44 | |
45 | g_value_unset (value: &flags_value); |
46 | g_value_unset (value: &string_value); |
47 | |
48 | return result; |
49 | } |
50 | |
51 | static void |
52 | assert_icon_lookup_size (const char *icon_name, |
53 | int size, |
54 | GtkTextDirection direction, |
55 | GtkIconLookupFlags flags, |
56 | gboolean fallbacks, |
57 | const char *filename, |
58 | int pixbuf_size) |
59 | { |
60 | GtkIconPaintable *info; |
61 | GFile *file; |
62 | char *path = NULL; |
63 | |
64 | if (fallbacks) |
65 | { |
66 | GThemedIcon *fallback_icons = G_THEMED_ICON (g_themed_icon_new_with_default_fallbacks (icon_name)); |
67 | const char **fallback_names = (const char **) g_themed_icon_get_names (icon: fallback_icons); |
68 | info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, fallbacks: &fallback_names[1], size, scale: 1, direction, flags); |
69 | g_object_unref (object: fallback_icons); |
70 | } |
71 | else |
72 | { |
73 | info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, NULL, size, scale: 1, direction, flags); |
74 | } |
75 | |
76 | if (info == NULL) |
77 | { |
78 | g_error ("Could not look up an icon for \"%s\" with flags %s at size %d" , |
79 | icon_name, lookup_flags_to_string (flags), size); |
80 | return; |
81 | } |
82 | |
83 | file = gtk_icon_paintable_get_file (self: info); |
84 | if (file) |
85 | { |
86 | path = g_file_get_path (file); |
87 | g_object_unref (object: file); |
88 | } |
89 | |
90 | if (filename) |
91 | { |
92 | if (path == NULL || !g_str_has_suffix (str: path, suffix: filename)) |
93 | { |
94 | g_error ("Icon for \"%s\" with flags %s at size %d should be \"...%s\" but is \"...%s\"" , |
95 | icon_name, lookup_flags_to_string (flags), size, |
96 | filename, path); |
97 | return; |
98 | } |
99 | } |
100 | else |
101 | { |
102 | g_assert_null (path); |
103 | } |
104 | |
105 | g_free (mem: path); |
106 | |
107 | g_assert_cmpint (gdk_paintable_get_intrinsic_width (GDK_PAINTABLE (info)), ==, size); |
108 | |
109 | g_object_unref (object: info); |
110 | } |
111 | |
112 | static void |
113 | assert_icon_lookup (const char *icon_name, |
114 | int size, |
115 | GtkTextDirection direction, |
116 | GtkIconLookupFlags flags, |
117 | gboolean fallbacks, |
118 | const char *filename) |
119 | { |
120 | assert_icon_lookup_size (icon_name, size, direction, flags, fallbacks, filename, pixbuf_size: -1); |
121 | } |
122 | |
123 | static void |
124 | assert_icon_lookup_fails (const char *icon_name, |
125 | int size, |
126 | GtkTextDirection direction, |
127 | GtkIconLookupFlags flags) |
128 | { |
129 | GtkIconPaintable *info; |
130 | |
131 | info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, NULL, size, scale: 1, direction, flags); |
132 | |
133 | /* We never truly *fail*, but check that we got the image-missing fallback */ |
134 | g_assert_nonnull (info); |
135 | g_assert_cmpstr (gtk_icon_paintable_get_icon_name (info), ==, "image-missing" ); |
136 | } |
137 | |
138 | static GList *lookups = NULL; |
139 | static gboolean collecting_lookups = FALSE; |
140 | |
141 | static GLogWriterOutput |
142 | log_writer (GLogLevelFlags log_level, |
143 | const GLogField *fields, |
144 | gsize n_fields, |
145 | gpointer user_data) |
146 | { |
147 | const char *domain = NULL; |
148 | const char *msg = NULL; |
149 | int i; |
150 | |
151 | if (!collecting_lookups) |
152 | return g_log_writer_default (log_level, fields, n_fields, user_data); |
153 | |
154 | for (i = 0; i < n_fields; i++) |
155 | { |
156 | if (strcmp (s1: fields[i].key, s2: "GLIB_DOMAIN" ) == 0) |
157 | domain = fields[i].value; |
158 | if (strcmp (s1: fields[i].key, s2: "MESSAGE" ) == 0) |
159 | msg = fields[i].value; |
160 | } |
161 | |
162 | if (log_level != G_LOG_LEVEL_MESSAGE || g_strcmp0 (str1: domain, str2: "Gtk" ) != 0) |
163 | return g_log_writer_default (log_level, fields, n_fields, user_data); |
164 | |
165 | if (g_str_has_prefix (str: msg, prefix: "\tlookup name: " )) |
166 | { |
167 | char *s; |
168 | s = g_strchomp (string: g_strdup (str: msg + strlen (s: "\tlookup name: " ))); |
169 | lookups = g_list_append (list: lookups, data: s); |
170 | } |
171 | |
172 | return G_LOG_WRITER_HANDLED; |
173 | } |
174 | |
175 | static void |
176 | assert_lookup_order (const char *icon_name, |
177 | int size, |
178 | GtkTextDirection direction, |
179 | GtkIconLookupFlags flags, |
180 | gboolean fallbacks, |
181 | const char *first, |
182 | ...) |
183 | { |
184 | va_list args; |
185 | const char *s; |
186 | GtkIconPaintable *info; |
187 | GList *l; |
188 | |
189 | g_assert_null (lookups); |
190 | collecting_lookups = TRUE; |
191 | |
192 | if (fallbacks) |
193 | { |
194 | GThemedIcon *fallback_icons = G_THEMED_ICON (g_themed_icon_new_with_default_fallbacks (icon_name)); |
195 | const char **fallback_names = (const char **) g_themed_icon_get_names (icon: fallback_icons); |
196 | info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, fallbacks: &fallback_names[1], size, scale: 1, direction, flags); |
197 | g_object_unref (object: fallback_icons); |
198 | } |
199 | else |
200 | { |
201 | info = gtk_icon_theme_lookup_icon (self: get_test_icontheme (FALSE), icon_name, NULL, size, scale: 1, direction, flags); |
202 | } |
203 | |
204 | if (info) |
205 | g_object_unref (object: info); |
206 | |
207 | collecting_lookups = FALSE; |
208 | |
209 | va_start (args, first); |
210 | s = first; |
211 | l = lookups; |
212 | while (s != NULL) |
213 | { |
214 | g_assert_nonnull (l); |
215 | g_assert_cmpstr (s, ==, l->data); |
216 | s = va_arg (args, char *); |
217 | l = l->next; |
218 | } |
219 | g_assert_null (l); |
220 | va_end (args); |
221 | |
222 | g_list_free_full (list: lookups, free_func: g_free); |
223 | lookups = NULL; |
224 | } |
225 | |
226 | #ifdef G_ENABLE_DEBUG |
227 | #define require_debug() |
228 | #else |
229 | #define require_debug() \ |
230 | g_test_skip ("requires G_ENABLE_DEBUG"); \ |
231 | return; |
232 | #endif |
233 | |
234 | static void |
235 | test_lookup_order (void) |
236 | { |
237 | require_debug (); |
238 | |
239 | if (g_test_subprocess ()) |
240 | { |
241 | guint debug_flags; |
242 | |
243 | debug_flags = gtk_get_debug_flags (); |
244 | gtk_set_debug_flags (flags: debug_flags | GTK_DEBUG_ICONTHEME); |
245 | |
246 | g_log_set_writer_func (func: log_writer, NULL, NULL); |
247 | |
248 | assert_lookup_order (icon_name: "foo-bar-baz" , size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, TRUE, |
249 | first: "foo-bar-baz" , |
250 | "foo-bar" , |
251 | "foo" , |
252 | "foo-bar-baz-symbolic" , |
253 | "foo-bar-symbolic" , |
254 | "foo-symbolic" , |
255 | NULL); |
256 | assert_lookup_order (icon_name: "foo-bar-baz" , size: 16, direction: GTK_TEXT_DIR_RTL, flags: 0, TRUE, |
257 | first: "foo-bar-baz-rtl" , |
258 | "foo-bar-baz" , |
259 | "foo-bar-rtl" , |
260 | "foo-bar" , |
261 | "foo-rtl" , |
262 | "foo" , |
263 | "foo-bar-baz-symbolic-rtl" , |
264 | "foo-bar-baz-symbolic" , |
265 | "foo-bar-symbolic-rtl" , |
266 | "foo-bar-symbolic" , |
267 | "foo-symbolic-rtl" , |
268 | "foo-symbolic" , |
269 | NULL); |
270 | assert_lookup_order (icon_name: "foo-bar-baz" , size: 16, direction: GTK_TEXT_DIR_RTL, flags: 0, FALSE, |
271 | first: "foo-bar-baz-rtl" , |
272 | "foo-bar-baz" , |
273 | NULL); |
274 | assert_lookup_order (icon_name: "foo-bar-baz-symbolic" , size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, TRUE, |
275 | first: "foo-bar-baz-symbolic" , |
276 | "foo-bar-symbolic" , |
277 | "foo-symbolic" , |
278 | "foo-bar-baz" , |
279 | "foo-bar" , |
280 | "foo" , |
281 | NULL); |
282 | |
283 | assert_lookup_order (icon_name: "bla-bla" , size: 16, direction: GTK_TEXT_DIR_NONE, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE, |
284 | first: "bla-bla-symbolic" , |
285 | "bla-symbolic" , |
286 | "bla-bla-symbolic" , /* awkward */ |
287 | "bla-symbolic" , /* awkward */ |
288 | "bla-bla" , |
289 | "bla" , |
290 | NULL); |
291 | assert_lookup_order (icon_name: "bla-bla-symbolic" , size: 16, direction: GTK_TEXT_DIR_NONE, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE, |
292 | first: "bla-bla-symbolic" , |
293 | "bla-symbolic" , |
294 | "bla-bla-symbolic" , /* awkward */ |
295 | "bla-symbolic" , /* awkward */ |
296 | "bla-bla" , |
297 | "bla" , |
298 | NULL); |
299 | |
300 | assert_lookup_order (icon_name: "bar-baz" , size: 16, direction: GTK_TEXT_DIR_RTL, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE, |
301 | first: "bar-baz-symbolic-rtl" , |
302 | "bar-baz-symbolic" , |
303 | "bar-symbolic-rtl" , |
304 | "bar-symbolic" , |
305 | "bar-baz-symbolic-rtl" , /* awkward */ |
306 | "bar-baz-symbolic" , /* awkward */ |
307 | "bar-symbolic-rtl" , /* awkward */ |
308 | "bar-symbolic" , /* awkward */ |
309 | "bar-baz-rtl" , |
310 | "bar-baz" , |
311 | "bar-rtl" , |
312 | "bar" , |
313 | NULL); |
314 | assert_lookup_order (icon_name: "bar-baz-symbolic" , size: 16, direction: GTK_TEXT_DIR_RTL, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE, |
315 | first: "bar-baz-symbolic-rtl" , |
316 | "bar-baz-symbolic" , |
317 | "bar-symbolic-rtl" , |
318 | "bar-symbolic" , |
319 | "bar-baz-symbolic-rtl" , /* awkward */ |
320 | "bar-baz-symbolic" , /* awkward */ |
321 | "bar-symbolic-rtl" , /* awkward */ |
322 | "bar-symbolic" , /* awkward */ |
323 | "bar-baz-rtl" , |
324 | "bar-baz" , |
325 | "bar-rtl" , |
326 | "bar" , |
327 | NULL); |
328 | |
329 | assert_lookup_order (icon_name: "bar-baz" , size: 16, direction: GTK_TEXT_DIR_LTR, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE, |
330 | first: "bar-baz-symbolic-ltr" , |
331 | "bar-baz-symbolic" , |
332 | "bar-symbolic-ltr" , |
333 | "bar-symbolic" , |
334 | "bar-baz-symbolic-ltr" , /* awkward */ |
335 | "bar-baz-symbolic" , /* awkward */ |
336 | "bar-symbolic-ltr" , /* awkward */ |
337 | "bar-symbolic" , /* awkward */ |
338 | "bar-baz-ltr" , |
339 | "bar-baz" , |
340 | "bar-ltr" , |
341 | "bar" , |
342 | NULL); |
343 | assert_lookup_order (icon_name: "bar-baz-symbolic" , size: 16, direction: GTK_TEXT_DIR_LTR, flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, TRUE, |
344 | first: "bar-baz-symbolic-ltr" , |
345 | "bar-baz-symbolic" , |
346 | "bar-symbolic-ltr" , |
347 | "bar-symbolic" , |
348 | "bar-baz-symbolic-ltr" , /* awkward */ |
349 | "bar-baz-symbolic" , /* awkward */ |
350 | "bar-symbolic-ltr" , /* awkward */ |
351 | "bar-symbolic" , /* awkward */ |
352 | "bar-baz-ltr" , |
353 | "bar-baz" , |
354 | "bar-ltr" , |
355 | "bar" , |
356 | NULL); |
357 | |
358 | return; |
359 | } |
360 | |
361 | g_test_trap_subprocess (NULL, usec_timeout: 0, test_flags: 0); |
362 | g_test_trap_has_passed (); |
363 | } |
364 | |
365 | static void |
366 | test_basics (void) |
367 | { |
368 | /* just a basic boring lookup so we know everything works */ |
369 | assert_icon_lookup (icon_name: "simple" , size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16/simple.png" ); |
370 | } |
371 | |
372 | static void |
373 | test_generic_fallback (void) |
374 | { |
375 | /* simple test for generic fallback */ |
376 | assert_icon_lookup (icon_name: "simple-foo-bar" , |
377 | size: 16, |
378 | direction: GTK_TEXT_DIR_NONE, |
379 | flags: 0, |
380 | TRUE, |
381 | filename: "/icons/16x16/simple.png" ); |
382 | |
383 | /* Check generic fallback also works for symbolics falling back to regular items */ |
384 | assert_icon_lookup (icon_name: "simple-foo-bar-symbolic" , |
385 | size: 16, |
386 | direction: GTK_TEXT_DIR_NONE, |
387 | flags: 0, |
388 | TRUE, |
389 | filename: "/icons/16x16/simple.png" ); |
390 | |
391 | /* Check we fall back to more generic symbolic icons before falling back to |
392 | * non-symbolics */ |
393 | assert_icon_lookup (icon_name: "everything-justregular-symbolic" , |
394 | SCALABLE_IMAGE_SIZE, |
395 | direction: GTK_TEXT_DIR_NONE, |
396 | flags: 0, |
397 | TRUE, |
398 | filename: "/icons/scalable/everything-symbolic.svg" ); |
399 | } |
400 | |
401 | static void |
402 | test_force_symbolic (void) |
403 | { |
404 | /* check forcing symbolic works */ |
405 | assert_icon_lookup (icon_name: "everything" , |
406 | SCALABLE_IMAGE_SIZE, |
407 | direction: GTK_TEXT_DIR_NONE, |
408 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
409 | FALSE, |
410 | filename: "/icons/scalable/everything-symbolic.svg" ); |
411 | /* check forcing symbolic also works for symbolic icons (d'oh) */ |
412 | assert_icon_lookup (icon_name: "everything-symbolic" , |
413 | SCALABLE_IMAGE_SIZE, |
414 | direction: GTK_TEXT_DIR_NONE, |
415 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
416 | FALSE, |
417 | filename: "/icons/scalable/everything-symbolic.svg" ); |
418 | |
419 | /* check all the combos for fallbacks on an icon that only exists as symbolic */ |
420 | assert_icon_lookup (icon_name: "everything-justsymbolic" , |
421 | SCALABLE_IMAGE_SIZE, |
422 | direction: GTK_TEXT_DIR_NONE, |
423 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
424 | FALSE, |
425 | filename: "/icons/scalable/everything-justsymbolic-symbolic.svg" ); |
426 | assert_icon_lookup (icon_name: "everything-justsymbolic" , |
427 | SCALABLE_IMAGE_SIZE, |
428 | direction: GTK_TEXT_DIR_NONE, |
429 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
430 | TRUE, |
431 | filename: "/icons/scalable/everything-justsymbolic-symbolic.svg" ); |
432 | assert_icon_lookup (icon_name: "everything-justsymbolic-symbolic" , |
433 | SCALABLE_IMAGE_SIZE, |
434 | direction: GTK_TEXT_DIR_NONE, |
435 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
436 | FALSE, |
437 | filename: "/icons/scalable/everything-justsymbolic-symbolic.svg" ); |
438 | assert_icon_lookup (icon_name: "everything-justsymbolic-symbolic" , |
439 | SCALABLE_IMAGE_SIZE, |
440 | direction: GTK_TEXT_DIR_NONE, |
441 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
442 | TRUE, |
443 | filename: "/icons/scalable/everything-justsymbolic-symbolic.svg" ); |
444 | |
445 | /* check all the combos for fallbacks, this time for an icon that only exists as regular */ |
446 | assert_icon_lookup (icon_name: "everything-justregular" , |
447 | SCALABLE_IMAGE_SIZE, |
448 | direction: GTK_TEXT_DIR_NONE, |
449 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
450 | FALSE, |
451 | filename: "/icons/scalable/everything-justregular.svg" ); |
452 | assert_icon_lookup (icon_name: "everything-justregular" , |
453 | SCALABLE_IMAGE_SIZE, |
454 | direction: GTK_TEXT_DIR_NONE, |
455 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
456 | TRUE, |
457 | filename: "/icons/scalable/everything-symbolic.svg" ); |
458 | assert_icon_lookup_fails (icon_name: "everything-justregular-symbolic" , |
459 | SCALABLE_IMAGE_SIZE, |
460 | direction: GTK_TEXT_DIR_NONE, |
461 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC); |
462 | assert_icon_lookup (icon_name: "everything-justregular-symbolic" , |
463 | SCALABLE_IMAGE_SIZE, |
464 | direction: GTK_TEXT_DIR_NONE, |
465 | flags: GTK_ICON_LOOKUP_FORCE_SYMBOLIC, |
466 | TRUE, |
467 | filename: "/icons/scalable/everything-symbolic.svg" ); |
468 | } |
469 | |
470 | static void |
471 | test_force_regular (void) |
472 | { |
473 | /* check forcing regular works (d'oh) */ |
474 | assert_icon_lookup (icon_name: "everything" , |
475 | SCALABLE_IMAGE_SIZE, |
476 | direction: GTK_TEXT_DIR_NONE, |
477 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
478 | FALSE, |
479 | filename: "/icons/scalable/everything.svg" ); |
480 | /* check forcing regular also works for symbolic icons ) */ |
481 | assert_icon_lookup (icon_name: "everything-symbolic" , |
482 | SCALABLE_IMAGE_SIZE, |
483 | direction: GTK_TEXT_DIR_NONE, |
484 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
485 | FALSE, |
486 | filename: "/icons/scalable/everything.svg" ); |
487 | |
488 | /* check all the combos for fallbacks on an icon that only exists as regular */ |
489 | assert_icon_lookup (icon_name: "everything-justregular" , |
490 | SCALABLE_IMAGE_SIZE, |
491 | direction: GTK_TEXT_DIR_NONE, |
492 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
493 | FALSE, |
494 | filename: "/icons/scalable/everything-justregular.svg" ); |
495 | assert_icon_lookup (icon_name: "everything-justregular" , |
496 | SCALABLE_IMAGE_SIZE, |
497 | direction: GTK_TEXT_DIR_NONE, |
498 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
499 | TRUE, |
500 | filename: "/icons/scalable/everything-justregular.svg" ); |
501 | assert_icon_lookup (icon_name: "everything-justregular-symbolic" , |
502 | SCALABLE_IMAGE_SIZE, |
503 | direction: GTK_TEXT_DIR_NONE, |
504 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
505 | FALSE, |
506 | filename: "/icons/scalable/everything-justregular.svg" ); |
507 | assert_icon_lookup (icon_name: "everything-justregular-symbolic" , |
508 | SCALABLE_IMAGE_SIZE, |
509 | direction: GTK_TEXT_DIR_NONE, |
510 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
511 | TRUE, |
512 | filename: "/icons/scalable/everything-justregular.svg" ); |
513 | |
514 | /* check all the combos for fallbacks, this time for an icon that only exists as symbolic */ |
515 | assert_icon_lookup_fails (icon_name: "everything-justsymbolic" , |
516 | SCALABLE_IMAGE_SIZE, |
517 | direction: GTK_TEXT_DIR_NONE, |
518 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR); |
519 | assert_icon_lookup (icon_name: "everything-justsymbolic" , |
520 | SCALABLE_IMAGE_SIZE, |
521 | direction: GTK_TEXT_DIR_NONE, |
522 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
523 | TRUE, |
524 | filename: "/icons/scalable/everything.svg" ); |
525 | assert_icon_lookup (icon_name: "everything-justsymbolic-symbolic" , |
526 | SCALABLE_IMAGE_SIZE, |
527 | direction: GTK_TEXT_DIR_NONE, |
528 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
529 | FALSE, |
530 | filename: "/icons/scalable/everything-justsymbolic-symbolic.svg" ); |
531 | assert_icon_lookup (icon_name: "everything-justsymbolic-symbolic" , |
532 | SCALABLE_IMAGE_SIZE, |
533 | direction: GTK_TEXT_DIR_NONE, |
534 | flags: GTK_ICON_LOOKUP_FORCE_REGULAR, |
535 | TRUE, |
536 | filename: "/icons/scalable/everything.svg" ); |
537 | } |
538 | |
539 | static void |
540 | test_rtl (void) |
541 | { |
542 | assert_icon_lookup (icon_name: "everything" , |
543 | SCALABLE_IMAGE_SIZE, |
544 | direction: GTK_TEXT_DIR_RTL, |
545 | flags: 0, |
546 | FALSE, |
547 | filename: "/icons/scalable/everything-rtl.svg" ); |
548 | assert_icon_lookup (icon_name: "everything-symbolic" , |
549 | SCALABLE_IMAGE_SIZE, |
550 | direction: GTK_TEXT_DIR_RTL, |
551 | flags: 0, |
552 | FALSE, |
553 | filename: "/icons/scalable/everything-symbolic-rtl.svg" ); |
554 | |
555 | assert_icon_lookup_fails (icon_name: "everything-justrtl" , |
556 | SCALABLE_IMAGE_SIZE, |
557 | direction: GTK_TEXT_DIR_NONE, |
558 | flags: 0); |
559 | assert_icon_lookup_fails (icon_name: "everything-justrtl" , |
560 | SCALABLE_IMAGE_SIZE, |
561 | direction: GTK_TEXT_DIR_LTR, |
562 | flags: 0); |
563 | assert_icon_lookup (icon_name: "everything-justrtl" , |
564 | SCALABLE_IMAGE_SIZE, |
565 | direction: GTK_TEXT_DIR_RTL, |
566 | flags: 0, |
567 | FALSE, |
568 | filename: "/icons/scalable/everything-justrtl-rtl.svg" ); |
569 | |
570 | assert_icon_lookup (icon_name: "everything-justrtl" , |
571 | SCALABLE_IMAGE_SIZE, |
572 | direction: GTK_TEXT_DIR_NONE, |
573 | flags: 0, |
574 | TRUE, |
575 | filename: "/icons/scalable/everything.svg" ); |
576 | assert_icon_lookup (icon_name: "everything-justrtl" , |
577 | SCALABLE_IMAGE_SIZE, |
578 | direction: GTK_TEXT_DIR_LTR, |
579 | flags: 0, |
580 | TRUE, |
581 | filename: "/icons/scalable/everything.svg" ); |
582 | assert_icon_lookup (icon_name: "everything-justrtl" , |
583 | SCALABLE_IMAGE_SIZE, |
584 | direction: GTK_TEXT_DIR_RTL, |
585 | flags: 0, |
586 | TRUE, |
587 | filename: "/icons/scalable/everything-justrtl-rtl.svg" ); |
588 | } |
589 | |
590 | static void |
591 | test_symbolic_single_size (void) |
592 | { |
593 | /* Check we properly load a symbolic icon from a sized directory */ |
594 | assert_icon_lookup (icon_name: "only32-symbolic" , |
595 | size: 32, |
596 | direction: GTK_TEXT_DIR_NONE, |
597 | flags: 0, |
598 | FALSE, |
599 | filename: "/icons/32x32/only32-symbolic.svg" ); |
600 | /* Check that we still properly load it even if a different size is requested */ |
601 | assert_icon_lookup (icon_name: "only32-symbolic" , |
602 | size: 16, |
603 | direction: GTK_TEXT_DIR_NONE, |
604 | flags: 0, |
605 | FALSE, |
606 | filename: "/icons/32x32/only32-symbolic.svg" ); |
607 | assert_icon_lookup (icon_name: "only32-symbolic" , |
608 | size: 128, |
609 | direction: GTK_TEXT_DIR_NONE, |
610 | flags: 0, |
611 | FALSE, |
612 | filename: "/icons/32x32/only32-symbolic.svg" ); |
613 | } |
614 | |
615 | static void |
616 | test_svg_size (void) |
617 | { |
618 | /* Check we properly load a svg icon from a sized directory */ |
619 | assert_icon_lookup_size (icon_name: "twosize-fixed" , size: 48, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32/twosize-fixed.svg" , pixbuf_size: 48); |
620 | assert_icon_lookup_size (icon_name: "twosize-fixed" , size: 32, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32/twosize-fixed.svg" , pixbuf_size: 32); |
621 | assert_icon_lookup_size (icon_name: "twosize-fixed" , size: 20, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32/twosize-fixed.svg" , pixbuf_size: 20); |
622 | assert_icon_lookup_size (icon_name: "twosize-fixed" , size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16/twosize-fixed.svg" , pixbuf_size: 16); |
623 | |
624 | /* Check that we still properly load it even if a different size is requested */ |
625 | assert_icon_lookup_size (icon_name: "twosize" , size: 64, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32s/twosize.svg" , pixbuf_size: 64); |
626 | assert_icon_lookup_size (icon_name: "twosize" , size: 48, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32s/twosize.svg" , pixbuf_size: 48); |
627 | assert_icon_lookup_size (icon_name: "twosize" , size: 32, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32s/twosize.svg" , pixbuf_size: 32); |
628 | assert_icon_lookup_size (icon_name: "twosize" , size: 24, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/32x32s/twosize.svg" , pixbuf_size: 24); |
629 | assert_icon_lookup_size (icon_name: "twosize" , size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16s/twosize.svg" , pixbuf_size: 16); |
630 | assert_icon_lookup_size (icon_name: "twosize" , size: 12, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16s/twosize.svg" , pixbuf_size: 12); |
631 | assert_icon_lookup_size (icon_name: "twosize" , size: 8, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16x16s/twosize.svg" , pixbuf_size: 8); |
632 | } |
633 | |
634 | static void |
635 | test_size (void) |
636 | { |
637 | assert_icon_lookup_size (icon_name: "size-test" , size: 12, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/15/size-test.png" , pixbuf_size: 15); |
638 | assert_icon_lookup_size (icon_name: "size-test" , size: 13, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/15/size-test.png" , pixbuf_size: 15); |
639 | assert_icon_lookup_size (icon_name: "size-test" , size: 14, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/15/size-test.png" , pixbuf_size: 15); |
640 | assert_icon_lookup_size (icon_name: "size-test" , size: 15, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/15/size-test.png" , pixbuf_size: 15); |
641 | assert_icon_lookup_size (icon_name: "size-test" , size: 16, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16-22/size-test.png" , pixbuf_size: 19); |
642 | assert_icon_lookup_size (icon_name: "size-test" , size: 17, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16-22/size-test.png" , pixbuf_size: 19); |
643 | assert_icon_lookup_size (icon_name: "size-test" , size: 18, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16-22/size-test.png" , pixbuf_size: 19); |
644 | assert_icon_lookup_size (icon_name: "size-test" , size: 19, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/16-22/size-test.png" , pixbuf_size: 19); |
645 | /* the next 3 are because we never scale up */ |
646 | assert_icon_lookup_size (icon_name: "size-test" , size: 20, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg" , pixbuf_size: 20); |
647 | assert_icon_lookup_size (icon_name: "size-test" , size: 21, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg" , pixbuf_size: 21); |
648 | assert_icon_lookup_size (icon_name: "size-test" , size: 22, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg" , pixbuf_size: 22); |
649 | |
650 | assert_icon_lookup_size (icon_name: "size-test" , size: 23, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg" , pixbuf_size: 23); |
651 | assert_icon_lookup_size (icon_name: "size-test" , size: 23, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg" , pixbuf_size: 23); |
652 | assert_icon_lookup_size (icon_name: "size-test" , size: 25, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg" , pixbuf_size: 25); |
653 | assert_icon_lookup_size (icon_name: "size-test" , size: 28, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/25+/size-test.svg" , pixbuf_size: 28); |
654 | /* the next 2 are because we never scale up */ |
655 | assert_icon_lookup_size (icon_name: "size-test" , size: 31, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg" , pixbuf_size: 31); |
656 | assert_icon_lookup_size (icon_name: "size-test" , size: 34, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg" , pixbuf_size: 34); |
657 | |
658 | assert_icon_lookup_size (icon_name: "size-test" , size: 37, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg" , pixbuf_size: 37); |
659 | assert_icon_lookup_size (icon_name: "size-test" , size: 40, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg" , pixbuf_size: 40); |
660 | assert_icon_lookup_size (icon_name: "size-test" , size: 45, direction: GTK_TEXT_DIR_NONE, flags: 0, FALSE, filename: "/icons/35+/size-test.svg" , pixbuf_size: 45); |
661 | } |
662 | |
663 | static void |
664 | test_list (void) |
665 | { |
666 | GtkIconTheme *theme; |
667 | char **icons; |
668 | |
669 | theme = get_test_icontheme (TRUE); |
670 | icons = gtk_icon_theme_get_icon_names (self: theme); |
671 | |
672 | g_assert_true (g_strv_contains ((const char * const *)icons, "size-test" )); |
673 | g_assert_true (g_strv_contains ((const char * const *)icons, "simple" )); |
674 | g_assert_true (g_strv_contains ((const char * const *)icons, "twosize-fixed" )); |
675 | g_assert_true (g_strv_contains ((const char * const *)icons, "twosize" )); |
676 | g_assert_true (g_strv_contains ((const char * const *)icons, "only32-symbolic" )); |
677 | g_assert_true (g_strv_contains ((const char * const *)icons, "everything" )); |
678 | g_assert_true (g_strv_contains ((const char * const *)icons, "everything-rtl" )); |
679 | g_assert_true (g_strv_contains ((const char * const *)icons, "everything-symbolic" )); |
680 | g_assert_true (g_strv_contains ((const char * const *)icons, "everything-justregular" )); |
681 | g_assert_true (g_strv_contains ((const char * const *)icons, "everything-justrtl-rtl" )); |
682 | g_assert_true (g_strv_contains ((const char * const *)icons, "everything-symbolic-rtl" )); |
683 | g_assert_true (g_strv_contains ((const char * const *)icons, "everything-justsymbolic-symbolic" )); |
684 | |
685 | g_assert_true (gtk_icon_theme_has_icon (theme, "size-test" )); |
686 | g_assert_true (gtk_icon_theme_has_icon (theme, "simple" )); |
687 | g_assert_true (gtk_icon_theme_has_icon (theme, "twosize-fixed" )); |
688 | g_assert_true (gtk_icon_theme_has_icon (theme, "twosize" )); |
689 | g_assert_true (gtk_icon_theme_has_icon (theme, "only32-symbolic" )); |
690 | g_assert_true (gtk_icon_theme_has_icon (theme, "everything" )); |
691 | g_assert_true (gtk_icon_theme_has_icon (theme, "everything-rtl" )); |
692 | g_assert_true (gtk_icon_theme_has_icon (theme, "everything-symbolic" )); |
693 | g_assert_true (gtk_icon_theme_has_icon (theme, "everything-justregular" )); |
694 | g_assert_true (gtk_icon_theme_has_icon (theme, "everything-justrtl-rtl" )); |
695 | g_assert_true (gtk_icon_theme_has_icon (theme, "everything-symbolic-rtl" )); |
696 | g_assert_true (gtk_icon_theme_has_icon (theme, "everything-justsymbolic-symbolic" )); |
697 | |
698 | g_strfreev (str_array: icons); |
699 | } |
700 | |
701 | static void |
702 | test_inherit (void) |
703 | { |
704 | assert_icon_lookup (icon_name: "one-two-three" , |
705 | SCALABLE_IMAGE_SIZE, |
706 | direction: GTK_TEXT_DIR_NONE, |
707 | flags: 0, |
708 | TRUE, |
709 | filename: "/icons/scalable/one-two.svg" ); |
710 | assert_icon_lookup (icon_name: "one-two-three" , |
711 | SCALABLE_IMAGE_SIZE, |
712 | direction: GTK_TEXT_DIR_RTL, |
713 | flags: 0, |
714 | TRUE, |
715 | filename: "/icons/scalable/one-two-rtl.svg" ); |
716 | assert_icon_lookup (icon_name: "one-two-three-symbolic" , |
717 | SCALABLE_IMAGE_SIZE, |
718 | direction: GTK_TEXT_DIR_NONE, |
719 | flags: 0, |
720 | TRUE, |
721 | filename: "/icons2/scalable/one-two-three-symbolic.svg" ); |
722 | assert_icon_lookup (icon_name: "one-two-three-symbolic" , |
723 | SCALABLE_IMAGE_SIZE, |
724 | direction: GTK_TEXT_DIR_RTL, |
725 | flags: 0, |
726 | TRUE, |
727 | filename: "/icons2/scalable/one-two-three-symbolic.svg" ); |
728 | assert_icon_lookup (icon_name: "one-two-symbolic" , |
729 | SCALABLE_IMAGE_SIZE, |
730 | direction: GTK_TEXT_DIR_NONE, |
731 | flags: 0, |
732 | TRUE, |
733 | filename: "/icons2/scalable/one-two-symbolic.svg" ); |
734 | assert_icon_lookup (icon_name: "one-two-symbolic" , |
735 | SCALABLE_IMAGE_SIZE, |
736 | direction: GTK_TEXT_DIR_RTL, |
737 | flags: 0, |
738 | TRUE, |
739 | filename: "/icons2/scalable/one-two-symbolic-rtl.svg" ); |
740 | } |
741 | |
742 | static void |
743 | test_nonsquare_symbolic (void) |
744 | { |
745 | int width, height, size; |
746 | GtkIconTheme *icon_theme; |
747 | GtkIconPaintable *info; |
748 | GFile *file; |
749 | GIcon *icon; |
750 | GError *error = NULL; |
751 | GdkPixbuf *pixbuf; |
752 | GtkSnapshot *snapshot; |
753 | GskRenderNode *node; |
754 | graphene_rect_t bounds; |
755 | |
756 | char *path = g_build_filename (first_element: g_test_get_dir (file_type: G_TEST_DIST), |
757 | "icons" , |
758 | "scalable" , |
759 | "nonsquare-symbolic.svg" , |
760 | NULL); |
761 | |
762 | /* load the original image for reference */ |
763 | pixbuf = gdk_pixbuf_new_from_file (filename: path, error: &error); |
764 | |
765 | g_assert_no_error (error); |
766 | g_assert_nonnull (pixbuf); |
767 | |
768 | width = gdk_pixbuf_get_width (pixbuf); |
769 | height = gdk_pixbuf_get_height (pixbuf); |
770 | size = MAX (width, height); |
771 | g_object_unref (object: pixbuf); |
772 | |
773 | g_assert_cmpint (width, !=, height); |
774 | |
775 | /* now load it through GtkIconTheme */ |
776 | icon_theme = gtk_icon_theme_get_for_display (display: gdk_display_get_default ()); |
777 | file = g_file_new_for_path (path); |
778 | icon = g_file_icon_new (file); |
779 | info = gtk_icon_theme_lookup_by_gicon (self: icon_theme, icon, |
780 | size: height, scale: 1, direction: GTK_TEXT_DIR_NONE, flags: 0); |
781 | g_assert_nonnull (info); |
782 | |
783 | snapshot = gtk_snapshot_new (); |
784 | gdk_paintable_snapshot (paintable: GDK_PAINTABLE (ptr: info), snapshot, width: size, height: size); |
785 | node = gtk_snapshot_free_to_node (snapshot); |
786 | |
787 | /* the original dimensions have been preserved */ |
788 | |
789 | gsk_render_node_get_bounds (node, bounds: &bounds); |
790 | g_assert_cmpint (bounds.size.width, ==, width); |
791 | g_assert_cmpint (bounds.size.height, ==, height); |
792 | |
793 | gsk_render_node_unref (node); |
794 | g_free (mem: path); |
795 | g_object_unref (object: file); |
796 | g_object_unref (object: icon); |
797 | g_object_unref (object: info); |
798 | } |
799 | |
800 | static void |
801 | require_env (const char *var) |
802 | { |
803 | if (g_getenv (variable: var) == NULL) |
804 | g_warning ("Some tests require %s to be set" , var); |
805 | } |
806 | |
807 | int |
808 | main (int argc, char *argv[]) |
809 | { |
810 | require_env (var: "G_TEST_SRCDIR" ); |
811 | |
812 | gtk_test_init (argcp: &argc, argvp: &argv); |
813 | |
814 | g_test_add_func (testpath: "/icontheme/basics" , test_func: test_basics); |
815 | g_test_add_func (testpath: "/icontheme/generic-fallback" , test_func: test_generic_fallback); |
816 | g_test_add_func (testpath: "/icontheme/force-symbolic" , test_func: test_force_symbolic); |
817 | g_test_add_func (testpath: "/icontheme/force-regular" , test_func: test_force_regular); |
818 | g_test_add_func (testpath: "/icontheme/rtl" , test_func: test_rtl); |
819 | g_test_add_func (testpath: "/icontheme/symbolic-single-size" , test_func: test_symbolic_single_size); |
820 | g_test_add_func (testpath: "/icontheme/svg-size" , test_func: test_svg_size); |
821 | g_test_add_func (testpath: "/icontheme/size" , test_func: test_size); |
822 | g_test_add_func (testpath: "/icontheme/list" , test_func: test_list); |
823 | g_test_add_func (testpath: "/icontheme/inherit" , test_func: test_inherit); |
824 | g_test_add_func (testpath: "/icontheme/nonsquare-symbolic" , test_func: test_nonsquare_symbolic); |
825 | g_test_add_func (testpath: "/icontheme/lookup-order" , test_func: test_lookup_order); |
826 | |
827 | return g_test_run(); |
828 | } |
829 | |