diff options
-rw-r--r-- | lib/gtk2/ibusattribute.c | 103 | ||||
-rw-r--r-- | lib/gtk2/ibusattribute.h | 70 | ||||
-rw-r--r-- | lib/gtk2/ibusimclient.c | 40 |
3 files changed, 143 insertions, 70 deletions
diff --git a/lib/gtk2/ibusattribute.c b/lib/gtk2/ibusattribute.c index eb1e717..2237509 100644 --- a/lib/gtk2/ibusattribute.c +++ b/lib/gtk2/ibusattribute.c @@ -1,4 +1,4 @@ -/* vim:set et ts=4: */ +/* vim:set et sts=4: */ /* IBus - The Input Bus * Copyright (C) 2008-2009 Huang Peng <shawn.p.huang@gmail.com> * @@ -173,3 +173,104 @@ ibus_attr_list_get (IBusAttrList *attr_list, guint index) } return attr; } + +IBusAttribute * +ibus_attribute_from_dbus_message (DBusMessageIter *iter) +{ + gint type; + DBusMessageIter sub_iter; + + guint _type, value, start_index, end_index; + + type = dbus_message_iter_get_arg_type (iter); + g_return_val_if_fail (type == DBUS_TYPE_STRUCT, NULL); + + dbus_message_iter_recurse (iter, &sub_iter); + + g_return_val_if_fail (dbus_message_iter_get_arg_type (&sub_iter) == DBUS_TYPE_UINT32, NULL); + dbus_message_iter_get_basic (&sub_iter, &_type); + dbus_message_iter_next (&sub_iter); + + g_return_val_if_fail (dbus_message_iter_get_arg_type (&sub_iter) == DBUS_TYPE_UINT32, NULL); + dbus_message_iter_get_basic (&sub_iter, &value); + dbus_message_iter_next (&sub_iter); + + g_return_val_if_fail (dbus_message_iter_get_arg_type (&sub_iter) == DBUS_TYPE_UINT32, NULL); + dbus_message_iter_get_basic (&sub_iter, &start_index); + dbus_message_iter_next (&sub_iter); + + g_return_val_if_fail (dbus_message_iter_get_arg_type (&sub_iter) == DBUS_TYPE_UINT32, NULL); + dbus_message_iter_get_basic (&sub_iter, &end_index); + dbus_message_iter_next (&sub_iter); + + dbus_message_iter_next (iter); + + return ibus_attribute_new (_type, value, start_index, end_index); +} + +IBusAttrList * +ibus_attr_list_from_dbus_message (DBusMessageIter *iter) +{ + gint type; + DBusMessageIter sub_iter; + IBusAttrList *attr_list; + + type = dbus_message_iter_get_arg_type (iter); + g_return_val_if_fail (type == DBUS_TYPE_ARRAY, NULL); + + attr_list = ibus_attr_list_new (); + + dbus_message_iter_recurse (iter, &sub_iter); + + while (dbus_message_iter_get_arg_type (&sub_iter) != DBUS_TYPE_INVALID) { + IBusAttribute *attr = ibus_attribute_from_dbus_message (&sub_iter); + if (attr == NULL) + break; + ibus_attr_list_append (attr_list, attr); + } + + dbus_message_iter_next (iter); + return attr_list; +} + +gboolean +ibus_attribute_to_dbus_message (IBusAttribute *attr, DBusMessageIter *iter) +{ + g_assert (attr != NULL); + g_assert (iter != NULL); + + DBusMessageIter sub_iter; + + dbus_message_iter_open_container(iter, DBUS_TYPE_STRUCT, 0, &sub_iter); + dbus_message_iter_append_basic (&sub_iter, DBUS_TYPE_UINT32, &attr->type); + dbus_message_iter_append_basic (&sub_iter, DBUS_TYPE_UINT32, &attr->value); + dbus_message_iter_append_basic (&sub_iter, DBUS_TYPE_UINT32, &attr->start_index); + dbus_message_iter_append_basic (&sub_iter, DBUS_TYPE_UINT32, &attr->end_index); + dbus_message_iter_close_container (iter, &sub_iter); + + return TRUE; +} + + +gboolean +ibus_attr_list_to_dbus_message (IBusAttrList *attr_list, DBusMessageIter *iter) +{ + g_assert (attr_list != NULL); + g_assert (iter != NULL); + + gint i; + DBusMessageIter sub_iter; + + dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "(uuuu)", &sub_iter); + for (i = 0;; i++) { + IBusAttribute *attr = ibus_attr_list_get (attr_list, i); + if (attr == NULL) + break; + ibus_attribute_to_dbus_message (attr, &sub_iter); + } + dbus_message_iter_close_container (iter, &sub_iter); + return TRUE; +} + + + diff --git a/lib/gtk2/ibusattribute.h b/lib/gtk2/ibusattribute.h index 8ed1b09..4678522 100644 --- a/lib/gtk2/ibusattribute.h +++ b/lib/gtk2/ibusattribute.h @@ -1,4 +1,4 @@ -/* vim:set et ts=4: */ +/* vim:set et sts=4: */ /* IBus - The Input Bus * Copyright (C) 2008-2009 Huang Peng <shawn.p.huang@gmail.com> * @@ -21,6 +21,7 @@ #define __IBUS_ATTRIBUTE_H_ #include <glib-object.h> +#include <dbus/dbus.h> /* * Type macros. @@ -51,40 +52,49 @@ struct _IBusAttribute { }; struct _IBusAttrList { - gint refcount; + gint refcount; GArray *attributes; }; -GType ibus_attribute_get_type (); -IBusAttribute *ibus_attribute_new (guint type, - guint value, - guint start_index, - guint end_index); -IBusAttribute *ibus_attribute_copy (IBusAttribute - *attr); -void ibus_attribute_free (IBusAttribute - *attr); -IBusAttribute *ibus_attr_underline_new (guint underline_type, - guint start_index, - guint end_index); -IBusAttribute *ibus_attr_foreground_new (guint color, - guint start_index, - guint end_index); -IBusAttribute *ibus_attr_background_new (guint color, - guint start_index, - guint end_index); - -GType ibus_attr_list_get_type (); -IBusAttrList *ibus_attr_list_new (); -IBusAttrList *ibus_attr_list_copy (IBusAttrList *attr_list); -IBusAttrList *ibus_attr_list_ref (IBusAttrList *attr_list); -void ibus_attr_list_unref (IBusAttrList *attr_list); -void ibus_attr_list_append (IBusAttrList *attr_list, - IBusAttribute *attr); -IBusAttribute *ibus_attr_list_get (IBusAttrList *attr_list, - guint index); +GType ibus_attribute_get_type (); +IBusAttribute *ibus_attribute_new (guint type, + guint value, + guint start_index, + guint end_index); +IBusAttribute *ibus_attribute_copy (IBusAttribute + *attr); +void ibus_attribute_free (IBusAttribute + *attr); +IBusAttribute *ibus_attr_underline_new (guint underline_type, + guint start_index, + guint end_index); +IBusAttribute *ibus_attr_foreground_new (guint color, + guint start_index, + guint end_index); +IBusAttribute *ibus_attr_background_new (guint color, + guint start_index, + guint end_index); +IBusAttribute *ibus_attribute_from_dbus_message + (DBusMessageIter *iter); +gboolean ibus_attribute_to_dbus_message + (IBusAttribute *attr, + DBusMessageIter *iter); +GType ibus_attr_list_get_type (); +IBusAttrList *ibus_attr_list_new (); +IBusAttrList *ibus_attr_list_copy (IBusAttrList *attr_list); +IBusAttrList *ibus_attr_list_ref (IBusAttrList *attr_list); +void ibus_attr_list_unref (IBusAttrList *attr_list); +void ibus_attr_list_append (IBusAttrList *attr_list, + IBusAttribute *attr); +IBusAttribute *ibus_attr_list_get (IBusAttrList *attr_list, + guint index); +IBusAttrList *ibus_attr_list_from_dbus_message + (DBusMessageIter *iter); +gboolean ibus_attr_list_to_dbus_message + (IBusAttrList *attr_list, + DBusMessageIter *iter); G_END_DECLS #endif diff --git a/lib/gtk2/ibusimclient.c b/lib/gtk2/ibusimclient.c index 3337c35..31de0a8 100644 --- a/lib/gtk2/ibusimclient.c +++ b/lib/gtk2/ibusimclient.c @@ -1089,45 +1089,7 @@ _ibus_signal_update_preedit_handler (DBusConnection *connection, DBusMessage *me return; } - dbus_message_iter_recurse (&iter, &sub_iter); - - if (dbus_message_iter_get_arg_type (&sub_iter) != DBUS_TYPE_INVALID) { - if (dbus_message_iter_get_arg_type (&sub_iter) != DBUS_TYPE_ARRAY || - dbus_message_iter_get_element_type (&sub_iter) != DBUS_TYPE_UINT32 ) { - g_warning ("The 3rd argument of UpdatePreedit signal must be a Struct Array"); - return; - } - - attrs = ibus_attr_list_new (); - - while ((sub_type = dbus_message_iter_get_arg_type (&sub_iter) != DBUS_TYPE_INVALID)) { - IBusAttribute *attr; - DBusMessageIter sub_sub_iter; - guint *values = NULL; - gint length = 0; - dbus_message_iter_recurse (&sub_iter, &sub_sub_iter); - dbus_message_iter_get_fixed_array (&sub_sub_iter, &values, &length); - - if (length <= 0) { - g_warning ("The element of the 3rd argument of UpdatePreedit should not be a empty array"); - continue; - } - - switch (values[0]) { - case IBUS_ATTR_TYPE_UNDERLINE: /* Underline */ - case IBUS_ATTR_TYPE_FOREGROUND: /* Foreground Color */ - case IBUS_ATTR_TYPE_BACKGROUND: /* Background Color */ - attr = ibus_attribute_new (values[0], values[1], values[2], values[3]); - ibus_attr_list_append (attrs, attr); - break; - default: - g_warning ("Unkown type attribute type = %d", values[0]); - } - - dbus_message_iter_next (&sub_iter); - } - } - dbus_message_iter_next (&iter); + attrs = ibus_attr_list_from_dbus_message (&iter); type = dbus_message_iter_get_arg_type (&iter); if (type != DBUS_TYPE_INT32) { |