summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2021-10-31 11:44:57 +0000
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2021-10-31 11:44:57 +0000
commitcf0df4872deed8af3e031cc8a6000f560c4c10e6 (patch)
tree919e8e446dd5ec10e87390a525b10c1c23e5e2b1 /src/lib
parent0846ce9635f19dbc73cf15ffc4d6031099aa3696 (diff)
downloadefl-cf0df4872deed8af3e031cc8a6000f560c4c10e6.tar.gz
edje + elm - add new explicit tracking of all cc's used in edj themes
edje_cc now lists all cc's used in an edj file. edje provides an api to list this. elm now uses this api to expose a list of all cc's used acorss all the theme(s) selected by the user. this will then be used by paledit to produce a nicer gui with a list of available cc's to add etc. and split between basic and extended. @feat
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/edje/Edje_Common.h31
-rw-r--r--src/lib/edje/edje_data.c7
-rw-r--r--src/lib/edje/edje_load.c56
-rw-r--r--src/lib/edje/edje_private.h10
-rw-r--r--src/lib/elementary/elm_theme.c74
-rw-r--r--src/lib/elementary/elm_theme.h25
6 files changed, 201 insertions, 2 deletions
diff --git a/src/lib/edje/Edje_Common.h b/src/lib/edje/Edje_Common.h
index c94a2ff9ac..e03154e6ec 100644
--- a/src/lib/edje/Edje_Common.h
+++ b/src/lib/edje/Edje_Common.h
@@ -1808,6 +1808,37 @@ EAPI Eina_List *edje_mmap_collection_list(Eina_File *f);
EAPI void edje_mmap_collection_list_free(Eina_List *lst);
/**
+ * @brief Returns a list of colorclasses used in this edje file
+ * @param f The mapped file
+ *
+ * @return A list of strings freed by edje_file_color_class_used_free()
+ *
+ * @since 1.26
+ */
+EAPI Eina_List *edje_mmap_color_class_used_list(Eina_File *f);
+
+/**
+ * @brief Returns a list of colorclasses used in this edje file
+ * @param file The file path
+ *
+ * @return A list of strings freed by edje_file_color_class_used_free()
+ *
+ * @since 1.26
+ */
+EAPI Eina_List *edje_file_color_class_used_list(const char *file);
+
+/**
+ * @brief Frees a list of color classes used
+ * @param The list
+ *
+ * This frees the list returned by edje_mmap_color_class_used_list() or
+ * edje_file_color_class_used_list() when you no longer need it.
+ *
+ * @since 1.26
+ */
+EAPI void edje_file_color_class_used_free(Eina_List *lst);
+
+/**
* @brief Determines whether a group matching glob exists in an edje mapped file.
* @param f The mapped file
* @param glob A glob to match on
diff --git a/src/lib/edje/edje_data.c b/src/lib/edje/edje_data.c
index 6a89fd9ca9..1ce628075f 100644
--- a/src/lib/edje/edje_data.c
+++ b/src/lib/edje/edje_data.c
@@ -2,6 +2,7 @@
EAPI Eet_Data_Descriptor * _edje_edd_edje_file = NULL;
EAPI Eet_Data_Descriptor * _edje_edd_edje_part_collection = NULL;
+EAPI Eet_Data_Descriptor * _edje_edd_edje_color_class_info = NULL;
Eet_Data_Descriptor *_edje_edd_edje_string = NULL;
Eet_Data_Descriptor *_edje_edd_edje_style = NULL;
@@ -310,6 +311,7 @@ _edje_edd_shutdown(void)
FREED(_edje_edd_edje_file);
FREED(_edje_edd_edje_part_collection);
+ FREED(_edje_edd_edje_color_class_info);
}
#define EDJE_DEFINE_POINTER_TYPE(Type, Name) \
@@ -410,6 +412,11 @@ _edje_edd_init(void)
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_image_directory, Edje_Image_Directory, "sets", sets, _edje_edd_edje_image_directory_set);
EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_image_directory, Edje_Image_Directory, "vectors", vectors, _edje_edd_edje_vector_directory_entry);
+ /* collection directory */
+ EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Color_Class_Info);
+ _edje_edd_edje_color_class_info = eet_data_descriptor_file_new(&eddc);
+ EET_DATA_DESCRIPTOR_ADD_LIST_STRING(_edje_edd_edje_color_class_info, Edje_Color_Class_Info, "colors", colors);
+
/*MO*/
EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Mo);
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index acf0826b1d..1b9f025ebf 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -207,6 +207,62 @@ edje_mmap_collection_list_free(Eina_List *lst)
edje_file_collection_list_free(lst);
}
+EAPI Eina_List *
+edje_mmap_color_class_used_list(Eina_File *f)
+{
+ Eina_List *lst = NULL, *l;
+ Edje_File *edf;
+ int error_ret = 0;
+ const char *s;
+
+ if (!f) return NULL;
+ edf = _edje_cache_file_coll_open(f, NULL, &error_ret, NULL, NULL);
+ if (edf)
+ {
+ Edje_Color_Class_Info *cc_info;
+
+ cc_info = eet_data_read(edf->ef, _edje_edd_edje_color_class_info,
+ "edje/color_class_info");
+ if (cc_info)
+ {
+ EINA_LIST_FOREACH(cc_info->colors, l, s)
+ lst = eina_list_append(lst, eina_stringshare_add(s));
+ eina_list_free(cc_info->colors);
+ free(cc_info);
+ }
+ _edje_cache_file_unref(edf);
+ }
+
+ return lst;
+}
+
+EAPI Eina_List *
+edje_file_color_class_used_list(const char *file)
+{
+ Eina_File *f;
+ Eina_List *lst = NULL;
+ char *tmp;
+
+ if ((!file) || (!*file)) return NULL;
+ tmp = eina_vpath_resolve(file);
+ f = eina_file_open(tmp, EINA_FALSE);
+ if (!f) goto err;
+
+ lst = edje_mmap_collection_list(f);
+
+ eina_file_close(f); // close matching open OK
+err:
+ free(tmp);
+ return lst;
+}
+
+EAPI void
+edje_file_color_class_used_free(Eina_List *lst)
+{
+ eina_list_free(lst);
+}
+
+
EAPI Eina_Bool
edje_mmap_group_exists(Eina_File *f, const char *glob)
{
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 1d289123a7..d7f8ff6a3e 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -327,7 +327,7 @@ typedef struct _Edje_Gfx_Filter Edje_Gfx_Filter;
typedef struct _Edje_Gfx_Filter_Directory Edje_Gfx_Filter_Directory;
typedef struct _Edje_Color_Tree_Node Edje_Color_Tree_Node;
typedef struct _Edje_Vector_Directory_Entry Edje_Vector_Directory_Entry;
-
+typedef struct _Edje_Color_Class_Info Edje_Color_Class_Info;
typedef struct _Edje_Vibration_Sample Edje_Vibration_Sample;
typedef struct _Edje_Vibration_Directory Edje_Vibration_Directory;
@@ -656,7 +656,12 @@ struct _Edje_External_Directory_Entry
/*----------*/
-
+/*----------*/
+struct _Edje_Color_Class_Info
+{
+ Eina_List *colors;
+};
+/*----------*/
/*----------*/
@@ -2334,6 +2339,7 @@ EAPI void _edje_edd_shutdown(void);
EAPI extern Eet_Data_Descriptor *_edje_edd_edje_file;
EAPI extern Eet_Data_Descriptor *_edje_edd_edje_part_collection;
+EAPI extern Eet_Data_Descriptor *_edje_edd_edje_color_class_info;
extern Eina_Inlist *_edje_edjes;
diff --git a/src/lib/elementary/elm_theme.c b/src/lib/elementary/elm_theme.c
index 7a40a4d7e9..123bc0f14e 100644
--- a/src/lib/elementary/elm_theme.c
+++ b/src/lib/elementary/elm_theme.c
@@ -521,6 +521,80 @@ _elm_theme_shutdown(void)
}
}
+
+
+
+
+static Eina_List *
+_elm_theme_file_color_class_list(Eina_List *list,
+ Eina_Inlist *handles)
+{
+ Eina_Stringshare *c;
+ Eina_List *ccl;
+ Eina_List *ll;
+ Elm_Theme_File *etf;
+
+ EINA_INLIST_FOREACH(handles, etf)
+ {
+ ccl = edje_mmap_color_class_used_list(etf->handle);
+ EINA_LIST_FOREACH(ccl, ll, c)
+ {
+ list = eina_list_append(list, eina_stringshare_add(c));
+ }
+ edje_file_color_class_used_free(ccl);
+ }
+ return list;
+}
+
+static Eina_Bool
+_elm_theme_color_class_list_hash_cb(const Eina_Hash *hash EINA_UNUSED,
+ const void *key,
+ void *data EINA_UNUSED,
+ void *fdata)
+{
+ Eina_List **list = fdata;
+
+ *list = eina_list_append(*list, eina_stringshare_add(key));
+ return EINA_TRUE;
+}
+
+EAPI Eina_List *
+elm_theme_color_class_list(Elm_Theme *th)
+{
+ Eina_List *list;
+ Eina_Hash *hash;
+ const char *s;
+
+ if (!th) th = theme_default;
+ if (!th) return NULL;
+
+ // go through all possible theme files and find collections that match
+ list = _elm_theme_file_color_class_list(NULL, th->overlay);
+ list = _elm_theme_file_color_class_list(list, th->themes);
+ list = _elm_theme_file_color_class_list(list, th->extension);
+
+ hash = eina_hash_string_superfast_new(NULL);
+ EINA_LIST_FREE(list, s)
+ {
+ if (!eina_hash_find(hash, s)) eina_hash_add(hash, s, hash);
+ eina_stringshare_del(s);
+ }
+ eina_hash_foreach(hash, _elm_theme_color_class_list_hash_cb, &list);
+ eina_hash_free(hash);
+
+ // sort the list nicely at the end
+ list = eina_list_sort(list, 0, EINA_COMPARE_CB(strcmp));
+ return list;
+}
+
+EAPI void
+elm_theme_color_class_list_free(Eina_List *list)
+{
+ const char *s;
+
+ EINA_LIST_FREE(list, s) eina_stringshare_del(s);
+}
+
EAPI Elm_Theme *
elm_theme_new(void)
{
diff --git a/src/lib/elementary/elm_theme.h b/src/lib/elementary/elm_theme.h
index 7bf51d5b28..a5c55295da 100644
--- a/src/lib/elementary/elm_theme.h
+++ b/src/lib/elementary/elm_theme.h
@@ -79,6 +79,31 @@
typedef struct _Elm_Theme Elm_Theme;
/**
+ * Return a list of strings of color classes used in the given theme
+ *
+ * @param th The theme to get the reference from (NULL will be default)
+ * @return The list of color classes
+ *
+ * Free the returned list using elm_theme_color_class_list_free() when done.
+ *
+ * @ingroup Elm_Theme
+ * @sizne 1.26
+ */
+EAPI Eina_List *elm_theme_color_class_list(Elm_Theme *th);
+
+/**
+ * Free list of color classes used in the themes
+ *
+ * @param list The list to free
+ *
+ * Free the returned list returned from elm_theme_color_class_list()
+ *
+ * @ingroup Elm_Theme
+ * @sizne 1.26
+ */
+EAPI void elm_theme_color_class_list_free(Eina_List *list);
+
+/**
* Create a new specific theme
*
* This creates an empty specific theme that only uses the default theme. A