Properly handle 'ValueChanged' config signal
authorEduardo Lima (Etrunko) <eduardo.lima@intel.com>
Fri, 17 Oct 2014 20:26:29 +0000 (17:26 -0300)
committerEduardo Lima (Etrunko) <eduardo.lima@intel.com>
Mon, 27 Oct 2014 20:47:25 +0000 (18:47 -0200)
With this patch, we emit a new event to the ecore mailoop whenever a
configuration value changes. Also, if it is the case of a theme change,
a specific event is emmited.

Change-Id: Ia367d702545b48c777b9e2c60ab833b8d206e6aa
Signed-off-by: Eduardo Lima (Etrunko) <eduardo.lima@intel.com>
src/wkb-ibus-config-eet.c
src/wkb-ibus-config-key.c
src/wkb-ibus-config.c
src/wkb-ibus.c
src/wkb-ibus.h

index 0ca56ab7bae692d0ad77ff7fc00eac25137fc9df..dbcee54f8ff0d897c0d5a00c62430a898470feef 100644 (file)
@@ -885,18 +885,61 @@ struct wkb_ibus_config_eet
 };
 
 static void
-_config_eet_value_changed(struct wkb_ibus_config_eet *config_eet, const char *section, const char *name, Eldbus_Message_Iter *value)
+_config_eet_value_changed(struct wkb_ibus_config_eet *config_eet, struct wkb_config_key *key)
 {
-   Eldbus_Message *signal = eldbus_service_signal_new(config_eet->iface, 0);
-   Eldbus_Message_Iter *iter = eldbus_message_iter_get(signal);
+   Eldbus_Message *signal;
+   Eldbus_Message_Iter *value, *iter;
+   const char *sig;
 
-   if (!value)
+   signal = eldbus_service_signal_new(config_eet->iface, 0);
+   iter = eldbus_message_iter_get(signal);
+   eldbus_message_iter_arguments_append(iter, "ss", wkb_config_key_section(key), wkb_config_key_id(key));
+
+   sig = wkb_config_key_signature(key);
+   switch (*sig)
      {
-        value = eldbus_message_iter_container_new(iter, 'v', NULL);
-        eldbus_message_iter_container_close(iter, value);
+      case 's':
+           {
+              value = eldbus_message_iter_container_new(iter, 'v', sig);
+              eldbus_message_iter_basic_append(value, 's', wkb_config_key_get_string(key));
+              break;
+           }
+      case 'i':
+           {
+              value = eldbus_message_iter_container_new(iter, 'v', sig);
+              eldbus_message_iter_basic_append(value, 'i', wkb_config_key_get_int(key));
+              break;
+           }
+      case 'b':
+           {
+              value = eldbus_message_iter_container_new(iter, 'v', sig);
+              eldbus_message_iter_basic_append(value, 'b', wkb_config_key_get_bool(key));
+              break;
+           }
+      case 'a':
+           {
+              char **s, **slist = wkb_config_key_get_string_list(key);
+              Eldbus_Message_Iter *array;
+
+              value = eldbus_message_iter_container_new(iter, 'v', "as");
+              array = eldbus_message_iter_container_new(value, 'a', "s");
+
+              for (s = slist; *s != NULL; ++s)
+                 eldbus_message_iter_arguments_append(array, "s", s);
+
+              eldbus_message_iter_container_close(value, array);
+
+              free(slist);
+              break;
+           }
+      default:
+           {
+              value = eldbus_message_iter_container_new(iter, 'v', NULL);
+              break;
+           }
      }
 
-   eldbus_message_iter_arguments_append(iter, "ssv", section, name, value);
+   eldbus_message_iter_container_close(iter, value);
    eldbus_service_signal_send(config_eet->iface, signal);
 }
 
@@ -986,7 +1029,7 @@ wkb_ibus_config_eet_set_value(struct wkb_ibus_config_eet *config_eet, const char
         goto end;
      }
 
-   _config_eet_value_changed(config_eet, section, name, value);
+   _config_eet_value_changed(config_eet, key);
 
    top = _config_section_toplevel(sec);
    ret = wkb_ibus_config_section_write(config_eet, top);
index 1429c867e88566b23919e44a921720b74dd309ae..78a2db2272eceb62eddc720f0d584ada317745e3 100644 (file)
@@ -120,14 +120,15 @@ _key_string_set(struct wkb_config_key *key, Eldbus_Message_Iter *iter)
         ERR("Error decoding string value using 's'");
         return EINA_FALSE;
      }
-   DBG("Setting key <%s> to <%s>", key->id, str);
 
    if ((field = (const char **) key->field))
       _key_string_free(field);
 
-   if (str && strlen(str))
+   if (str)
       *field = eina_stringshare_add(str);
 
+   INF("Setting key <%s/%s> to <%s>", key->section, key->id, *field);
+
    return EINA_TRUE;
 }
 
index b121cdcd8599004af70c899759eb9949552d3b63..63bf846c96c49caecac96d50fa49c60eb2016258 100644 (file)
@@ -109,7 +109,7 @@ _config_set_value(const Eldbus_Service_Interface *iface, const Eldbus_Message *m
 
    wkb_ibus_config_eet_set_value(_conf_eet, section, name, value);
 
-   return NULL;
+   return eldbus_message_method_return_new(msg);
 }
 
 static Eldbus_Message *
@@ -177,7 +177,7 @@ _config_unset_value(const Eldbus_Service_Interface *iface, const Eldbus_Message
 
    wkb_ibus_config_eet_set_value(_conf_eet, section, name, NULL);
 
-   return NULL;
+   return eldbus_message_method_return_new(msg);
 }
 
 static const Eldbus_Method _wkb_ibus_config_methods[] =
