Create internal struct for theme cache
authorenglebass <englebass@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 31 Jan 2011 11:44:24 +0000 (11:44 +0000)
committerenglebass <englebass@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 31 Jan 2011 11:44:24 +0000 (11:44 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/efreet@56595 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

ChangeLog
src/bin/efreet_icon_cache_create.c
src/lib/efreet_cache.c
src/lib/efreet_cache_private.h
src/lib/efreet_icon.h
src/tests/ef_icon_theme.c
src/tests/efreet_icon_cache_dump.c

index e64c801..23aa1af 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -42,3 +42,7 @@
 
        * Check whether dirs is NULL
 
+2011-01-XX  Sebastian Dransfeld
+
+       * Create internal struct for theme cache
+
index adb5b3e..75075c0 100644 (file)
@@ -370,7 +370,7 @@ icon_theme_directory_new(Efreet_Ini *ini, const char *name)
 }
 
 static void
-icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path)
+icon_theme_index_read(Efreet_Cache_Icon_Theme *theme, const char *path)
 {
     /* TODO: return error value */
     Efreet_Ini *ini;
@@ -389,13 +389,13 @@ icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path)
 
     efreet_ini_section_set(ini, "Icon Theme");
     tmp = efreet_ini_localestring_get(ini, "Name");
-    if (tmp) theme->name.name = eina_stringshare_add(tmp);
+    if (tmp) theme->theme.name.name = eina_stringshare_add(tmp);
 
     tmp = efreet_ini_localestring_get(ini, "Comment");
-    if (tmp) theme->comment = eina_stringshare_add(tmp);
+    if (tmp) theme->theme.comment = eina_stringshare_add(tmp);
 
     tmp = efreet_ini_string_get(ini, "Example");
-    if (tmp) theme->example_icon = eina_stringshare_add(tmp);
+    if (tmp) theme->theme.example_icon = eina_stringshare_add(tmp);
 
     theme->hidden = efreet_ini_boolean_get(ini, "Hidden");
 
@@ -418,11 +418,11 @@ icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path)
         {
             *p = '\0';
 
-            theme->inherits = eina_list_append(theme->inherits, eina_stringshare_add(s));
+            theme->theme.inherits = eina_list_append(theme->theme.inherits, eina_stringshare_add(s));
             s = ++p;
             p = strchr(s, ',');
         }
-        theme->inherits = eina_list_append(theme->inherits, eina_stringshare_add(s));
+        theme->theme.inherits = eina_list_append(theme->theme.inherits, eina_stringshare_add(s));
     }
 
     /* make sure this one is done last as setting the directory will change
@@ -447,7 +447,7 @@ icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path)
 
             dir = icon_theme_directory_new(ini, s);
             if (!dir) goto error;
-            theme->directories = eina_list_append(theme->directories, dir);
+            theme->theme.directories = eina_list_append(theme->theme.directories, dir);
 
             if (p) s = ++p;
         }
@@ -468,7 +468,7 @@ cache_theme_scan(const char *dir)
 
     EINA_ITERATOR_FOREACH(it, entry)
     {
-        Efreet_Icon_Theme *theme;
+        Efreet_Cache_Icon_Theme *theme;
         const char *name;
         const char *path;
         char buf[PATH_MAX];
@@ -482,15 +482,15 @@ cache_theme_scan(const char *dir)
 
         if (!theme)
         {
-            theme = NEW(Efreet_Icon_Theme, 1);
-            theme->name.internal = eina_stringshare_add(name);
+            theme = NEW(Efreet_Cache_Icon_Theme, 1);
+            theme->theme.name.internal = eina_stringshare_add(name);
             eina_hash_direct_add(icon_themes,
-                          (void *)theme->name.internal, theme);
+                          (void *)theme->theme.name.internal, theme);
         }
 
         path = eina_stringshare_add(entry->path);
-        if (!eina_list_data_find(theme->paths, path))
-            theme->paths = eina_list_append(theme->paths, path);
+        if (!eina_list_data_find(theme->theme.paths, path))
+            theme->theme.paths = eina_list_append(theme->theme.paths, path);
         else
             eina_stringshare_del(path);
 
@@ -533,16 +533,16 @@ cache_lock_file(void)
 }
 
 static void
-icon_theme_free(Efreet_Icon_Theme *theme)
+icon_theme_free(Efreet_Cache_Icon_Theme *theme)
 {
     void *data;
     Efreet_Icon_Theme_Directory *dir;
 
-    EINA_LIST_FREE(theme->paths, data)
+    EINA_LIST_FREE(theme->theme.paths, data)
         eina_stringshare_del(data);
-    EINA_LIST_FREE(theme->inherits, data)
+    EINA_LIST_FREE(theme->theme.inherits, data)
         eina_stringshare_del(data);
-    EINA_LIST_FREE(theme->directories, dir)
+    EINA_LIST_FREE(theme->theme.directories, dir)
     {
         eina_stringshare_del(dir->name);
         free(dir);
@@ -564,7 +564,8 @@ main(int argc, char **argv)
     Efreet_Cache_Version *icon_version;
     Efreet_Cache_Version *theme_version;
     Efreet_Cache_Icons *cache;
-    Efreet_Icon_Theme *theme;
+    Efreet_Cache_Icon_Theme *theme;
+    Eet_Data_Descriptor *theme_edd;
     Eet_Data_Descriptor *edd;
     Eet_File *icon_ef;
     Eet_File *theme_ef;
@@ -616,6 +617,8 @@ main(int argc, char **argv)
 
     /* finish efreet init */
     if (!efreet_init()) goto on_error;
