From 215e9ca9b394018db468fac5d6b13f97ac0f9e37 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Tue, 27 Apr 2021 15:25:46 +0100 Subject: [PATCH] edje - add color-class fallback for lookups in prep for proper theme cc --- src/lib/edje/edje_util.c | 52 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/lib/edje/edje_util.c b/src/lib/edje/edje_util.c index af465288e7..16171b6c41 100644 --- a/src/lib/edje/edje_util.c +++ b/src/lib/edje/edje_util.c @@ -5877,6 +5877,32 @@ _edje_color_class_find(const Edje *ed, const char *color_class) cc = eina_hash_find(ed->file->color_hash, color_class); if (cc) return cc; + // fall back to parent class. expecting classes like: + // /bg <- fallback for /bg/* + // /bg/normal <- fallback for /bg/normal/* + // /bg/normal/button <- mid grey + // etc. + if (color_class[0] == '/') + { + size_t len = strlen(color_class); + char *color_class_parent = alloca(len + 1); + const char *src = color_class; + char *last_slash = NULL, *dst = color_class_parent; + + for (;; src++, dst++) + { + *dst = *src; + if (*dst == '/') last_slash = dst; + if (*dst == 0) break; + } + if (last_slash) + { + if (last_slash == color_class_parent) + return NULL; + *last_slash = 0; + } + return _edje_color_class_find(ed, color_class_parent); + } return NULL; } @@ -5924,6 +5950,32 @@ _edje_color_class_recursive_find(const Edje *ed, const char *color_class) cc = _edje_color_class_recursive_find_helper(ed, ed->file->color_hash, color_class); if (cc) return cc; + // fall back to parent class. expecting classes like: + // /bg <- fallback for /bg/* + // /bg/normal <- fallback for /bg/normal/* + // /bg/normal/button <- mid grey + // etc. + if (color_class[0] == '/') + { + size_t len = strlen(color_class); + char *color_class_parent = alloca(len + 1); + const char *src = color_class; + char *last_slash = NULL, *dst = color_class_parent; + + for (;; src++, dst++) + { + *dst = *src; + if (*dst == '/') last_slash = dst; + if (*dst == 0) break; + } + if (last_slash) + { + if (last_slash == color_class_parent) + return NULL; + *last_slash = 0; + } + return _edje_color_class_recursive_find(ed, color_class_parent); + } return NULL; }