index 5c1c3eb2c0e678cbe4a53af0edabe3bf2a6cc092..b166f745efa001a2a326972298c94265e7a026c4 100644 (file)
@@ -30,7 +30,9 @@
 #include "wkb-ibus-defs.h"
 #include "wkb-ibus-helper.h"
 #include "wkb-log.h"
+#include "wkb-ibus-config.h"
 #include "wkb-ibus-config-eet.h"
+#include "wkb-ibus-config-key.h"
 
 #include "input-method-client-protocol.h"
 
@@ -48,6 +50,8 @@
 
 int WKB_IBUS_CONNECTED = 0;
 int WKB_IBUS_DISCONNECTED = 0;
+int WKB_IBUS_CONFIG_VALUE_CHANGED = 0;
+int WKB_THEME_CHANGED = 0;
 
 static const char *IBUS_ADDRESS_ENV = "IBUS_ADDRESS";
 static const char *IBUS_ADDRESS_CMD = "ibus address";
@@ -107,11 +111,41 @@ struct _wkb_ibus_context
 
 static struct _wkb_ibus_context *wkb_ibus = NULL;
 
+static void
+_wkb_theme_changed_end_cb(void *data, void *func_data)
+{
+   const char *theme = (const char *) data;
+   eina_stringshare_del(theme);
+}
+
+static void
+_wkb_config_theme_changed(struct wkb_config_key *key)
+{
+   const char *theme;
+   if (!(theme = wkb_config_key_get_string(key)))
+     {
+       DBG("Error retrieving theme value");
+       return;
+     }
+
+   DBG("New theme '%s'", theme);
+   eina_stringshare_ref(theme);
+   ecore_event_add(WKB_THEME_CHANGED, (void *) theme, _wkb_theme_changed_end_cb, (void *) theme);
+}
+
+static void
+_wkb_config_value_changed_end_cb(void *data, void *func_data)
+{
+   /* do nothing. this function only exists because if we do not define
+    * a callback, smart ecore will free data passed to the event. */
+}
+
 static void
 _wkb_config_value_changed_cb(void *data, const Eldbus_Message *msg)
 {
    const char *section, *name;
    Eldbus_Message_Iter *value;
+   struct wkb_config_key *key;
 
    _check_message_errors(msg);
 
@@ -121,7 +155,20 @@ _wkb_config_value_changed_cb(void *data, const Eldbus_Message *msg)
         return;
      }
 
-   DBG("section: '%s', name: '%s', value: '%p", section, name, value);
+   INF("ValueChanged: section: '%s', name: '%s'", section, name);
+
+   /* Emit general CONFIG_VALUE_CHANGED event */
+   if (!(key = wkb_ibus_config_get_key(section, name)))
+     {
+        ERR("Config key '%s' or section '%s' not found", section, name);
+        return;
+     }
+
+   ecore_event_add(WKB_IBUS_CONFIG_VALUE_CHANGED, key, _wkb_config_value_changed_end_cb, NULL);
+
+   /* If theme changed, emit specific THEME_CHANGED event */
+   if (strncmp(section, "weekeyboard", strlen("weekeyboard")) == 0 && strncmp(name, "theme", strlen("theme")) == 0)
+      _wkb_config_theme_changed(key);
 }
 
 static void
@@ -156,6 +203,12 @@ _wkb_name_acquired_cb(void *data, const Eldbus_Message *msg)
         wkb_ibus->config = wkb_ibus_config_register(wkb_ibus->conn, path);
         eina_stringshare_del(path);
         INF("Registering Config Interface: %s", wkb_ibus->config ? "Success" : "Fail");
+        if (wkb_ibus->config)
+          {
+             Eldbus_Object *obj = eldbus_object_get(wkb_ibus->conn, IBUS_SERVICE_CONFIG, IBUS_PATH_CONFIG);
+             Eldbus_Proxy *config = eldbus_proxy_get(obj, IBUS_INTERFACE_CONFIG);
+             eldbus_proxy_signal_handler_add(config, "ValueChanged", _wkb_config_value_changed_cb, wkb_ibus);
+          }
      }
    else
      {
@@ -518,6 +571,8 @@ wkb_ibus_init(void)
 
    WKB_IBUS_CONNECTED = ecore_event_type_new();
    WKB_IBUS_DISCONNECTED = ecore_event_type_new();
+   WKB_IBUS_CONFIG_VALUE_CHANGED = ecore_event_type_new();
+   WKB_THEME_CHANGED = ecore_event_type_new();
 
    wkb_ibus->add_handle = ecore_event_handler_add(ECORE_EXE_EVENT_ADD, _wkb_ibus_exe_add_cb, NULL);
    wkb_ibus->data_handle = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _wkb_ibus_exe_data_cb, NULL);
@@ -584,7 +639,7 @@ wkb_ibus_shutdown(void)
    return EINA_TRUE;
 }
 
-void
+static void
 _wkb_ibus_disconnect_free(void *data, void *func_data)
 {
    DBG("Finishing Eldbus Connection");
index 8a2512d4210304c6622a39f40f732ad6aa79ef49..6ff30382ebdf429cb5cd714b68c85a7de1bae962 100644 (file)
@@ -29,6 +29,8 @@ struct wl_input_method_context;
 /* Events */
 extern int WKB_IBUS_CONNECTED;
 extern int WKB_IBUS_DISCONNECTED;
+extern int WKB_IBUS_CONFIG_VALUE_CHANGED;
+extern int WKB_THEME_CHANGED;
 
 int wkb_ibus_init(void);
 Eina_Bool wkb_ibus_shutdown(void);