From c99069947ae2a7fe42af199ae24ca55c8c4b5543 Mon Sep 17 00:00:00 2001 From: Boris Faure Date: Sat, 10 Oct 2020 19:37:14 +0200 Subject: [PATCH] colors: add color_scheme_list() --- src/bin/colors.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/bin/colors.c b/src/bin/colors.c index 4791be4d..5f103532 100644 --- a/src/bin/colors.c +++ b/src/bin/colors.c @@ -13,7 +13,7 @@ static Color_Scheme default_colorscheme = .version = COLORSCHEMES_VERSION, .md = { .version = 1, - .name = "default", + .name = "Default", .author = gettext_noop("Terminology's developers"), .website = "https://www.enlightenment.org/about-terminology", .license = "BSD-2-Clause", @@ -718,6 +718,91 @@ color_scheme_get(const char *name) return NULL; } +static int +color_scheme_cmp(const void *d1, const void *d2) +{ + const Color_Scheme *cs1 = d1; + const Color_Scheme *cs2 = d2; + + return strcmp(cs1->md.name, cs2->md.name); +} + +Eina_List * +color_scheme_list(void) +{ + Eina_List *l = NULL; + static char path_user[PATH_MAX] = ""; + static char path_app[PATH_MAX] = ""; + Eet_File *ef_app = NULL; + Eet_File *ef_user = NULL; + Eina_Iterator *it = NULL; + Eet_Entry *entry; + + snprintf(path_user, sizeof(path_user) - 1, + "%s/terminology/" COLORSCHEMES_FILENAME, + efreet_config_home_get()); + + snprintf(path_app, sizeof(path_app) - 1, + "%s/" COLORSCHEMES_FILENAME, + elm_app_data_dir_get()); + + l = eina_list_sorted_insert(l, color_scheme_cmp, &default_colorscheme); + + ef_app = eet_open(path_app, EET_FILE_MODE_READ); + if (!ef_app) + { + ERR("failed to open '%s'", path_app); + goto end; + } + ef_user = eet_open(path_user, EET_FILE_MODE_READ); + + it = eet_list_entries(ef_app); + if (!it) + { + ERR("failed to list entries in '%s'", path_app); + goto end; + } + EINA_ITERATOR_FOREACH(it, entry) + { + Color_Scheme *cs_user; + Color_Scheme *cs_app; + + cs_app = eet_data_read(ef_app, edd_cs, entry->name); + if (!cs_app) + { + ERR("failed to load color scheme '%s' from '%s'", + entry->name, path_app); + } + cs_user = eet_data_read(ef_user, edd_cs, entry->name); + if (cs_user) + { + /* Prefer user file */ + if (cs_user->md.version >= cs_app->md.version) + { + l = eina_list_sorted_insert(l, color_scheme_cmp, cs_user); + free(cs_app); + } + else + { + l = eina_list_sorted_insert(l, color_scheme_cmp, cs_app); + free(cs_user); + } + } + else + { + l = eina_list_sorted_insert(l, color_scheme_cmp, cs_app); + } + } +end: + eina_iterator_free(it); + if (ef_app) + eet_close(ef_app); + if (ef_user) + eet_close(ef_user); + + return l; +} + void color_scheme_apply_from_config(Evas_Object *edje, const Config *config)