From f73a806868742cd2c0e6ae5debba1e51dcbb544b Mon Sep 17 00:00:00 2001 From: Simon Lees Date: Tue, 23 Nov 2021 15:56:55 +1030 Subject: [PATCH] Switch to using a color scheme per file. On Distro's we want to be able to ship color schemes as packages as such we need an easy way to add and remove them this commit implements the simplest possible solution of one color scheme per file. --- data/colorschemes/add_color_scheme.sh | 9 +- data/colorschemes/builder.sh | 18 +-- data/colorschemes/meson.build | 16 ++- src/bin/colors.c | 174 ++++++++++++-------------- 4 files changed, 103 insertions(+), 114 deletions(-) diff --git a/data/colorschemes/add_color_scheme.sh b/data/colorschemes/add_color_scheme.sh index 40d1ac03..1edf5c24 100755 --- a/data/colorschemes/add_color_scheme.sh +++ b/data/colorschemes/add_color_scheme.sh @@ -6,8 +6,6 @@ COMPRESS=1 EET=$1 shift -EET_FILE=$1 -shift INI=$1 shift @@ -22,9 +20,14 @@ TMP_DESC=$(mktemp "$NAME-DESC-XXXXXX") # trap to avoid creating orphan files trap 'rm -f "$TMP_DESC"' INT TERM HUP EXIT +NAME=$($GET_NAME "$INI") + +mkdir -p "data/colorschemes" +EET_FILE="data/colorschemes/$NAME.eet" + [ ! -w "$EET_FILE" ] && touch "$EET_FILE" -NAME=$($GET_NAME "$INI") +echo "Generating $EET_FILE" $INI2DESC "$INI" "$TMP_DESC" $EET -e "$EET_FILE" "$NAME" "$TMP_DESC" "$COMPRESS" diff --git a/data/colorschemes/builder.sh b/data/colorschemes/builder.sh index 6034ddb8..28e778ab 100755 --- a/data/colorschemes/builder.sh +++ b/data/colorschemes/builder.sh @@ -1,26 +1,14 @@ -#!/bin/sh +#!/bin/bash set -e set -u EET=$1 shift -OUTPUT=$1 -shift ADD_COLOR_SCHEME=$(dirname "$0")/add_color_scheme.sh -# work on a temporary file till every insertion worked -TMP_EET=$(mktemp "$OUTPUT-XXXXXX") -# trap to avoid creating orphan files -trap 'rm -f "$TMP_EET"' INT TERM HUP EXIT - for INI in "$@" do + echo "Building $INI" # use the name, without extension as key in eet - $ADD_COLOR_SCHEME "$EET" "$TMP_EET" "$INI" + $ADD_COLOR_SCHEME "$EET" "$INI" done - -# atomic rename to the expected output file -mv "$TMP_EET" "$OUTPUT" - -# file successfully renamed, so need to trap to rename temp file -trap - INT TERM HUP EXIT diff --git a/data/colorschemes/meson.build b/data/colorschemes/meson.build index 0c142587..87e4e082 100644 --- a/data/colorschemes/meson.build +++ b/data/colorschemes/meson.build @@ -21,18 +21,26 @@ colorschemes_desc = [ 'Tango Light.ini', 'Tomorrow Night Burns.ini', ] + +colorschemes_out = [] + +foreach c : colorschemes_desc + colorschemes_out += c.replace('ini','eet') +endforeach + cs_builder = [join_paths(meson.source_root(), 'data', 'colorschemes', 'builder.sh'), - eet_bin, '@OUTPUT@', '@INPUT@'] + eet_bin, '@INPUT@'] cs_install_dir = join_paths(get_option('datadir'), - meson.project_name()) + meson.project_name(), + 'colorschemes') -custom_target('colorschemes.eet', +custom_target('colorschemes', install:true, install_dir: cs_install_dir, install_mode: 'rw-r--r--', depend_files: ['builder.sh', 'ini2desc.py', 'get_name.py', 'add_color_scheme.sh'], command: cs_builder, input: colorschemes_desc, - output: 'colorschemes.eet') + output: colorschemes_out) diff --git a/src/bin/colors.c b/src/bin/colors.c index 79004a19..03072cad 100644 --- a/src/bin/colors.c +++ b/src/bin/colors.c @@ -659,7 +659,7 @@ _color_scheme_get_from_file(const char *path, const char *name) ef = eet_open(path, EET_FILE_MODE_READ); if (!ef) - return NULL; + return NULL; cs = eet_data_read(ef, edd_cs, name); eet_close(ef); @@ -676,12 +676,12 @@ _color_scheme_get(const char *name) Color_Scheme *cs_app; snprintf(path_user, sizeof(path_user) - 1, - "%s/terminology/" COLORSCHEMES_FILENAME, - efreet_config_home_get()); + "%s/terminology/colorschemes/%s.eet", + efreet_config_home_get(), name); snprintf(path_app, sizeof(path_app) - 1, - "%s/" COLORSCHEMES_FILENAME, - elm_app_data_dir_get()); + "%s/colorschemes/%s.eet", + elm_app_data_dir_get(), name); cs_user = _color_scheme_get_from_file(path_user, name); cs_app = _color_scheme_get_from_file(path_app, name); @@ -699,7 +699,10 @@ _color_scheme_get(const char *name) else if (cs_app) return cs_app; else - return NULL; + { + ERR("failed find colorscheme '%s'", name); + return NULL; + } } void @@ -731,104 +734,91 @@ 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_List *dir = NULL; + Eina_List *name_list = NULL; + Eina_List *search_paths = NULL; + static char buf[PATH_MAX] = ""; + char *file; + char *sp; + Eet_File *ef = NULL; Eina_Iterator *it = NULL; Eet_Entry *entry; - Color_Scheme *cs_user; - Color_Scheme *cs_app; + Color_Scheme *cs; + const char *current_name; - snprintf(path_user, sizeof(path_user) - 1, - "%s/terminology/" COLORSCHEMES_FILENAME, + /* Search homedir first, so color classes there get used */ + snprintf(buf, sizeof(buf) - 1, + "%s/terminology/colorchemes", efreet_config_home_get()); - - snprintf(path_app, sizeof(path_app) - 1, - "%s/" COLORSCHEMES_FILENAME, + search_paths = eina_list_append(search_paths, eina_stringshare_add(buf)); + snprintf(buf, sizeof(buf) - 1, + "%s/colorschemes", elm_app_data_dir_get()); + search_paths = eina_list_append(search_paths, eina_stringshare_add(buf)); + /* Add default theme */ - cs_app = malloc(sizeof(*cs_app)); - if (!cs_app) + cs = malloc(sizeof(*cs)); + if (!cs) return NULL; - memcpy(cs_app, &default_colorscheme, sizeof(*cs_app)); - l = eina_list_sorted_insert(l, color_scheme_cmp, cs_app); + memcpy(cs, &default_colorscheme, sizeof(*cs)); + l = eina_list_sorted_insert(l, color_scheme_cmp, cs); + /* Make sure default theme is the only theme */ + name_list = eina_list_append(name_list, eina_stringshare_add("Default")); - ef_app = eet_open(path_app, EET_FILE_MODE_READ); - if (!ef_app) - { - ERR("failed to open '%s'", path_app); - goto end; + EINA_LIST_FREE(search_paths, sp) + { + dir = ecore_file_ls(sp); + + EINA_LIST_FREE(dir, file) + { + snprintf(buf, sizeof(buf), "%s/%s", sp, file); + if ((!ecore_file_is_dir(buf)) && (ecore_file_size(buf) > 0)) + { + if (eina_str_has_extension(file, ".eet")) + { + ef = eet_open(buf, EET_FILE_MODE_READ); + if (!ef) + { + ERR("failed to open '%s'", buf); + continue; + } + it = eet_list_entries(ef); + if (!it) + { + ERR("failed to list entries in '%s'", buf); + continue; + } + EINA_ITERATOR_FOREACH(it, entry) + { + /* If we already have a cs with this name skip it */ + current_name = eina_stringshare_add(entry->name); + if (eina_list_data_find_list(name_list, current_name)) + { + WRN("Skipping loading '%s' from '%s' color scheme exists already", + entry->name, buf); + eina_stringshare_del(entry->name); + continue; + } + cs = eet_data_read(ef, edd_cs, entry->name); + if (!cs) + { + ERR("failed to load color scheme '%s' from '%s'", + entry->name, buf); + eina_stringshare_del(entry->name); + continue; + } + l = eina_list_sorted_insert(l, color_scheme_cmp, cs); + name_list = eina_list_append(name_list, current_name); + } + eet_close(ef); + } + } + free(file); + } } - ef_user = eet_open(path_user, EET_FILE_MODE_READ); - if (ef_user) - { - it = eet_list_entries(ef_user); - if (!it) - { - ERR("failed to list entries in '%s'", path_user); - goto end; - } - EINA_ITERATOR_FOREACH(it, entry) - { - cs_user = eet_data_read(ef_user, edd_cs, entry->name); - if (!cs_user) - { - ERR("failed to load color scheme '%s' from '%s'", - entry->name, path_user); - continue; - } - cs_app = eet_data_read(ef_app, edd_cs, entry->name); - if (cs_app) - { - /* Prefer user file */ - if (cs_user->md.version >= cs_app->md.version) - l = eina_list_sorted_insert(l, color_scheme_cmp, cs_user); - else - free(cs_user); - free(cs_app); - } - else - l = eina_list_sorted_insert(l, color_scheme_cmp, cs_user); - } - } - - it = eet_list_entries(ef_app); - if (!it) - { - ERR("failed to list entries in '%s'", path_app); - goto end; - } - EINA_ITERATOR_FOREACH(it, entry) - { - 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); - continue; - } - cs_user = eet_data_read(ef_user, edd_cs, entry->name); - if (cs_user) - { - /* Prefer user file if higher version */ - if (cs_user->md.version < cs_app->md.version) - l = eina_list_sorted_insert(l, color_scheme_cmp, cs_app); - else - free(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; }