+    /* Need to init edd's, so they are like we want, not like userspace wants */
+    theme_edd = efreet_icon_theme_edd(EINA_TRUE);
 
     icon_themes = eina_hash_string_superfast_new(EINA_FREE_CB(icon_theme_free));
 
@@ -695,13 +698,13 @@ main(int argc, char **argv)
 
         if (!theme->valid || theme->hidden) continue;
 #ifndef STRICT_SPEC
-        if (!theme->name.name) continue;
+        if (!theme->theme.name.name) continue;
 #endif
 
         themes = eina_hash_string_superfast_new(NULL);
 
         /* read icons from the eet file */
-        cache = eet_data_read(icon_ef, edd, theme->name.internal);
+        cache = eet_data_read(icon_ef, edd, theme->theme.name.internal);
 
         /* No existing cache before, so create it */
         if (!cache)
@@ -718,14 +721,14 @@ main(int argc, char **argv)
         if (!cache->dirs)
             cache->dirs = eina_hash_string_superfast_new(NULL);
 
-        if (cache_scan(theme, themes, cache->icons, cache->dirs, &changed))
+        if (cache_scan(&(theme->theme), themes, cache->icons, cache->dirs, &changed))
         {
             fprintf(stderr, "generated: '%s' %i (%i)\n",
-                    theme->name.internal,
+                    theme->theme.name.internal,
                     changed,
                     eina_hash_population(cache->icons));
             if (changed)
-                eet_data_write(icon_ef, edd, theme->name.internal, cache, 1);
+                eet_data_write(icon_ef, edd, theme->theme.name.internal, cache, 1);
             changed = EINA_FALSE;
         }
 
@@ -735,7 +738,7 @@ main(int argc, char **argv)
         free(cache);
 
         /* TODO: Only write if changed */
-        eet_data_write(theme_ef, efreet_icon_theme_edd(), theme->name.internal, theme, 1);
+        eet_data_write(theme_ef, theme_edd, theme->theme.name.internal, theme, 1);
     }
     eina_iterator_free(it);
 
index e1e7c38..5dbe4ea 100644 (file)
@@ -475,7 +475,7 @@ efreet_icons_edd(Eina_Bool include_dirs)
  * Needs EAPI because of helper binaries
  */
 EAPI Eet_Data_Descriptor *
-efreet_icon_theme_edd(void)
+efreet_icon_theme_edd(Eina_Bool cache)
 {
     Eet_Data_Descriptor_Class eddc;
 
@@ -500,28 +500,37 @@ efreet_icon_theme_edd(void)
     EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory,
                                   "size.threshold", size.threshold, EET_T_UINT);
 
-    EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Icon_Theme);
+    EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Icon_Theme);
     icon_theme_edd = eet_data_descriptor_file_new(&eddc);
     if (!icon_theme_edd) return NULL;
 
-    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme,
-                                  "name.internal", name.internal, EET_T_STRING);
-    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme,
-                                  "name.name", name.name, EET_T_STRING);
-    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme,
-                                  "comment", comment, EET_T_STRING);
-    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme,
-                                  "example_icon", example_icon, EET_T_STRING);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+                                  "name.internal", theme.name.internal, EET_T_STRING);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+                                  "name.name", theme.name.name, EET_T_STRING);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+                                  "comment", theme.comment, EET_T_STRING);
+    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+                                  "example_icon", theme.example_icon, EET_T_STRING);
 
     eet_data_descriptor_element_add(icon_theme_edd, "paths", EET_T_STRING, EET_G_LIST,
-                                    offsetof(Efreet_Icon_Theme, paths), 0, NULL, NULL);
+                                    offsetof(Efreet_Cache_Icon_Theme, theme.paths), 0, NULL, NULL);
     eet_data_descriptor_element_add(icon_theme_edd, "inherits", EET_T_STRING, EET_G_LIST,
-                                    offsetof(Efreet_Icon_Theme, inherits), 0, NULL, NULL);
-    EET_DATA_DESCRIPTOR_ADD_LIST(icon_theme_edd, Efreet_Icon_Theme,
-                                  "directories", directories, icon_theme_directory_edd);
+                                    offsetof(Efreet_Cache_Icon_Theme, theme.inherits), 0, NULL, NULL);
+    EET_DATA_DESCRIPTOR_ADD_LIST(icon_theme_edd, Efreet_Cache_Icon_Theme,
+                                  "directories", theme.directories, icon_theme_directory_edd);
 
