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;

-- 


Reply via email to