raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=215e9ca9b394018db468fac5d6b13f97ac0f9e37

commit 215e9ca9b394018db468fac5d6b13f97ac0f9e37
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Tue Apr 27 15:25:46 2021 +0100

    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;
 }
 

-- 


Reply via email to