};
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);
}
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);
#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"
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";
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);
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
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
{
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);
return EINA_TRUE;
}
-void
+static void
_wkb_ibus_disconnect_free(void *data, void *func_data)
{
DBG("Finishing Eldbus Connection");