forked from enlightenment/terminology
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.
This commit is contained in:
parent
1adc9116f1
commit
f73a806868
|
@ -6,8 +6,6 @@ COMPRESS=1
|
||||||
|
|
||||||
EET=$1
|
EET=$1
|
||||||
shift
|
shift
|
||||||
EET_FILE=$1
|
|
||||||
shift
|
|
||||||
INI=$1
|
INI=$1
|
||||||
shift
|
shift
|
||||||
|
|
||||||
|
@ -22,9 +20,14 @@ TMP_DESC=$(mktemp "$NAME-DESC-XXXXXX")
|
||||||
# trap to avoid creating orphan files
|
# trap to avoid creating orphan files
|
||||||
trap 'rm -f "$TMP_DESC"' INT TERM HUP EXIT
|
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"
|
[ ! -w "$EET_FILE" ] && touch "$EET_FILE"
|
||||||
|
|
||||||
NAME=$($GET_NAME "$INI")
|
echo "Generating $EET_FILE"
|
||||||
|
|
||||||
$INI2DESC "$INI" "$TMP_DESC"
|
$INI2DESC "$INI" "$TMP_DESC"
|
||||||
$EET -e "$EET_FILE" "$NAME" "$TMP_DESC" "$COMPRESS"
|
$EET -e "$EET_FILE" "$NAME" "$TMP_DESC" "$COMPRESS"
|
||||||
|
|
|
@ -1,26 +1,14 @@
|
||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
EET=$1
|
EET=$1
|
||||||
shift
|
shift
|
||||||
OUTPUT=$1
|
|
||||||
shift
|
|
||||||
ADD_COLOR_SCHEME=$(dirname "$0")/add_color_scheme.sh
|
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 "$@"
|
for INI in "$@"
|
||||||
do
|
do
|
||||||
|
echo "Building $INI"
|
||||||
# use the name, without extension as key in eet
|
# use the name, without extension as key in eet
|
||||||
$ADD_COLOR_SCHEME "$EET" "$TMP_EET" "$INI"
|
$ADD_COLOR_SCHEME "$EET" "$INI"
|
||||||
done
|
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
|
|
||||||
|
|
|
@ -21,18 +21,26 @@ colorschemes_desc = [
|
||||||
'Tango Light.ini',
|
'Tango Light.ini',
|
||||||
'Tomorrow Night Burns.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(),
|
cs_builder = [join_paths(meson.source_root(),
|
||||||
'data', 'colorschemes', 'builder.sh'),
|
'data', 'colorschemes', 'builder.sh'),
|
||||||
eet_bin, '@OUTPUT@', '@INPUT@']
|
eet_bin, '@INPUT@']
|
||||||
cs_install_dir = join_paths(get_option('datadir'),
|
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:true,
|
||||||
install_dir: cs_install_dir,
|
install_dir: cs_install_dir,
|
||||||
install_mode: 'rw-r--r--',
|
install_mode: 'rw-r--r--',
|
||||||
depend_files: ['builder.sh', 'ini2desc.py', 'get_name.py', 'add_color_scheme.sh'],
|
depend_files: ['builder.sh', 'ini2desc.py', 'get_name.py', 'add_color_scheme.sh'],
|
||||||
command: cs_builder,
|
command: cs_builder,
|
||||||
input: colorschemes_desc,
|
input: colorschemes_desc,
|
||||||
output: 'colorschemes.eet')
|
output: colorschemes_out)
|
||||||
|
|
144
src/bin/colors.c
144
src/bin/colors.c
|
@ -676,12 +676,12 @@ _color_scheme_get(const char *name)
|
||||||
Color_Scheme *cs_app;
|
Color_Scheme *cs_app;
|
||||||
|
|
||||||
snprintf(path_user, sizeof(path_user) - 1,
|
snprintf(path_user, sizeof(path_user) - 1,
|
||||||
"%s/terminology/" COLORSCHEMES_FILENAME,
|
"%s/terminology/colorschemes/%s.eet",
|
||||||
efreet_config_home_get());
|
efreet_config_home_get(), name);
|
||||||
|
|
||||||
snprintf(path_app, sizeof(path_app) - 1,
|
snprintf(path_app, sizeof(path_app) - 1,
|
||||||
"%s/" COLORSCHEMES_FILENAME,
|
"%s/colorschemes/%s.eet",
|
||||||
elm_app_data_dir_get());
|
elm_app_data_dir_get(), name);
|
||||||
|
|
||||||
cs_user = _color_scheme_get_from_file(path_user, name);
|
cs_user = _color_scheme_get_from_file(path_user, name);
|
||||||
cs_app = _color_scheme_get_from_file(path_app, 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)
|
else if (cs_app)
|
||||||
return cs_app;
|
return cs_app;
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
ERR("failed find colorscheme '%s'", name);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -731,104 +734,91 @@ Eina_List *
|
||||||
color_scheme_list(void)
|
color_scheme_list(void)
|
||||||
{
|
{
|
||||||
Eina_List *l = NULL;
|
Eina_List *l = NULL;
|
||||||
static char path_user[PATH_MAX] = "";
|
Eina_List *dir = NULL;
|
||||||
static char path_app[PATH_MAX] = "";
|
Eina_List *name_list = NULL;
|
||||||
Eet_File *ef_app = NULL;
|
Eina_List *search_paths = NULL;
|
||||||
Eet_File *ef_user = NULL;
|
static char buf[PATH_MAX] = "";
|
||||||
|
char *file;
|
||||||
|
char *sp;
|
||||||
|
Eet_File *ef = NULL;
|
||||||
Eina_Iterator *it = NULL;
|
Eina_Iterator *it = NULL;
|
||||||
Eet_Entry *entry;
|
Eet_Entry *entry;
|
||||||
Color_Scheme *cs_user;
|
Color_Scheme *cs;
|
||||||
Color_Scheme *cs_app;
|
const char *current_name;
|
||||||
|
|
||||||
snprintf(path_user, sizeof(path_user) - 1,
|
/* Search homedir first, so color classes there get used */
|
||||||
"%s/terminology/" COLORSCHEMES_FILENAME,
|
snprintf(buf, sizeof(buf) - 1,
|
||||||
|
"%s/terminology/colorchemes",
|
||||||
efreet_config_home_get());
|
efreet_config_home_get());
|
||||||
|
search_paths = eina_list_append(search_paths, eina_stringshare_add(buf));
|
||||||
snprintf(path_app, sizeof(path_app) - 1,
|
snprintf(buf, sizeof(buf) - 1,
|
||||||
"%s/" COLORSCHEMES_FILENAME,
|
"%s/colorschemes",
|
||||||
elm_app_data_dir_get());
|
elm_app_data_dir_get());
|
||||||
|
|
||||||
|
search_paths = eina_list_append(search_paths, eina_stringshare_add(buf));
|
||||||
|
|
||||||
/* Add default theme */
|
/* Add default theme */
|
||||||
cs_app = malloc(sizeof(*cs_app));
|
cs = malloc(sizeof(*cs));
|
||||||
if (!cs_app)
|
if (!cs)
|
||||||
return NULL;
|
return NULL;
|
||||||
memcpy(cs_app, &default_colorscheme, sizeof(*cs_app));
|
memcpy(cs, &default_colorscheme, sizeof(*cs));
|
||||||
l = eina_list_sorted_insert(l, color_scheme_cmp, cs_app);
|
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);
|
EINA_LIST_FREE(search_paths, sp)
|
||||||
if (!ef_app)
|
|
||||||
{
|
{
|
||||||
ERR("failed to open '%s'", path_app);
|
dir = ecore_file_ls(sp);
|
||||||
goto end;
|
|
||||||
|
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);
|
||||||
ef_user = eet_open(path_user, EET_FILE_MODE_READ);
|
|
||||||
if (ef_user)
|
|
||||||
{
|
|
||||||
it = eet_list_entries(ef_user);
|
|
||||||
if (!it)
|
if (!it)
|
||||||
{
|
{
|
||||||
ERR("failed to list entries in '%s'", path_user);
|
ERR("failed to list entries in '%s'", buf);
|
||||||
goto end;
|
continue;
|
||||||
}
|
}
|
||||||
EINA_ITERATOR_FOREACH(it, entry)
|
EINA_ITERATOR_FOREACH(it, entry)
|
||||||
{
|
{
|
||||||
cs_user = eet_data_read(ef_user, edd_cs, entry->name);
|
/* If we already have a cs with this name skip it */
|
||||||
if (!cs_user)
|
current_name = eina_stringshare_add(entry->name);
|
||||||
|
if (eina_list_data_find_list(name_list, current_name))
|
||||||
{
|
{
|
||||||
ERR("failed to load color scheme '%s' from '%s'",
|
WRN("Skipping loading '%s' from '%s' color scheme exists already",
|
||||||
entry->name, path_user);
|
entry->name, buf);
|
||||||
|
eina_stringshare_del(entry->name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
cs_app = eet_data_read(ef_app, edd_cs, entry->name);
|
cs = eet_data_read(ef, edd_cs, entry->name);
|
||||||
if (cs_app)
|
if (!cs)
|
||||||
{
|
{
|
||||||
/* Prefer user file */
|
ERR("failed to load color scheme '%s' from '%s'",
|
||||||
if (cs_user->md.version >= cs_app->md.version)
|
entry->name, buf);
|
||||||
l = eina_list_sorted_insert(l, color_scheme_cmp, cs_user);
|
eina_stringshare_del(entry->name);
|
||||||
else
|
continue;
|
||||||
free(cs_user);
|
|
||||||
free(cs_app);
|
|
||||||
}
|
}
|
||||||
else
|
l = eina_list_sorted_insert(l, color_scheme_cmp, cs);
|
||||||
l = eina_list_sorted_insert(l, color_scheme_cmp, cs_user);
|
name_list = eina_list_append(name_list, current_name);
|
||||||
|
}
|
||||||
|
eet_close(ef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
eina_iterator_free(it);
|
||||||
if (ef_app)
|
|
||||||
eet_close(ef_app);
|
|
||||||
if (ef_user)
|
|
||||||
eet_close(ef_user);
|
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue