summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorHuang Peng <shawn.p.huang@gmail.com>2008-10-12 09:28:51 +0800
committerHuang Peng <shawn.p.huang@gmail.com>2008-10-12 09:28:51 +0800
commitf0ef83c293511c947033e803345892ac8c4ca56e (patch)
treec011ea333d16ab198fb7bfbfc8494e7c442b359c /lib
parent2b6cf32ad9f44a6c0b49b76687b78b30a138c707 (diff)
downloadibus-f0ef83c293511c947033e803345892ac8c4ca56e.tar.gz
ibus-f0ef83c293511c947033e803345892ac8c4ca56e.tar.xz
ibus-f0ef83c293511c947033e803345892ac8c4ca56e.zip
Convert IBusAttribute to (uuuu)
Diffstat (limited to 'lib')
-rw-r--r--lib/gtk2/ibusattribute.c103
-rw-r--r--lib/gtk2/ibusattribute.h70
-rw-r--r--lib/gtk2/ibusimclient.c40
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) {