-    EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme,
-                                  "last_cache_check", last_cache_check, EET_T_DOUBLE);
+    if (cache)
+    {
+        EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+                                      "last_cache_check", last_cache_check, EET_T_LONG_LONG);
+
+        EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme,
+                                      "path", path, EET_T_STRING);
+
+        EET_DATA_DESCRIPTOR_ADD_HASH(icon_theme_edd, Efreet_Cache_Icon_Theme,
+                                     "dirs", dirs, efreet_icon_directory_edd());
+    }
 
     return icon_theme_edd;
 }
@@ -676,7 +685,7 @@ Efreet_Icon_Theme *
 efreet_cache_icon_theme_find(const char *theme)
 {
     if (!efreet_cache_check(&icon_theme_cache, efreet_icon_theme_cache_file(), EFREET_ICON_CACHE_MAJOR)) return NULL;
-    return eet_data_read(icon_theme_cache, efreet_icon_theme_edd(), theme);
+    return eet_data_read(icon_theme_cache, efreet_icon_theme_edd(EINA_FALSE), theme);
 }
 
 void
index ccb926d..1add8f8 100644 (file)
@@ -12,8 +12,25 @@ EAPI Eet_Data_Descriptor *efreet_desktop_edd(void);
 EAPI Eet_Data_Descriptor *efreet_hash_array_string_edd(void);
 EAPI Eet_Data_Descriptor *efreet_hash_string_edd(void);
 EAPI Eet_Data_Descriptor *efreet_array_string_edd(void);
-EAPI Eet_Data_Descriptor *efreet_icon_theme_edd(void);
+EAPI Eet_Data_Descriptor *efreet_icon_theme_edd(Eina_Bool cache);
 EAPI Eet_Data_Descriptor *efreet_icons_edd(Eina_Bool include_dirs);
 EAPI Eet_Data_Descriptor *efreet_icons_fallback_edd(Eina_Bool include_dirs);
 
+typedef struct Efreet_Cache_Icon_Theme Efreet_Cache_Icon_Theme;
+
+struct Efreet_Cache_Icon_Theme
+{
+    Efreet_Icon_Theme theme;
+
+    long long last_cache_check; /**< Last time the cache was checked */
+
+    Eina_Hash *dirs;            /**< All possible icon paths for this theme */
+
+    const char *path;           /**< path to index.theme */
+
+    Eina_Bool hidden:1;         /**< Should this theme be hidden from users */
+    Eina_Bool valid:1;          /**< Have we seen an index for this theme */
+    Eina_Bool changed:1;        /**< Changed since last seen */
+};
+
 #endif
index 765a72b..8ee6aa1 100644 (file)
@@ -63,14 +63,9 @@ struct Efreet_Icon_Theme
     /* An icon theme can have multiple directories that store it's icons. We
      * need to be able to find a search each one. */
 
-    Eina_List *paths;          /**< The paths */
-    Eina_List *inherits;       /**< Icon themes we inherit from */
-    Eina_List *directories;    /**< List of subdirectories for this theme */
-
-    double last_cache_check;    /**< Last time the cache was checked */
-
-    unsigned char hidden:1;     /**< Should this theme be hidden from users */
-    unsigned char valid:1;      /**< Have we seen an index for this theme */
+    Eina_List *paths;           /**< The paths */
+    Eina_List *inherits;        /**< Icon themes we inherit from */
+    Eina_List *directories;     /**< List of subdirectories for this theme */
 };
 
 /**
index 90eb668..6cad371 100644 (file)
@@ -558,7 +558,7 @@ ef_icons_find(Efreet_Icon_Theme *theme, Eina_Hash *icons)
                 ef_icons_find(parent_theme, icons);
         }
     }
-    else if (theme->valid && strcmp(theme->name.internal, "hicolor"))
+    else if (strcmp(theme->name.internal, "hicolor"))
     {
         Efreet_Icon_Theme *parent_theme;
 
index 40abf18..da6291c 100644 (file)
@@ -89,7 +89,7 @@ main(int argc, char **argv)
     {
         for (i = 1; i < argc; i++)
         {
-            theme = eet_data_read(theme_ef, efreet_icon_theme_edd(), argv[i]);
+            theme = eet_data_read(theme_ef, efreet_icon_theme_edd(EINA_FALSE), argv[i]);
             if (theme) l = eina_list_append(l, theme);
         }
     }
@@ -103,7 +103,7 @@ main(int argc, char **argv)
         {
             for (i = 0; i < num; i++)
             {
-                theme = eet_data_read(theme_ef, efreet_icon_theme_edd(), keys[i]);
+                theme = eet_data_read(theme_ef, efreet_icon_theme_edd(EINA_FALSE), keys[i]);
                 if (theme) l = eina_list_append(l, theme);
             }
             free(keys);