#include "private.h" #include #include "config.h" #define CONF_VER 1 #define LIM(v, min, max) {if (v >= max) v = max; else if (v <= min) v = min;} static Eet_Data_Descriptor *edd_base = NULL; static const char * _config_home_get(void) { #ifdef ELM_EFREET return efreet_config_home_get(); #else static char path[PATH_MAX] = ""; const char *v = getenv("XDG_CONFIG_HOME"); if (v) eina_strlcpy(path, v, sizeof(path)); else { v = getenv("HOME"); if (v) snprintf(path, sizeof(path), "%s/.config", v); else { if (!v) v = getenv("TMP"); if (!v) v = "/tmp"; eina_strlcpy(path, v, sizeof(path)); } } return path; #endif } void config_init(void) { Eet_Data_Descriptor_Class eddc; elm_need_efreet(); eet_eina_stream_data_descriptor_class_set (&eddc, sizeof(eddc), "Config", sizeof(Config)); edd_base = eet_data_descriptor_stream_new(&eddc); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "version", version, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "font.name", font.name, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "font.size", font.size, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "font.bitmap", font.bitmap, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "helper.email", helper.email, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "helper.url.general", helper.url.general, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "helper.url.video", helper.url.video, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "helper.url.image", helper.url.image, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "helper.local.general", helper.local.general, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "helper.local.video", helper.local.video, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "helper.local.image", helper.local.image, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "helper.inline_please", helper.inline_please, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "theme", theme, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "background", background, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "wordsep", wordsep, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "scrollback", scrollback, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "vidmod", vidmod, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "jump_on_change", jump_on_change, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "jump_on_keypress", jump_on_keypress, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "flicker_on_key", flicker_on_key, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "disable_cursor_blink", disable_cursor_blink, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "translucent", translucent, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "mute", mute, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC (edd_base, Config, "urg_bell", urg_bell, EET_T_UCHAR); } void config_shutdown(void) { if (edd_base) { eet_data_descriptor_free(edd_base); edd_base = NULL; } } void config_save(const Config *config, const char *key) { Eet_File *ef; char buf[PATH_MAX], buf2[PATH_MAX]; const char *cfgdir; int ok; EINA_SAFETY_ON_NULL_RETURN(config); if (config->temporary) return; if (!key) key = config->config_key; cfgdir = _config_home_get(); snprintf(buf, sizeof(buf), "%s/terminology/config/standard", cfgdir); ecore_file_mkpath(buf); snprintf(buf, sizeof(buf), "%s/terminology/config/standard/base.cfg.tmp", cfgdir); snprintf(buf2, sizeof(buf2), "%s/terminology/config/standard/base.cfg", cfgdir); ef = eet_open(buf, EET_FILE_MODE_WRITE); if (ef) { ok = eet_data_write(ef, edd_base, key, config, 1); eet_close(ef); if (ok) ecore_file_mv(buf, buf2); } } Config * config_load(const char *key) { Eet_File *ef; char buf[PATH_MAX]; const char *cfgdir; Config *config = NULL; EINA_SAFETY_ON_NULL_RETURN_VAL(key, NULL); cfgdir = _config_home_get(); snprintf(buf, sizeof(buf), "%s/terminology/config/standard/base.cfg", cfgdir); ef = eet_open(buf, EET_FILE_MODE_READ); if (ef) { config = eet_data_read(ef, edd_base, key); eet_close(ef); if (config) { if (config->version < CONF_VER) { // currently no upgrade path so reset config. config_del(config); config = NULL; } else { LIM(config->font.size, 3, 400); LIM(config->scrollback, 0, 200000); LIM(config->vidmod, 0, 3) } } } if (!config) { const Eina_Unicode sep[] = { // invisible spaces ' ', 0xa0, 0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x200b, 0x202f, 0x205f, 0x3000, 0xfeff, // visible spaces 0x2420, 0x2422, 0x2423, // other chars '\'', '"', '(', ')', '[', ']', '{', '}', '=', '*', '!', '#', '$', '^', '\\', ':', ';', ',', '?', '`', 0 }; char *s; int slen = 0; config = calloc(1, sizeof(Config)); if (config) { config->version = CONF_VER; config->font.bitmap = EINA_TRUE; config->font.name = eina_stringshare_add("nexus.pcf"); config->font.size = 10; config->helper.email = eina_stringshare_add("xdg-email");; config->helper.url.general = eina_stringshare_add("xdg-open"); config->helper.url.video = eina_stringshare_add("xdg-open"); config->helper.url.image = eina_stringshare_add("xdg-open"); config->helper.local.general = eina_stringshare_add("xdg-open"); config->helper.local.video = eina_stringshare_add("xdg-open"); config->helper.local.image = eina_stringshare_add("xdg-open"); config->helper.inline_please = EINA_TRUE; config->scrollback = 2000; config->theme = eina_stringshare_add("default.edj"); config->background = NULL; config->translucent = EINA_FALSE; config->jump_on_change = EINA_TRUE; config->jump_on_keypress = EINA_TRUE; config->flicker_on_key = EINA_TRUE; config->disable_cursor_blink = EINA_FALSE; s = eina_unicode_unicode_to_utf8(sep, &slen); if (s) { config->wordsep = eina_stringshare_add(s); free(s); } config->vidmod = 0; config->mute = EINA_FALSE; config->urg_bell = EINA_TRUE; } } config->config_key = eina_stringshare_add(key); /* not in eet */ return config; } void config_del(Config *config) { if (!config) return; eina_stringshare_del(config->font.name); eina_stringshare_del(config->theme); eina_stringshare_del(config->background); eina_stringshare_del(config->wordsep); eina_stringshare_del(config->helper.email); eina_stringshare_del(config->helper.url.general); eina_stringshare_del(config->helper.url.video); eina_stringshare_del(config->helper.url.image); eina_stringshare_del(config->helper.local.general); eina_stringshare_del(config->helper.local.video); eina_stringshare_del(config->helper.local.image); eina_stringshare_del(config->config_key); /* not in eet */ free(config); } const char * config_theme_path_get(const Config *config) { static char path[PATH_MAX]; EINA_SAFETY_ON_NULL_RETURN_VAL(config, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(config->theme, NULL); if (strchr(config->theme, '/')) return config->theme; snprintf(path, sizeof(path), "%s/themes/%s", elm_app_data_dir_get(), config->theme); return path; } const char * config_theme_path_default_get(const Config *config __UNUSED__) { static char path[PATH_MAX] = ""; EINA_SAFETY_ON_NULL_RETURN_VAL(config, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(config->theme, NULL); if (path[0]) return path; snprintf(path, sizeof(path), "%s/themes/default.edj", elm_app_data_dir_get()); return path; }