tasn pushed a commit to branch master. http://git.enlightenment.org/tools/clouseau.git/commit/?id=bef368ce354f1b79e4a265b148409001dcea1495
commit bef368ce354f1b79e4a265b148409001dcea1495 Author: Tom Hacohen <t...@stosb.com> Date: Wed Nov 6 17:04:12 2013 +0000 client: made the config persistent. --- src/bin/Makefile.am | 4 +- src/bin/client/cfg.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++ src/bin/client/cfg.h | 25 ++++++++ src/bin/clouseau_client.c | 21 ++++--- 4 files changed, 189 insertions(+), 8 deletions(-) diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index e95cfd0..50517aa 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -3,7 +3,9 @@ MAINTAINERCLEANFILES = Makefile.in bin_PROGRAMS = clouseaud clouseau_client clouseaud_SOURCES = clouseaud.c -clouseau_client_SOURCES = clouseau_client.c +clouseau_client_SOURCES = \ + clouseau_client.c \ + client/cfg.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib \ diff --git a/src/bin/client/cfg.c b/src/bin/client/cfg.c new file mode 100644 index 0000000..1fcf633 --- /dev/null +++ b/src/bin/client/cfg.c @@ -0,0 +1,147 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <Eet.h> +#include <Efreet.h> + +#include "cfg.h" +#include "Clouseau.h" + +Clouseau_Cfg *_clouseau_cfg; +static Eet_Data_Descriptor * _clouseau_cfg_descriptor; +#define _CONFIG_ENTRY "config" + +static char *config_file = NULL; + +static void +_clouseau_cfg_descriptor_init(void) +{ + Eet_Data_Descriptor_Class eddc; + + EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, Clouseau_Cfg); + _clouseau_cfg_descriptor = eet_data_descriptor_stream_new(&eddc); + +#define CFG_ADD_BASIC(member, eet_type)\ + EET_DATA_DESCRIPTOR_ADD_BASIC\ + (_clouseau_cfg_descriptor, Clouseau_Cfg, # member, member, eet_type) + + CFG_ADD_BASIC(version, EET_T_UINT); + CFG_ADD_BASIC(show_hidden, EET_T_UCHAR); + CFG_ADD_BASIC(show_clippers, EET_T_UCHAR); + CFG_ADD_BASIC(show_elm_only, EET_T_UCHAR); + +#undef CFG_ADD_BASIC +} + +static void +_clouseau_cfg_descriptor_shutdown(void) +{ + eet_data_descriptor_free(_clouseau_cfg_descriptor); +} + +void +clouseau_cfg_shutdown(void) +{ + if (config_file) + free(config_file); + + _clouseau_cfg_descriptor_shutdown(); + + eet_shutdown(); + efreet_shutdown(); +} + +void +clouseau_cfg_init(const char *file) +{ + const char *ext = ".cfg"; + const char *path; + size_t len; + + efreet_init(); + eet_init(); + + path = efreet_config_home_get(); + if (!path || !file) + return; + + if (config_file) + free(config_file); + + len = strlen(path) + strlen(file) + strlen(ext) + 1; /* +1 for '/' */ + + config_file = malloc(len + 1); + snprintf(config_file, len + 1, "%s/%s%s", path, file, ext); + + _clouseau_cfg_descriptor_init(); +} + +static Clouseau_Cfg * +_clouseau_cfg_new(void) +{ + Clouseau_Cfg *ret; + ret = calloc(1, sizeof(*ret)); + + ret->version = _CLOUSEAU_CFG_VERSION; + /* Default values */ + ret->show_elm_only = EINA_TRUE; + ret->show_clippers = EINA_TRUE; + ret->show_hidden = EINA_TRUE; + + return ret; +} + +/* Return false on error. */ +Eina_Bool +clouseau_cfg_load(void) +{ + Eet_File *ef; + + if (!config_file) + goto end; + + ef = eet_open(config_file, EET_FILE_MODE_READ); + if (!ef) + { + /* FIXME Info message? create new config? */ + goto end; + } + + _clouseau_cfg = eet_data_read(ef, _clouseau_cfg_descriptor, _CONFIG_ENTRY); + +end: + if (!_clouseau_cfg) + { + _clouseau_cfg = _clouseau_cfg_new(); + } + + eet_close(ef); + return EINA_TRUE; +} + +/* Return false on error. */ +Eina_Bool +clouseau_cfg_save(void) +{ + Eet_File *ef; + Eina_Bool ret; + + if (!config_file) + return EINA_FALSE; + + + ef = eet_open(config_file, EET_FILE_MODE_WRITE); + if (!ef) + { + EINA_LOG_ERR("could not open '%s' for writing.", config_file); + return EINA_FALSE; + } + + ret = eet_data_write + (ef, _clouseau_cfg_descriptor, _CONFIG_ENTRY, _clouseau_cfg, EINA_TRUE); + eet_close(ef); + + return ret; +} + diff --git a/src/bin/client/cfg.h b/src/bin/client/cfg.h new file mode 100644 index 0000000..f65c4d7 --- /dev/null +++ b/src/bin/client/cfg.h @@ -0,0 +1,25 @@ +#ifndef _CFG_H +#define _CFG_H + +#include <Elementary.h> + +#define _CLOUSEAU_CFG_VERSION 1 + +void clouseau_cfg_init(const char *file); +void clouseau_cfg_shutdown(void); + +Eina_Bool clouseau_cfg_save(void); +Eina_Bool clouseau_cfg_load(void); + +typedef struct +{ + unsigned int version; + + Eina_Bool show_hidden; + Eina_Bool show_clippers; + Eina_Bool show_elm_only; +} Clouseau_Cfg; + +extern Clouseau_Cfg *_clouseau_cfg; + +#endif diff --git a/src/bin/clouseau_client.c b/src/bin/clouseau_client.c index 78b4ffe..7638dc5 100644 --- a/src/bin/clouseau_client.c +++ b/src/bin/clouseau_client.c @@ -6,6 +6,7 @@ #include <Ecore_Con_Eet.h> #include "Clouseau.h" +#include "client/cfg.h" #define CLIENT_NAME "Clouseau Client" @@ -95,7 +96,6 @@ static Eina_List *apps = NULL; /* List of (App_Data_St *) */ static Eina_List *bmp_req = NULL; /* List of (Bmp_Node *) */ static Elm_Genlist_Item_Class itc; -static Eina_Bool list_show_clippers = EINA_TRUE, list_show_hidden = EINA_TRUE; static Eina_Bool do_highlight = EINA_TRUE; static Ecore_Con_Reply *eet_svr = NULL; static Eina_Bool _add_callback_called = EINA_FALSE; @@ -994,8 +994,8 @@ gl_exp(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) EINA_LIST_FOREACH(parent->children, itr, treeit) { - if ((!list_show_hidden && !treeit->is_visible) || - (!list_show_clippers && treeit->is_clipper)) + if ((!_clouseau_cfg->show_hidden && !treeit->is_visible) || + (!_clouseau_cfg->show_clippers && treeit->is_clipper)) continue; Elm_Genlist_Item_Type iflag = (treeit->children) ? @@ -1356,7 +1356,7 @@ static void _show_clippers_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { - list_show_clippers = elm_check_state_get(obj); + _clouseau_cfg->show_clippers = elm_check_state_get(obj); _load_list(data); } @@ -1371,7 +1371,7 @@ static void _show_hidden_check_changed(void *data, Evas_Object *obj, void *event_info EINA_UNUSED) { - list_show_hidden = elm_check_state_get(obj); + _clouseau_cfg->show_hidden = elm_check_state_get(obj); _load_list(data); } @@ -1805,13 +1805,13 @@ _control_buttons_create(Gui_Elements *g, Evas_Object *win) show_hidden_check = elm_check_add(g->hbx); elm_object_text_set(show_hidden_check, "Show Hidden"); - elm_check_state_set(show_hidden_check, list_show_hidden); + elm_check_state_set(show_hidden_check, _clouseau_cfg->show_hidden); elm_box_pack_end(g->hbx, show_hidden_check); evas_object_show(show_hidden_check); show_clippers_check = elm_check_add(g->hbx); elm_object_text_set(show_clippers_check, "Show Clippers"); - elm_check_state_set(show_clippers_check, list_show_clippers); + elm_check_state_set(show_clippers_check, _clouseau_cfg->show_clippers); elm_box_pack_end(g->hbx, show_clippers_check); evas_object_show(show_clippers_check); @@ -2063,6 +2063,11 @@ main(int argc, char **argv) setenv("ELM_CLOUSEAU", "0", 1); elm_init(argc, argv); + + clouseau_cfg_init(PACKAGE_NAME); + clouseau_cfg_load(); + + if (argc == 2) gui->address = strdup(argv[1]); // if the user executes the client with ip and port in the arguments line gui->win = win = elm_win_util_standard_add("client", CLIENT_NAME); @@ -2205,6 +2210,8 @@ main(int argc, char **argv) free(gui); + clouseau_cfg_save(); + clouseau_cfg_shutdown(); elm_shutdown(); return 0; --