From cc0015e69135436330d0acabcf9c51d64acd36f2 Mon Sep 17 00:00:00 2001 From: "Eduardo Lima (Etrunko)" Date: Fri, 17 Oct 2014 17:26:29 -0300 Subject: [PATCH] Properly handle 'ValueChanged' config signal 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) --- src/wkb-ibus-config-eet.c | 59 +++++++++++++++++++++++++++++++++------ src/wkb-ibus-config-key.c | 5 ++-- src/wkb-ibus-config.c | 4 +-- src/wkb-ibus.c | 59 +++++++++++++++++++++++++++++++++++++-- src/wkb-ibus.h | 2 ++ 5 files changed, 115 insertions(+), 14 deletions(-) diff --git a/src/wkb-ibus-config-eet.c b/src/wkb-ibus-config-eet.c index 0ca56ab..dbcee54 100644 --- a/src/wkb-ibus-config-eet.c +++ b/src/wkb-ibus-config-eet.c @@ -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); diff --git a/src/wkb-ibus-config-key.c b/src/wkb-ibus-config-key.c index 1429c86..78a2db2 100644 --- a/src/wkb-ibus-config-key.c +++ b/src/wkb-ibus-config-key.c @@ -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; } diff --git a/src/wkb-ibus-config.c b/src/wkb-ibus-config.c index b121cdc..63bf846 100644 --- a/src/wkb-ibus-config.c +++ b/src/wkb-ibus-config.c @@ -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[] = diff --git a/src/wkb-ibus.c b/src/wkb-ibus.c index 5c1c3eb..b166f74 100644 --- a/src/wkb-ibus.c +++ b/src/wkb-ibus.c @@ -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"); diff --git a/src/wkb-ibus.h b/src/wkb-ibus.h index 8a2512d..6ff3038 100644 --- a/src/wkb-ibus.h +++ b/src/wkb-ibus.h @@ -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); -- 2.34.1