tdawson / rpms / ibus

Forked from rpms/ibus 3 years ago
Clone
Blob Blame History Raw
diff --git a/autogen.sh b/autogen.sh
index c34acab..addc0bd 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -2,13 +2,13 @@
 set -e
 set -x
 
-autopoint  --force
-libtoolize --automake --copy --force
-gtkdocize  --copy #--flavour=no-tmpl
-aclocal -I m4 --force
-autoheader --force
-automake --add-missing --copy --force
-autoconf --force
+autopoint  --force || exit 1
+libtoolize --automake --copy --force || exit 1
+gtkdocize  --copy || exit 1 #--flavour=no-tmpl
+aclocal -I m4 --force || exit 1
+autoheader --force || exit 1
+automake --add-missing --copy --force || exit 1
+autoconf --force || exit 1
 export CFLAGS="-Wall -g -O0 -Wl,--no-undefined"
 export CXXFLAGS="$CFLAGS"
-./configure --enable-maintainer-mode $*
+./configure --enable-maintainer-mode $* || exit 1
diff --git a/bus/engineproxy.c b/bus/engineproxy.c
index 647845b..e78fbcf 100644
--- a/bus/engineproxy.c
+++ b/bus/engineproxy.c
@@ -541,7 +541,11 @@ bus_engine_proxy_process_key_event_reply_cb (IBusPendingCall *pending,
 
     reply_message = dbus_pending_call_steal_reply (pending);
 
-    if ((error = ibus_error_new_from_message (reply_message)) != NULL) {
+    if (reply_message == NULL) {
+        call_data->func(FALSE, call_data->user_data);
+        return;
+    }
+    else if ((error = ibus_error_new_from_message (reply_message)) != NULL) {
         g_warning ("%s: %s", error->name, error->message);
         ibus_message_unref (reply_message);
         ibus_error_free (error);
diff --git a/bus/inputcontext.c b/bus/inputcontext.c
index 4d66232..723f3af 100644
--- a/bus/inputcontext.c
+++ b/bus/inputcontext.c
@@ -1472,7 +1472,7 @@ bus_input_context_update_lookup_table (BusInputContext *context,
     if (priv->capabilities & IBUS_CAP_LOOKUP_TABLE) {
         bus_input_context_send_signal (context,
                                        "UpdateLookupTable",
-                                       IBUS_TYPE_TEXT, &(priv->lookup_table),
+                                       IBUS_TYPE_LOOKUP_TABLE, &(priv->lookup_table),
                                        G_TYPE_BOOLEAN, &(priv->lookup_table_visible),
                                        G_TYPE_INVALID);
     }
diff --git a/client/gtk2/ibusimcontext.c b/client/gtk2/ibusimcontext.c
index 29e7753..f99e60a 100644
--- a/client/gtk2/ibusimcontext.c
+++ b/client/gtk2/ibusimcontext.c
@@ -26,14 +26,17 @@
 #include <ibus.h>
 #include "ibusimcontext.h"
 
-/* IBusIMContextPriv */
-struct _IBusIMContextPrivate {
+struct _IBusIMContext {
+    GtkIMContext parent;
+
+    /* instance members */
     GtkIMContext *slave;
     GdkWindow *client_window;
+    GdkWindow *event_window;
 
     /* enabled */
     gboolean        enable;
-    IBusInputContext *ibus_context;
+    IBusInputContext *ibuscontext;
 
     /* preedit status */
     gchar           *preedit_string;
@@ -45,6 +48,12 @@ struct _IBusIMContextPrivate {
     gboolean         has_focus;
 
     gint             caps;
+
+};
+
+struct _IBusIMContextClass {
+GtkIMContextClass parent;
+    /* class members */
 };
 
 static guint    _signal_commit_id = 0;
@@ -53,17 +62,19 @@ static guint    _signal_preedit_start_id = 0;
 static guint    _signal_preedit_end_id = 0;
 static guint    _signal_delete_surrounding_id = 0;
 static guint    _signal_retrieve_surrounding_id = 0;
+static GQuark   _q_ibus_im_context = 0;
+static gboolean _use_key_snooper = TRUE;
 
 /* functions prototype */
-static void     ibus_im_context_class_init   (IBusIMContextClass    *klass);
-static void     ibus_im_context_init         (GObject               *obj);
-static void     ibus_im_context_finalize     (GObject               *obj);
-static void     ibus_im_context_reset        (GtkIMContext          *context);
+static void     ibus_im_context_class_init  (IBusIMContextClass    *klass);
+static void     ibus_im_context_init        (GObject               *obj);
+static void     ibus_im_context_finalize    (GObject               *obj);
+static void     ibus_im_context_reset       (GtkIMContext          *context);
 static gboolean ibus_im_context_filter_keypress
                                             (GtkIMContext           *context,
                                              GdkEventKey            *key);
-static void     ibus_im_context_focus_in     (GtkIMContext          *context);
-static void     ibus_im_context_focus_out    (GtkIMContext          *context);
+static void     ibus_im_context_focus_in    (GtkIMContext          *context);
+static void     ibus_im_context_focus_out   (GtkIMContext          *context);
 static void     ibus_im_context_get_preedit_string
                                             (GtkIMContext           *context,
                                              gchar                  **str,
@@ -72,6 +83,10 @@ static void     ibus_im_context_get_preedit_string
 static void     ibus_im_context_set_client_window
                                             (GtkIMContext           *context,
                                              GdkWindow              *client);
+
+static void     ibus_im_context_set_event_window
+                                            (IBusIMContext          *ibusimcontext,
+                                             GdkWindow              *client);
 static void     ibus_im_context_set_cursor_location
                                             (GtkIMContext           *context,
                                              GdkRectangle           *area);
@@ -166,6 +181,30 @@ ibus_im_context_new (void)
     return obj;
 }
 
+static gint
+_key_snooper_cb (GtkWidget   *widget,
+                 GdkEventKey *event,
+                 gpointer     user_data)
+{
+    GdkWindow *gdkwindow;
+    GtkIMContext *imcontext;
+
+    if (!_use_key_snooper)
+        return 0;
+
+    gdkwindow = gtk_widget_get_window (widget);
+
+    if (gdkwindow == NULL)
+        return 0;
+
+    imcontext = (GtkIMContext *) g_object_get_qdata ((GObject *) gdkwindow, _q_ibus_im_context);
+
+    if (imcontext == NULL)
+        return 0;
+
+    return gtk_im_context_filter_keypress (imcontext, event);
+}
+
 static void
 ibus_im_context_class_init     (IBusIMContextClass *klass)
 {
@@ -174,8 +213,6 @@ ibus_im_context_class_init     (IBusIMContextClass *klass)
 
     parent_class = (GtkIMContextClass *) g_type_class_peek_parent (klass);
 
-    g_type_class_add_private (klass, sizeof (IBusIMContextPrivate));
-
     im_context_class->reset = ibus_im_context_reset;
     im_context_class->focus_in = ibus_im_context_focus_in;
     im_context_class->focus_out = ibus_im_context_focus_out;
@@ -210,71 +247,75 @@ ibus_im_context_class_init     (IBusIMContextClass *klass)
         g_signal_lookup ("retrieve-surrounding", G_TYPE_FROM_CLASS (klass));
     g_assert (_signal_retrieve_surrounding_id != 0);
 
+    _q_ibus_im_context = g_quark_from_static_string ("IBusIMContext");
+
+    if (_use_key_snooper) {
+        gtk_key_snooper_install (_key_snooper_cb, NULL);
+    }
 }
 
 static void
 ibus_im_context_init (GObject *obj)
 {
 
-    IBusIMContext *ibuscontext = IBUS_IM_CONTEXT (obj);
-    IBusIMContextPrivate *priv = ibuscontext->priv =
-        G_TYPE_INSTANCE_GET_PRIVATE (ibuscontext, IBUS_TYPE_IM_CONTEXT, IBusIMContextPrivate);
+    IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (obj);
 
-    priv->client_window = NULL;
+    ibusimcontext->client_window = NULL;
+    ibusimcontext->event_window = NULL;
 
     // Init ibus status
-    priv->enable = FALSE;
+    ibusimcontext->enable = FALSE;
 
     // Init preedit status
-    priv->preedit_string = NULL;
-    priv->preedit_attrs = NULL;
-    priv->preedit_cursor_pos = 0;
-    priv->preedit_visible = FALSE;
+    ibusimcontext->preedit_string = NULL;
+    ibusimcontext->preedit_attrs = NULL;
+    ibusimcontext->preedit_cursor_pos = 0;
+    ibusimcontext->preedit_visible = FALSE;
 
     // Init cursor area
-    priv->cursor_area.x = -1;
-    priv->cursor_area.y = -1;
-    priv->cursor_area.width = 0;
-    priv->cursor_area.height = 0;
+    ibusimcontext->cursor_area.x = -1;
+    ibusimcontext->cursor_area.y = -1;
+    ibusimcontext->cursor_area.width = 0;
+    ibusimcontext->cursor_area.height = 0;
 
-    priv->ibus_context = NULL;
-    priv->has_focus = FALSE;
-    priv->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS;
+    ibusimcontext->ibuscontext = NULL;
+    ibusimcontext->has_focus = FALSE;
+    ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS;
 
 
     // Create slave im context
-    priv->slave = gtk_im_context_simple_new ();
-    g_signal_connect (priv->slave,
+    ibusimcontext->slave = gtk_im_context_simple_new ();
+    g_signal_connect (ibusimcontext->slave,
                       "commit",
                       G_CALLBACK (_slave_commit_cb),
-                      ibuscontext);
-    g_signal_connect (priv->slave,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->slave,
                       "preedit-start",
                       G_CALLBACK (_slave_preedit_start_cb),
-                      ibuscontext);
-    g_signal_connect (priv->slave,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->slave,
                       "preedit-end",
                       G_CALLBACK (_slave_preedit_end_cb),
-                      ibuscontext);
-    g_signal_connect (priv->slave,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->slave,
                       "preedit-changed",
                       G_CALLBACK (_slave_preedit_changed_cb),
-                      ibuscontext);
-    g_signal_connect (priv->slave,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->slave,
                       "retrieve-surrounding",
                       G_CALLBACK (_slave_retrieve_surrounding_cb),
-                      ibuscontext);
-    g_signal_connect (priv->slave,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->slave,
                       "delete-surrounding",
                       G_CALLBACK (_slave_delete_surrounding_cb),
-                      ibuscontext);
+                      ibusimcontext);
 
     /* init bus object */
     if (_bus == NULL)
         _bus = ibus_bus_new();
 
     if (ibus_bus_is_connected (_bus)) {
-        _create_input_context (ibuscontext);
+        _create_input_context (ibusimcontext);
     }
 
     g_signal_connect (_bus, "connected", G_CALLBACK (_bus_connected_cb), obj);
@@ -286,27 +327,28 @@ ibus_im_context_finalize (GObject *obj)
     g_return_if_fail (obj != NULL);
     g_return_if_fail (IBUS_IS_IM_CONTEXT (obj));
 
-    IBusIMContext *ibus = IBUS_IM_CONTEXT (obj);
-    IBusIMContextPrivate *priv = ibus->priv;
+    IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (obj);
 
     g_signal_handlers_disconnect_by_func (_bus, G_CALLBACK (_bus_connected_cb), obj);
 
-    if (priv->ibus_context) {
-        ibus_object_destroy ((IBusObject *)priv->ibus_context);
+    if (ibusimcontext->ibuscontext) {
+        ibus_object_destroy ((IBusObject *)ibusimcontext->ibuscontext);
     }
 
-    g_object_unref (priv->slave);
+    ibus_im_context_set_client_window ((GtkIMContext *)ibusimcontext, NULL);
+    ibus_im_context_set_event_window (ibusimcontext, NULL);
 
-    if (priv->client_window) {
-        g_object_unref (priv->client_window);
+    if (ibusimcontext->slave) {
+        g_object_unref (ibusimcontext->slave);
+        ibusimcontext->slave = NULL;
     }
 
     // release preedit
-    if (priv->preedit_string) {
-        g_free (priv->preedit_string);
+    if (ibusimcontext->preedit_string) {
+        g_free (ibusimcontext->preedit_string);
     }
-    if (priv->preedit_attrs) {
-        pango_attr_list_unref (priv->preedit_attrs);
+    if (ibusimcontext->preedit_attrs) {
+        pango_attr_list_unref (ibusimcontext->preedit_attrs);
     }
 
     G_OBJECT_CLASS(parent_class)->finalize (obj);
@@ -314,27 +356,30 @@ ibus_im_context_finalize (GObject *obj)
 
 static gboolean
 ibus_im_context_filter_keypress (GtkIMContext *context,
-                GdkEventKey  *event)
+                                 GdkEventKey  *event)
 {
     g_return_val_if_fail (context != NULL, FALSE);
     g_return_val_if_fail (IBUS_IS_IM_CONTEXT (context), FALSE);
 
-    IBusIMContext *ibus = IBUS_IM_CONTEXT (context);
-    IBusIMContextPrivate *priv = ibus->priv;
+    IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context);
+
+    if (event->window != ibusimcontext->client_window && event->window != ibusimcontext->event_window) {
+        ibus_im_context_set_event_window (ibusimcontext, event->window);
+    }
 
-    if (priv->ibus_context && priv->has_focus) {
+    if (ibusimcontext->ibuscontext && ibusimcontext->has_focus) {
         /* If context does not have focus, ibus will process key event in sync mode.
          * It is a workaround for increase search in treeview.
          */
         gboolean retval;
         switch (event->type) {
         case GDK_KEY_RELEASE:
-            retval = ibus_input_context_process_key_event (priv->ibus_context,
+            retval = ibus_input_context_process_key_event (ibusimcontext->ibuscontext,
                                                            event->keyval,
                                                            event->state | IBUS_RELEASE_MASK);
             break;
         case GDK_KEY_PRESS:
-            retval = ibus_input_context_process_key_event (priv->ibus_context,
+            retval = ibus_input_context_process_key_event (ibusimcontext->ibuscontext,
                                                            event->keyval,
                                                            event->state);
             break;
@@ -345,10 +390,10 @@ ibus_im_context_filter_keypress (GtkIMContext *context,
         if (retval) {
             return TRUE;
         }
-        return gtk_im_context_filter_keypress (priv->slave, event);
+        return gtk_im_context_filter_keypress (ibusimcontext->slave, event);
     }
     else {
-        return gtk_im_context_filter_keypress (priv->slave, event);
+        return gtk_im_context_filter_keypress (ibusimcontext->slave, event);
     }
 }
 
@@ -357,18 +402,15 @@ ibus_im_context_focus_in (GtkIMContext *context)
 {
     g_assert (IBUS_IS_IM_CONTEXT (context));
 
-    IBusIMContext *ibuscontext;
-    IBusIMContextPrivate *priv;
+    IBusIMContext *ibusimcontext;
+    ibusimcontext = IBUS_IM_CONTEXT (context);
 
-    ibuscontext = IBUS_IM_CONTEXT (context);
-    priv = ibuscontext->priv;
-
-    priv->has_focus = TRUE;
-    if (priv->ibus_context) {
-        ibus_input_context_focus_in (priv->ibus_context);
+    ibusimcontext->has_focus = TRUE;
+    if (ibusimcontext->ibuscontext) {
+        ibus_input_context_focus_in (ibusimcontext->ibuscontext);
     }
 
-    gtk_im_context_focus_in (priv->slave);
+    gtk_im_context_focus_in (ibusimcontext->slave);
 
     _set_cursor_location_internal (context);
 }
@@ -379,17 +421,14 @@ ibus_im_context_focus_out (GtkIMContext *context)
 
     g_assert (IBUS_IS_IM_CONTEXT (context));
 
-    IBusIMContext *ibuscontext;
-    IBusIMContextPrivate *priv;
-
-    ibuscontext = IBUS_IM_CONTEXT (context);
-    priv = ibuscontext->priv;
+    IBusIMContext *ibusimcontext;
+    ibusimcontext = IBUS_IM_CONTEXT (context);
 
-    priv->has_focus = FALSE;
-    if (priv->ibus_context) {
-        ibus_input_context_focus_out (priv->ibus_context);
+    ibusimcontext->has_focus = FALSE;
+    if (ibusimcontext->ibuscontext) {
+        ibus_input_context_focus_out (ibusimcontext->ibuscontext);
     }
-    gtk_im_context_focus_out (priv->slave);
+    gtk_im_context_focus_out (ibusimcontext->slave);
 }
 
 static void
@@ -397,16 +436,13 @@ ibus_im_context_reset (GtkIMContext *context)
 {
     g_assert (IBUS_IS_IM_CONTEXT (context));
 
-    IBusIMContext *ibuscontext;
-    IBusIMContextPrivate *priv;
-
-    ibuscontext = IBUS_IM_CONTEXT (context);
-    priv = ibuscontext->priv;
+    IBusIMContext *ibusimcontext;
+    ibusimcontext = IBUS_IM_CONTEXT (context);
 
-    if (priv->ibus_context) {
-        ibus_input_context_reset (priv->ibus_context);
+    if (ibusimcontext->ibuscontext) {
+        ibus_input_context_reset (ibusimcontext->ibuscontext);
     }
-    gtk_im_context_reset (priv->slave);
+    gtk_im_context_reset (ibusimcontext->slave);
 }
 
 
@@ -418,26 +454,23 @@ ibus_im_context_get_preedit_string (GtkIMContext   *context,
 {
     g_assert (IBUS_IS_IM_CONTEXT (context));
 
-    IBusIMContext *ibuscontext;
-    IBusIMContextPrivate *priv;
+    IBusIMContext *ibusimcontext;
+    ibusimcontext = IBUS_IM_CONTEXT (context);
 
-    ibuscontext = IBUS_IM_CONTEXT (context);
-    priv = ibuscontext->priv;
-
-    if (priv->enable) {
-        if (priv->preedit_visible) {
+    if (ibusimcontext->enable) {
+        if (ibusimcontext->preedit_visible) {
             if (str) {
-                *str = g_strdup (priv->preedit_string ? priv->preedit_string: "");
+                *str = g_strdup (ibusimcontext->preedit_string ? ibusimcontext->preedit_string: "");
             }
 
             if (attrs) {
-                *attrs = priv->preedit_attrs ?
-                            pango_attr_list_ref (priv->preedit_attrs):
+                *attrs = ibusimcontext->preedit_attrs ?
+                            pango_attr_list_ref (ibusimcontext->preedit_attrs):
                             pango_attr_list_new ();
             }
 
             if (cursor_pos) {
-                *cursor_pos = priv->preedit_cursor_pos;
+                *cursor_pos = ibusimcontext->preedit_cursor_pos;
             }
         }
         else {
@@ -453,56 +486,86 @@ ibus_im_context_get_preedit_string (GtkIMContext   *context,
         }
     }
     else {
-        gtk_im_context_get_preedit_string (priv->slave, str, attrs, cursor_pos);
+        gtk_im_context_get_preedit_string (ibusimcontext->slave, str, attrs, cursor_pos);
     }
 }
 
 
 static void
-ibus_im_context_set_client_window  (GtkIMContext *context, GdkWindow *client)
+ibus_im_context_set_client_window (GtkIMContext *context, GdkWindow *client)
 {
     g_return_if_fail (context != NULL);
     g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
 
-    IBusIMContext *ibus = IBUS_IM_CONTEXT (context);
-    IBusIMContextPrivate *priv = ibus->priv;
+    IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context);
 
-    if (priv->client_window) {
-        g_object_unref (priv->client_window);
+    if (ibusimcontext->client_window) {
+        if (g_object_get_qdata ((GObject *) ibusimcontext->client_window, _q_ibus_im_context) == ibusimcontext) {
+            g_object_set_qdata ((GObject *) ibusimcontext->client_window, _q_ibus_im_context, NULL);
+        }
+        g_object_unref (ibusimcontext->client_window);
     }
 
+    ibus_im_context_set_event_window (ibusimcontext, NULL);
+
     if (client) {
         g_object_ref (client);
+        g_object_ref (ibusimcontext);
+        g_object_set_qdata_full ((GObject *) client, _q_ibus_im_context, context, g_object_unref);
     }
 
-    priv->client_window = client;
-    gtk_im_context_set_client_window (priv->slave, client);
+    ibusimcontext->client_window = client;
+
+    if (ibusimcontext->slave)
+        gtk_im_context_set_client_window (ibusimcontext->slave, client);
+}
+
+static void
+ibus_im_context_set_event_window (IBusIMContext *ibusimcontext, GdkWindow *window)
+{
+    if (ibusimcontext->event_window) {
+        if (g_object_get_qdata ((GObject *) ibusimcontext->event_window, _q_ibus_im_context) == ibusimcontext) {
+            g_object_set_qdata ((GObject *) ibusimcontext->event_window, _q_ibus_im_context, NULL);
+        }
+        g_object_unref (ibusimcontext->event_window);
+        ibusimcontext->event_window = NULL;
+    }
+
+    if (window == ibusimcontext->client_window)
+        window = NULL;
+
+    if (window != NULL) {
+        g_object_ref (window);
+        g_object_ref (ibusimcontext);
+        g_object_set_qdata_full ((GObject *) window, _q_ibus_im_context, ibusimcontext, g_object_unref);
+    }
+
+    ibusimcontext->event_window = window;
 }
 
 static void
 _set_cursor_location_internal (GtkIMContext *context)
 {
-    IBusIMContext *ibus = IBUS_IM_CONTEXT (context);
-    IBusIMContextPrivate *priv = ibus->priv;
+    IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context);
     GdkRectangle area;
     gint x, y;
 
-    if(priv->client_window == NULL || priv->ibus_context == NULL) {
+    if(ibusimcontext->client_window == NULL || ibusimcontext->ibuscontext == NULL) {
         return;
     }
 
-    area = priv->cursor_area;
+    area = ibusimcontext->cursor_area;
     if (area.x == -1 && area.y == -1 && area.width == 0 && area.height == 0) {
         gint w, h;
-        gdk_drawable_get_size (priv->client_window, &w, &h);
+        gdk_drawable_get_size (ibusimcontext->client_window, &w, &h);
         area.y += h;
         area.x = 0;
     }
 
-    gdk_window_get_origin (priv->client_window, &x, &y);
+    gdk_window_get_origin (ibusimcontext->client_window, &x, &y);
     area.x += x;
     area.y += y;
-    ibus_input_context_set_cursor_location (priv->ibus_context,
+    ibus_input_context_set_cursor_location (ibusimcontext->ibuscontext,
                                             area.x,
                                             area.y,
                                             area.width,
@@ -515,12 +578,11 @@ ibus_im_context_set_cursor_location (GtkIMContext *context, GdkRectangle *area)
     g_return_if_fail (context != NULL);
     g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
 
-    IBusIMContext *ibus = IBUS_IM_CONTEXT (context);
-    IBusIMContextPrivate *priv = ibus->priv;
+    IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context);
 
-    priv->cursor_area = *area;
+    ibusimcontext->cursor_area = *area;
     _set_cursor_location_internal (context);
-    gtk_im_context_set_cursor_location (priv->slave, area);
+    gtk_im_context_set_cursor_location (ibusimcontext->slave, area);
 }
 
 static void
@@ -529,60 +591,56 @@ ibus_im_context_set_use_preedit (GtkIMContext *context, gboolean use_preedit)
     g_return_if_fail (context != NULL);
     g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
 
-    IBusIMContext *ibus = IBUS_IM_CONTEXT (context);
-    IBusIMContextPrivate *priv = ibus->priv;
+    IBusIMContext *ibusimcontext = IBUS_IM_CONTEXT (context);
 
-    if(priv->ibus_context) {
+    if(ibusimcontext->ibuscontext) {
         if (use_preedit) {
-            priv->caps |= IBUS_CAP_PREEDIT_TEXT;
+            ibusimcontext->caps |= IBUS_CAP_PREEDIT_TEXT;
         }
         else {
-            priv->caps &= ~IBUS_CAP_PREEDIT_TEXT;
+            ibusimcontext->caps &= ~IBUS_CAP_PREEDIT_TEXT;
         }
-        ibus_input_context_set_capabilities (priv->ibus_context, priv->caps);
+        ibus_input_context_set_capabilities (ibusimcontext->ibuscontext, ibusimcontext->caps);
     }
-    gtk_im_context_set_use_preedit (priv->slave, use_preedit);
+    gtk_im_context_set_use_preedit (ibusimcontext->slave, use_preedit);
 }
 
 static void
 _bus_connected_cb (IBusBus          *bus,
-                   IBusIMContext    *context)
+                   IBusIMContext    *ibusimcontext)
 {
-    g_assert (IBUS_IS_IM_CONTEXT (context));
-    g_assert (context->priv->ibus_context == NULL);
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
+    g_assert (ibusimcontext->ibuscontext == NULL);
 
-    _create_input_context (context);
+    _create_input_context (ibusimcontext);
 }
 
 static void
-_ibus_context_commit_text_cb (IBusInputContext *ibus_context,
+_ibus_context_commit_text_cb (IBusInputContext *ibuscontext,
                               IBusText         *text,
-                              IBusIMContext    *context)
+                              IBusIMContext    *ibusimcontext)
 {
-    g_assert (IBUS_IS_INPUT_CONTEXT (ibus_context));
+    g_assert (IBUS_IS_INPUT_CONTEXT (ibuscontext));
     g_assert (IBUS_IS_TEXT (text));
-    g_assert (IBUS_IS_IM_CONTEXT (context));
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    g_signal_emit (context, _signal_commit_id, 0, text->text);
+    g_signal_emit (ibusimcontext, _signal_commit_id, 0, text->text);
 }
 
 static void
-_ibus_context_forward_key_event_cb (IBusInputContext  *ibus_context,
+_ibus_context_forward_key_event_cb (IBusInputContext  *ibuscontext,
                                     guint              keyval,
-                                    gboolean           is_press,
                                     guint              state,
-                                    IBusIMContext     *context)
+                                    IBusIMContext     *ibusimcontext)
 {
-    g_assert (IBUS_IS_IM_CONTEXT (context));
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
     GdkEventKey *event;
-    IBusIMContextPrivate *priv;
 
-    priv = context->priv;
-    event = (GdkEventKey *)gdk_event_new (is_press ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
+    event = (GdkEventKey *)gdk_event_new (state & IBUS_RELEASE_MASK ? GDK_KEY_RELEASE : GDK_KEY_PRESS);
 
     event->time = GDK_CURRENT_TIME;
-    event->window = g_object_ref (priv->client_window);
+    event->window = g_object_ref (ibusimcontext->client_window);
     event->send_event = FALSE;
     event->state = state;
     event->keyval = keyval;
@@ -597,33 +655,31 @@ _ibus_context_forward_key_event_cb (IBusInputContext  *ibus_context,
 }
 
 static void
-_ibus_context_update_preedit_text_cb (IBusInputContext  *ibus_context,
+_ibus_context_update_preedit_text_cb (IBusInputContext  *ibuscontext,
                                       IBusText          *text,
                                       gint               cursor_pos,
                                       gboolean           visible,
-                                      IBusIMContext     *context)
+                                      IBusIMContext     *ibusimcontext)
 {
-    g_assert (IBUS_IS_INPUT_CONTEXT (ibus_context));
+    g_assert (IBUS_IS_INPUT_CONTEXT (ibuscontext));
     g_assert (IBUS_IS_TEXT (text));
-    g_assert (IBUS_IS_IM_CONTEXT (context));
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    IBusIMContextPrivate *priv;
-    priv = context->priv;
     const gchar *str;
 
-    if (priv->preedit_string) {
-        g_free (priv->preedit_string);
+    if (ibusimcontext->preedit_string) {
+        g_free (ibusimcontext->preedit_string);
     }
-    if (priv->preedit_attrs) {
-        pango_attr_list_unref (priv->preedit_attrs);
-        priv->preedit_attrs = NULL;
+    if (ibusimcontext->preedit_attrs) {
+        pango_attr_list_unref (ibusimcontext->preedit_attrs);
+        ibusimcontext->preedit_attrs = NULL;
     }
 
     str = text->text;
-    priv->preedit_string = g_strdup (str);
+    ibusimcontext->preedit_string = g_strdup (str);
     if (text->attrs) {
         guint i;
-        priv->preedit_attrs = pango_attr_list_new ();
+        ibusimcontext->preedit_attrs = pango_attr_list_new ();
         for (i = 0; ; i++) {
             IBusAttribute *attr = ibus_attr_list_get (text->attrs, i);
             if (attr == NULL) {
@@ -652,249 +708,244 @@ _ibus_context_update_preedit_text_cb (IBusInputContext  *ibus_context,
             }
             pango_attr->start_index = g_utf8_offset_to_pointer (str, attr->start_index) - str;
             pango_attr->end_index = g_utf8_offset_to_pointer (str, attr->end_index) - str;
-            pango_attr_list_insert (priv->preedit_attrs, pango_attr);
+            pango_attr_list_insert (ibusimcontext->preedit_attrs, pango_attr);
         }
     }
-    priv->preedit_cursor_pos = cursor_pos;
-    priv->preedit_visible = visible;
-    g_signal_emit (context, _signal_preedit_changed_id, 0);
+    ibusimcontext->preedit_cursor_pos = cursor_pos;
+    ibusimcontext->preedit_visible = visible;
+    if (ibusimcontext->preedit_visible) {
+        g_signal_emit (ibusimcontext, _signal_preedit_start_id, 0);
+        g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
+    }
+    else {
+        g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
+        g_signal_emit (ibusimcontext, _signal_preedit_end_id, 0);
+    }
 }
 
 static void
-_ibus_context_show_preedit_text_cb (IBusInputContext   *ibus_context,
-                                    IBusIMContext      *context)
+_ibus_context_show_preedit_text_cb (IBusInputContext   *ibuscontext,
+                                    IBusIMContext      *ibusimcontext)
 {
-    g_assert (IBUS_IS_IM_CONTEXT (context));
-    IBusIMContextPrivate *priv = context->priv;
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    if (priv->preedit_visible == FALSE) {
-        priv->preedit_visible = TRUE;
-        g_signal_emit (context, _signal_preedit_changed_id, 0);
+    if (ibusimcontext->preedit_visible == FALSE) {
+        ibusimcontext->preedit_visible = TRUE;
+        g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
     }
 }
 
 static void
-_ibus_context_hide_preedit_text_cb (IBusInputContext   *ibus_context,
-                                    IBusIMContext      *context)
+_ibus_context_hide_preedit_text_cb (IBusInputContext *ibuscontext,
+                                    IBusIMContext    *ibusimcontext)
 {
-    g_assert (IBUS_IS_IM_CONTEXT (context));
-    IBusIMContextPrivate *priv = context->priv;
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    if (priv->preedit_visible == TRUE) {
-        priv->preedit_visible = FALSE;
-        g_signal_emit (context, _signal_preedit_changed_id, 0);
+    if (ibusimcontext->preedit_visible == TRUE) {
+        ibusimcontext->preedit_visible = FALSE;
+        g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
     }
 }
 
 static void
-_ibus_context_enabled_cb (IBusInputContext    *ibus_context,
-                IBusIMContext       *context)
+_ibus_context_enabled_cb (IBusInputContext *ibuscontext,
+                          IBusIMContext    *ibusimcontext)
 {
-    g_assert (IBUS_IS_IM_CONTEXT (context));
-    IBusIMContextPrivate *priv = context->priv;
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    priv->enable = TRUE;
-    // g_signal_emit (context, _signal_preedit_changed_id, 0);
+    ibusimcontext->enable = TRUE;
 }
 
 static void
-_ibus_context_disabled_cb (IBusInputContext   *ibus_context,
-                 IBusIMContext      *context)
+_ibus_context_disabled_cb (IBusInputContext *ibuscontext,
+                           IBusIMContext    *ibusimcontext)
 {
-    g_assert (IBUS_IS_IM_CONTEXT (context));
-    IBusIMContextPrivate *priv = context->priv;
+    ibusimcontext->enable = FALSE;
 
-    priv->enable = FALSE;
-    
     /* clear preedit */
-    priv->preedit_visible = FALSE;
-    priv->preedit_cursor_pos = 0;
-    g_free (priv->preedit_string);
-    priv->preedit_string = NULL;
-    
-    g_signal_emit (context, _signal_preedit_changed_id, 0);
+    ibusimcontext->preedit_visible = FALSE;
+    ibusimcontext->preedit_cursor_pos = 0;
+    g_free (ibusimcontext->preedit_string);
+    ibusimcontext->preedit_string = NULL;
+
+    g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
+    g_signal_emit (ibusimcontext, _signal_preedit_end_id, 0);
 }
 
 static void
-_ibus_context_destroy_cb (IBusInputContext    *ibus_context,
-                IBusIMContext       *context)
+_ibus_context_destroy_cb (IBusInputContext *ibuscontext,
+                          IBusIMContext    *ibusimcontext)
 {
-    g_assert (IBUS_IS_IM_CONTEXT (context));
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
+    g_assert (ibusimcontext->ibuscontext == ibuscontext);
+
+    g_object_unref (ibusimcontext->ibuscontext);
+    ibusimcontext->ibuscontext = NULL;
 
-    IBusIMContextPrivate *priv = context->priv;
+    ibusimcontext->enable = FALSE;
 
-    g_assert (priv->ibus_context == ibus_context);
+    /* clear preedit */
+    ibusimcontext->preedit_visible = FALSE;
+    ibusimcontext->preedit_cursor_pos = 0;
+    g_free (ibusimcontext->preedit_string);
+    ibusimcontext->preedit_string = NULL;
 
-    g_object_unref (priv->ibus_context);
-    priv->ibus_context = NULL;
-    priv->enable = FALSE;
+    g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
+    g_signal_emit (ibusimcontext, _signal_preedit_end_id, 0);
 }
 
 static void
-_create_input_context (IBusIMContext *context)
+_create_input_context (IBusIMContext *ibusimcontext)
 {
-    g_assert (IBUS_IS_IM_CONTEXT (context));
-    g_assert (context->priv->ibus_context == NULL);
-
-    IBusIMContextPrivate *priv;
-    priv = context->priv;
+    g_assert (IBUS_IS_IM_CONTEXT (ibusimcontext));
+    g_assert (ibusimcontext->ibuscontext == NULL);
 
-    priv->ibus_context = ibus_bus_create_input_context (_bus, "test");
+    ibusimcontext->ibuscontext = ibus_bus_create_input_context (_bus, "test");
 
-    g_signal_connect (priv->ibus_context,
+    g_signal_connect (ibusimcontext->ibuscontext,
                       "commit-text",
                       G_CALLBACK (_ibus_context_commit_text_cb),
-                      context);
-    g_signal_connect (priv->ibus_context,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->ibuscontext,
                       "forward-key-event",
                       G_CALLBACK (_ibus_context_forward_key_event_cb),
-                      context);
-    g_signal_connect (priv->ibus_context,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->ibuscontext,
                       "update-preedit-text",
                       G_CALLBACK (_ibus_context_update_preedit_text_cb),
-                      context);
-    g_signal_connect (priv->ibus_context,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->ibuscontext,
                       "show-preedit-text",
                       G_CALLBACK (_ibus_context_show_preedit_text_cb),
-                      context);
-    g_signal_connect (priv->ibus_context,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->ibuscontext,
                       "hide-preedit-text",
                       G_CALLBACK (_ibus_context_hide_preedit_text_cb),
-                      context);
-    g_signal_connect (priv->ibus_context,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->ibuscontext,
                       "enabled",
                       G_CALLBACK (_ibus_context_enabled_cb),
-                      context);
-    g_signal_connect (priv->ibus_context,
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->ibuscontext,
                       "disabled",
                       G_CALLBACK (_ibus_context_disabled_cb),
-                      context);
-    g_signal_connect (priv->ibus_context, "destroy",
+                      ibusimcontext);
+    g_signal_connect (ibusimcontext->ibuscontext, "destroy",
                       G_CALLBACK (_ibus_context_destroy_cb),
-                      context);
+                      ibusimcontext);
 
-    ibus_input_context_set_capabilities (priv->ibus_context, priv->caps);
+    ibus_input_context_set_capabilities (ibusimcontext->ibuscontext, ibusimcontext->caps);
 
-    if (priv->has_focus) {
-        ibus_input_context_focus_in (priv->ibus_context);
+    if (ibusimcontext->has_focus) {
+        ibus_input_context_focus_in (ibusimcontext->ibuscontext);
     }
 }
 
 /* Callback functions for slave context */
 static void
-_slave_commit_cb (GtkIMContext *slave, gchar *string, IBusIMContext *context)
+_slave_commit_cb (GtkIMContext  *slave,
+                  gchar         *string,
+                  IBusIMContext *ibusimcontext)
 {
-    g_return_if_fail (context != NULL);
-    g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
+    g_return_if_fail (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    /* IBusIMContextPrivate *priv = context->priv; */
 #if 0
     if ((GtkIMContext *)context == CURRENT_CONTEXT && ibus_im_client_is_enabled (_client))
         return;
 #endif
-    g_signal_emit (context, _signal_commit_id, 0, string);
+    g_signal_emit (ibusimcontext, _signal_commit_id, 0, string);
 }
 
 static void
-_slave_preedit_changed_cb (GtkIMContext *slave, IBusIMContext *context)
+_slave_preedit_changed_cb (GtkIMContext  *slave,
+                           IBusIMContext *ibusimcontext)
 {
-    g_return_if_fail (context != NULL);
-    g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
+    g_return_if_fail (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    IBusIMContextPrivate *priv = context->priv;
-
-    if (priv->enable && priv->ibus_context) {
+    if (ibusimcontext->enable && ibusimcontext->ibuscontext) {
         return;
     }
 
-    g_signal_emit (context, _signal_preedit_changed_id, 0);
+    g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
 }
 
 static void
-_slave_preedit_start_cb (GtkIMContext *slave, IBusIMContext *context)
+_slave_preedit_start_cb (GtkIMContext  *slave,
+                         IBusIMContext *ibusimcontext)
 {
-    g_return_if_fail (context != NULL);
-    g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
+    g_return_if_fail (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    IBusIMContextPrivate *priv = context->priv;
-
-    if (priv->enable && priv->ibus_context) {
+    if (ibusimcontext->enable && ibusimcontext->ibuscontext) {
         return;
     }
-    g_signal_emit (context, _signal_preedit_start_id, 0);
+
+    g_signal_emit (ibusimcontext, _signal_preedit_start_id, 0);
 }
 
 static void
-_slave_preedit_end_cb (GtkIMContext *slave, IBusIMContext *context)
+_slave_preedit_end_cb (GtkIMContext  *slave,
+                       IBusIMContext *ibusimcontext)
 {
-    g_return_if_fail (context != NULL);
-    g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
-
-    IBusIMContextPrivate *priv = context->priv;
+    g_return_if_fail (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    if (priv->enable && priv->ibus_context) {
+    if (ibusimcontext->enable && ibusimcontext->ibuscontext) {
         return;
     }
-    g_signal_emit (context, _signal_preedit_end_id, 0);
+    g_signal_emit (ibusimcontext, _signal_preedit_end_id, 0);
 }
 
 static void
-_slave_retrieve_surrounding_cb (GtkIMContext *slave, IBusIMContext *context)
+_slave_retrieve_surrounding_cb (GtkIMContext  *slave,
+                                IBusIMContext *ibusimcontext)
 {
-    g_return_if_fail (context != NULL);
-    g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
+    g_return_if_fail (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    IBusIMContextPrivate *priv = context->priv;
-
-    if (priv->enable && priv->ibus_context) {
+    if (ibusimcontext->enable && ibusimcontext->ibuscontext) {
         return;
     }
-    g_signal_emit (context, _signal_retrieve_surrounding_id, 0);
+    g_signal_emit (ibusimcontext, _signal_retrieve_surrounding_id, 0);
 }
 
 static void
-_slave_delete_surrounding_cb (GtkIMContext *slave, gint a1, gint a2, IBusIMContext *context)
+_slave_delete_surrounding_cb (GtkIMContext  *slave,
+                              gint           a1,
+                              gint           a2,
+                              IBusIMContext *ibusimcontext)
 {
-    g_return_if_fail (context != NULL);
-    g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
+    g_return_if_fail (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    IBusIMContextPrivate *priv = context->priv;
-
-    if (priv->enable && priv->ibus_context) {
+    if (ibusimcontext->enable && ibusimcontext->ibuscontext) {
         return;
     }
-    g_signal_emit (context, _signal_delete_surrounding_id, 0, a1, a2);
+    g_signal_emit (ibusimcontext, _signal_delete_surrounding_id, 0, a1, a2);
 }
 
 void
-ibus_im_context_show_preedit (IBusIMContext *context)
+ibus_im_context_show_preedit (IBusIMContext *ibusimcontext)
 {
-    g_return_if_fail (context != NULL);
-    g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
+    g_return_if_fail (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    IBusIMContextPrivate *priv = context->priv;
-    if (priv->preedit_visible) {
+    if (ibusimcontext->preedit_visible) {
         return;
     }
 
-    priv->preedit_visible = TRUE;
+    ibusimcontext->preedit_visible = TRUE;
 
-    g_signal_emit (context, _signal_preedit_changed_id, 0);
+    g_signal_emit (ibusimcontext, _signal_preedit_start_id, 0);
+    g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
 }
 
 void
-ibus_im_context_hide_preedit (IBusIMContext *context)
+ibus_im_context_hide_preedit (IBusIMContext *ibusimcontext)
 {
-    g_return_if_fail (context != NULL);
-    g_return_if_fail (IBUS_IS_IM_CONTEXT (context));
-
-    IBusIMContextPrivate *priv = context->priv;
+    g_return_if_fail (IBUS_IS_IM_CONTEXT (ibusimcontext));
 
-    if (!priv->preedit_visible) {
+    if (!ibusimcontext->preedit_visible) {
         return;
     }
 
-    priv->preedit_visible = FALSE;
+    ibusimcontext->preedit_visible = FALSE;
 
-    g_signal_emit (context, _signal_preedit_changed_id, 0);
+    g_signal_emit (ibusimcontext, _signal_preedit_changed_id, 0);
+    g_signal_emit (ibusimcontext, _signal_preedit_end_id, 0);
 }
diff --git a/client/gtk2/ibusimcontext.h b/client/gtk2/ibusimcontext.h
index 69d382d..eb8895b 100644
--- a/client/gtk2/ibusimcontext.h
+++ b/client/gtk2/ibusimcontext.h
@@ -43,16 +43,6 @@ typedef struct _IBusIMContext IBusIMContext;
 typedef struct _IBusIMContextClass IBusIMContextClass;
 typedef struct _IBusIMContextPrivate IBusIMContextPrivate;
 
-struct _IBusIMContext {
-    GtkIMContext parent;
-    /* instance members */
-    IBusIMContextPrivate *priv;
-};
-
-struct _IBusIMContextClass {
-GtkIMContextClass parent;
-    /* class members */
-};
 
 GType    ibus_im_context_get_type (void);
 IBusIMContext
diff --git a/configure.ac b/configure.ac
index 2b6f0d8..263b83f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -49,6 +49,13 @@ AC_ISC_POSIX
 AC_HEADER_STDC
 AM_PROG_LIBTOOL
 
+# For dislpay Date
+m4_define(ibus_maybe_datedisplay,
+    m4_esyscmd([if test x]ibus_released[ != x1; then date '+%a %b %d %Y' | tr -d '\n\r'; fi]))
+m4_define([ibus_datedisplay], ibus_maybe_datedisplay)
+DATE_DISPLAY="ibus_datedisplay"
+AC_SUBST(DATE_DISPLAY)
+
 # If only source code changed, lt_revision + 1
 # If any interface added, lt_age + 1
 # If any interfaces changed or removed, lt_current + 1
diff --git a/docs/reference/ibus/Makefile.am b/docs/reference/ibus/Makefile.am
index c1991f1..310bdef 100644
--- a/docs/reference/ibus/Makefile.am
+++ b/docs/reference/ibus/Makefile.am
@@ -25,7 +25,8 @@ SCANGOBJ_OPTIONS=
 
 # Extra options to supply to gtkdoc-scan.
 # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
-SCAN_OPTIONS=--rebuild-sections
+# SCAN_OPTIONS=--rebuild-sections
+SCAN_OPTIONS=
 
 # Extra options to supply to gtkdoc-mkdb.
 # e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
@@ -42,7 +43,7 @@ FIXXREF_OPTIONS=
 # Used for dependencies. The docs will be rebuilt if any of these change.
 # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
 # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
-HFILE_GLOB=
+HFILE_GLOB=$(top_srcdir)/src/*.h
 CFILE_GLOB=
 
 # Header files to ignore when scanning.
@@ -97,4 +98,10 @@ EXTRA_DIST +=
 
 # Comment this out if you want your docs-status tested during 'make check'
 #TESTS = $(GTKDOC_CHECK)
-# CLEANFILES += ibus*
+
+clean-local:
+	rm -rf tmpl
+
+CLEANFILES+= *.stamp
+
+
diff --git a/docs/reference/ibus/ibus-docs.sgml b/docs/reference/ibus/ibus-docs.sgml
index 35d0bea..043890c 100644
--- a/docs/reference/ibus/ibus-docs.sgml
+++ b/docs/reference/ibus/ibus-docs.sgml
@@ -3,46 +3,76 @@
                "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
 <book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
   <bookinfo>
-    <title>IBus Reference Manual</title>
+    <title>iBus Reference Manual</title>
     <releaseinfo>
-      for ibus 1.1.0
+      iBus 1.1.0 reference manual.
       The latest version of this documentation can be found on-line at
       <ulink role="online-location" url="http://code.google.com/p/ibus">http://code.google.com/p/ibus</ulink>.
     </releaseinfo>
   </bookinfo>
 
   <chapter>
-    <title>API Reference</title>
-    <xi:include href="xml/ibusfactory.xml"/>
-    <xi:include href="xml/ibusattribute.xml"/>
-    <xi:include href="xml/ibusinputcontext.xml"/>
-    <xi:include href="xml/ibusobservedpath.xml"/>
-    <xi:include href="xml/ibusengine.xml"/>
-    <xi:include href="xml/ibusservice.xml"/>
-    <xi:include href="xml/ibuslookuptable.xml"/>
-    <xi:include href="xml/ibusproxy.xml"/>
-    <xi:include href="xml/ibusserver.xml"/>
-    <xi:include href="xml/ibuscomponent.xml"/>
-    <xi:include href="xml/ibusconnection.xml"/>
-    <xi:include href="xml/ibusproperty.xml"/>
-    <xi:include href="xml/ibustext.xml"/>
-    <xi:include href="xml/ibusserializable.xml"/>
-    <xi:include href="xml/ibushotkey.xml"/>
-    <xi:include href="xml/ibusbus.xml"/>
-    <xi:include href="xml/ibusenginedesc.xml"/>
-    <xi:include href="xml/ibusobject.xml"/>
-    <xi:include href="xml/ibusconfig.xml"/>
-    <xi:include href="xml/ibusmessage.xml"/>
-    <xi:include href="xml/ibusdebug.xml"/>
-    <xi:include href="xml/ibusmarshalers.xml"/>
-    <xi:include href="xml/keyname-table.xml"/>
-    <xi:include href="xml/ibustypes.xml"/>
-    <xi:include href="xml/ibuserror.xml"/>
-    <xi:include href="xml/ibuspendingcall.xml"/>
-    <xi:include href="xml/ibuskeysyms.xml"/>
-    <xi:include href="xml/ibusenumtypes.xml"/>
-    <xi:include href="xml/ibusxml.xml"/>
-    <xi:include href="xml/ibusshare.xml"/>
-    <xi:include href="xml/ibusinternal.xml"/>
+      <title>API Overviews</title>
+      <para>The iBus API consists 3 parts:
+	  <emphasis>User interfaces</emphasis> for objects and services which
+	  are relateed to iBus UI such as language bar;
+          <emphasis>Input method engine</emphasis> for input method main logic and input/output handling;
+	  <emphasis>Configure</emphasis> for services for save, load and listening configures.
+      </para>
+  </chapter>
+  <chapter>
+      <title>User Interfaces</title>
+      <para>These APIs directly related to User interfaces, such as
+	  pre-edit buffer, auxiliary text, language bar, button,
+	  radio boxes, and so on.
+      </para>
+      <xi:include href="xml/ibusattribute.xml"/>
+      <xi:include href="xml/ibuslookuptable.xml"/>
+      <xi:include href="xml/ibusproperty.xml"/>
+      <xi:include href="xml/ibustext.xml"/>
+  </chapter>
+  <chapter>
+      <title>Input method engine</title>
+      <para>
+      </para>
+      <xi:include href="xml/ibusbus.xml"/>
+      <xi:include href="xml/ibuscomponent.xml"/>
+      <xi:include href="xml/ibusconnection.xml"/>
+      <xi:include href="xml/ibusengine.xml"/>
+      <xi:include href="xml/ibusenginedesc.xml"/>
+      <xi:include href="xml/ibusfactory.xml"/>
+      <xi:include href="xml/ibushotkey.xml"/>
+      <xi:include href="xml/ibuskeysyms.xml"/>
+  </chapter>
+  <chapter>
+      <title>Configure</title>
+      <para>
+      </para>
+      <xi:include href="xml/ibusconfig.xml"/>
+      <xi:include href="xml/ibusconfigservice.xml"/>
+      <xi:include href="xml/ibusxml.xml"/>
+  </chapter>
+  <chapter>
+      <title>Others</title>
+      <para>
+      </para>
+      <xi:include href="xml/ibusdebug.xml"/>
+      <xi:include href="xml/ibusenumtypes.xml"/>
+      <xi:include href="xml/ibuserror.xml"/>
+      <xi:include href="xml/ibusinputcontext.xml"/>
+      <xi:include href="xml/ibusinternal.xml"/>
+      <xi:include href="xml/ibusmarshalers.xml"/>
+      <xi:include href="xml/ibusmessage.xml"/>
+      <xi:include href="xml/ibusobject.xml"/>
+      <xi:include href="xml/ibusobservedpath.xml"/>
+      <xi:include href="xml/ibuspendingcall.xml"/>
+      <xi:include href="xml/ibusproxy.xml"/>
+      <xi:include href="xml/ibusserver.xml"/>
+      <xi:include href="xml/ibusservice.xml"/>
+      <xi:include href="xml/ibusserializable.xml"/>
+      <xi:include href="xml/ibusshare.xml"/>
+      <xi:include href="xml/ibustypes.xml"/>
+      <xi:include href="xml/keyname-table.xml"/>
   </chapter>
 </book>
+
diff --git a/docs/reference/ibus/ibus-sections.txt b/docs/reference/ibus/ibus-sections.txt
new file mode 100644
index 0000000..201a536
--- /dev/null
+++ b/docs/reference/ibus/ibus-sections.txt
@@ -0,0 +1,2710 @@
+<SECTION>
+<FILE>ibusproperty</FILE>
+IBUS_TYPE_PROP_LIST
+IBUS_PROP_LIST
+IBUS_PROP_LIST_CLASS
+IBUS_IS_PROP_LIST
+IBUS_IS_PROP_LIST_CLASS
+IBUS_PROP_LIST_GET_CLASS
+IBusPropType
+IBusPropState
+<TITLE>IBusProperty</TITLE>
+IBusProperty
+<TITLE>IBusPropList</TITLE>
+IBusPropList
+ibus_property_new
+ibus_property_set_label
+ibus_property_set_visible
+ibus_property_set_sub_props
+ibus_property_update
+ibus_prop_list_get_type
+ibus_prop_list_new
+ibus_prop_list_append
+ibus_prop_list_get
+ibus_prop_list_update_property
+<SUBSECTION Standard>
+IBUS_PROPERTY
+IBUS_IS_PROPERTY
+IBUS_TYPE_PROPERTY
+ibus_property_get_type
+IBUS_PROPERTY_CLASS
+IBUS_IS_PROPERTY_CLASS
+IBUS_PROPERTY_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusproxy</FILE>
+<TITLE>IBusProxy</TITLE>
+IBusProxy
+ibus_proxy_new
+ibus_proxy_send
+ibus_proxy_call
+ibus_proxy_call_with_reply
+ibus_proxy_call_with_reply_and_block
+ibus_proxy_send_with_reply
+ibus_proxy_send_with_reply_and_block
+ibus_proxy_handle_signal
+ibus_proxy_get_name
+ibus_proxy_get_unique_name
+ibus_proxy_get_path
+ibus_proxy_get_interface
+ibus_proxy_get_connection
+<SUBSECTION Standard>
+IBUS_PROXY
+IBUS_IS_PROXY
+IBUS_TYPE_PROXY
+ibus_proxy_get_type
+IBUS_PROXY_CLASS
+IBUS_IS_PROXY_CLASS
+IBUS_PROXY_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusconfig</FILE>
+<TITLE>IBusConfig</TITLE>
+IBusConfig
+ibus_config_new
+ibus_config_get_value
+ibus_config_set_value
+<SUBSECTION Standard>
+IBUS_CONFIG
+IBUS_IS_CONFIG
+IBUS_TYPE_CONFIG
+ibus_config_get_type
+IBUS_CONFIG_CLASS
+IBUS_IS_CONFIG_CLASS
+IBUS_CONFIG_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibushotkey</FILE>
+<TITLE>IBusHotkeyProfile</TITLE>
+IBusHotkeyProfile
+ibus_hotkey_profile_add_hotkey
+ibus_hotkey_profile_add_hotkey_from_string
+ibus_hotkey_profile_remove_hotkey
+ibus_hotkey_profile_remove_hotkey_by_event
+ibus_hotkey_profile_filter_key_event
+<SUBSECTION Standard>
+IBUS_HOTKEY_PROFILE
+IBUS_IS_HOTKEY_PROFILE
+IBUS_TYPE_HOTKEY_PROFILE
+ibus_hotkey_profile_get_type
+IBUS_HOTKEY_PROFILE_CLASS
+IBUS_IS_HOTKEY_PROFILE_CLASS
+IBUS_HOTKEY_PROFILE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusenginedesc</FILE>
+BusComponent
+<TITLE>IBusEngineDesc</TITLE>
+IBusEngineDesc
+ibus_engine_desc_new
+ibus_engine_desc_new_from_xml_node
+ibus_engine_desc_output
+<SUBSECTION Standard>
+IBUS_ENGINE_DESC
+IBUS_IS_ENGINE_DESC
+IBUS_TYPE_ENGINE_DESC
+ibus_engine_desc_get_type
+IBUS_ENGINE_DESC_CLASS
+IBUS_IS_ENGINE_DESC_CLASS
+IBUS_ENGINE_DESC_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusfactory</FILE>
+IBUS_TYPE_FACTORY_INFO
+IBUS_FACTORY_INFO
+IBUS_FACTORY_INFO_CLASS
+IBUS_IS_FACTORY_INFO
+IBUS_IS_FACTORY_INFO_CLASS
+IBUS_FACTORY_INFO_GET_CLASS
+<TITLE>IBusFactory</TITLE>
+IBusFactory
+<TITLE>IBusFactoryInfo</TITLE>
+IBusFactoryInfo
+ibus_factory_new
+ibus_factory_add_engine
+ibus_factory_get_info
+ibus_factory_info_get_type
+ibus_factory_info_new
+<SUBSECTION Standard>
+IBUS_FACTORY
+IBUS_IS_FACTORY
+IBUS_TYPE_FACTORY
+ibus_factory_get_type
+IBUS_FACTORY_CLASS
+IBUS_IS_FACTORY_CLASS
+IBUS_FACTORY_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusobject</FILE>
+IBusObjectFlags
+IBUS_OBJECT_FLAGS
+IBUS_OBJECT_SET_FLAGS
+IBUS_OBJECT_UNSET_FLAGS
+IBUS_OBJECT_DESTROYED
+<TITLE>IBusObject</TITLE>
+IBusObject
+ibus_object_new
+ibus_object_destroy
+<SUBSECTION Standard>
+IBUS_OBJECT
+IBUS_IS_OBJECT
+IBUS_TYPE_OBJECT
+ibus_object_get_type
+IBUS_OBJECT_CLASS
+IBUS_IS_OBJECT_CLASS
+IBUS_OBJECT_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusbus</FILE>
+<TITLE>IBusBus</TITLE>
+IBusBus
+ibus_bus_new
+ibus_bus_is_connected
+ibus_bus_hello
+ibus_bus_request_name
+ibus_bus_release_name
+ibus_bus_name_has_owner
+ibus_bus_list_names
+ibus_bus_add_match
+ibus_bus_remove_match
+ibus_bus_get_name_owner
+ibus_bus_exit
+ibus_bus_register_component
+ibus_bus_list_engines
+ibus_bus_list_active_engines
+ibus_bus_get_config
+<SUBSECTION Standard>
+IBUS_BUS
+IBUS_IS_BUS
+IBUS_TYPE_BUS
+ibus_bus_get_type
+IBUS_BUS_CLASS
+IBUS_IS_BUS_CLASS
+IBUS_BUS_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusattribute</FILE>
+IBUS_TYPE_ATTR_LIST
+IBUS_ATTR_LIST
+IBUS_ATTR_LIST_CLASS
+IBUS_IS_ATTR_LIST
+IBUS_IS_ATTR_LIST_CLASS
+IBUS_ATTR_LIST_GET_CLASS
+IBusAttrType
+IBusAttrUnderline
+<TITLE>IBusAttribute</TITLE>
+IBusAttribute
+<TITLE>IBusAttrList</TITLE>
+IBusAttrList
+ibus_attribute_new
+ibus_attr_underline_new
+ibus_attr_foreground_new
+ibus_attr_background_new
+ibus_attr_list_get_type
+ibus_attr_list_new
+ibus_attr_list_append
+ibus_attr_list_get
+<SUBSECTION Standard>
+IBUS_ATTRIBUTE
+IBUS_IS_ATTRIBUTE
+IBUS_TYPE_ATTRIBUTE
+ibus_attribute_get_type
+IBUS_ATTRIBUTE_CLASS
+IBUS_IS_ATTRIBUTE_CLASS
+IBUS_ATTRIBUTE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusservice</FILE>
+ServiceIBusMessageFunc
+ServiceIBusSignalFunc
+<TITLE>IBusService</TITLE>
+IBusService
+ibus_service_new
+ibus_service_get_path
+ibus_service_handle_message
+ibus_service_add_to_connection
+ibus_service_get_connections
+ibus_service_remove_from_connection
+ibus_service_remove_from_all_connections
+ibus_service_send_signal
+<SUBSECTION Standard>
+IBUS_SERVICE
+IBUS_IS_SERVICE
+IBUS_TYPE_SERVICE
+ibus_service_get_type
+IBUS_SERVICE_CLASS
+IBUS_IS_SERVICE_CLASS
+IBUS_SERVICE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusserializable</FILE>
+ibus_serializable_set_attachment
+ibus_serializable_get_attachment
+ibus_serializable_remove_attachment
+IBusSerializableSerializeFunc
+IBusSerializableDeserializeFunc
+IBusSerializableCopyFunc
+<TITLE>IBusSerializable</TITLE>
+IBusSerializable
+ibus_serializable_new
+ibus_serializable_set_qattachment
+ibus_serializable_get_qattachment
+ibus_serializable_remove_qattachment
+ibus_serializable_copy
+ibus_serializable_serialize
+ibus_serializable_deserialize
+<SUBSECTION Standard>
+IBUS_SERIALIZABLE
+IBUS_IS_SERIALIZABLE
+IBUS_TYPE_SERIALIZABLE
+ibus_serializable_get_type
+IBUS_SERIALIZABLE_CLASS
+IBUS_IS_SERIALIZABLE_CLASS
+IBUS_SERIALIZABLE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibuslookuptable</FILE>
+<TITLE>IBusLookupTable</TITLE>
+IBusLookupTable
+ibus_lookup_table_new
+ibus_lookup_table_append_candidate
+ibus_lookup_table_get_candidate
+ibus_lookup_table_set_cursor_pos
+ibus_lookup_table_get_cursor_pos
+ibus_lookup_table_set_cursor_visible
+ibus_lookup_table_is_cursor_visible
+ibus_lookup_table_get_cursor_in_page
+ibus_lookup_table_set_page_size
+ibus_lookup_table_get_page_size
+ibus_lookup_table_clear
+ibus_lookup_table_page_up
+ibus_lookup_table_page_down
+ibus_lookup_table_cursor_up
+ibus_lookup_table_cursor_down
+<SUBSECTION Standard>
+IBUS_LOOKUP_TABLE
+IBUS_IS_LOOKUP_TABLE
+IBUS_TYPE_LOOKUP_TABLE
+ibus_lookup_table_get_type
+IBUS_LOOKUP_TABLE_CLASS
+IBUS_IS_LOOKUP_TABLE_CLASS
+IBUS_LOOKUP_TABLE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibustext</FILE>
+<TITLE>IBusText</TITLE>
+IBusText
+ibus_text_new_from_string
+ibus_text_new_from_ucs4
+ibus_text_new_from_static_string
+ibus_text_new_from_printf
+ibus_text_new_from_unichar
+ibus_text_append_attribute
+ibus_text_get_length
+<SUBSECTION Standard>
+IBUS_TEXT
+IBUS_IS_TEXT
+IBUS_TYPE_TEXT
+ibus_text_get_type
+IBUS_TEXT_CLASS
+IBUS_IS_TEXT_CLASS
+IBUS_TEXT_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusconnection</FILE>
+IBusIBusMessageFunc
+IBusIBusSignalFunc
+IBusMessageFunc
+<TITLE>IBusConnection</TITLE>
+IBusConnection
+ibus_connection_new
+ibus_connection_set_connection
+ibus_connection_open
+ibus_connection_open_private
+ibus_connection_close
+ibus_connection_is_connected
+ibus_connection_get_connection
+ibus_connection_read_write_dispatch
+ibus_connection_send
+ibus_connection_send_signal
+ibus_connection_send_signal_valist
+ibus_connection_send_valist
+ibus_connection_send_with_reply
+ibus_connection_send_with_reply_and_block
+ibus_connection_call
+ibus_connection_flush
+ibus_connection_register_object_path
+ibus_connection_unregister_object_path
+<SUBSECTION Standard>
+IBUS_CONNECTION
+IBUS_IS_CONNECTION
+IBUS_TYPE_CONNECTION
+ibus_connection_get_type
+IBUS_CONNECTION_CLASS
+IBUS_IS_CONNECTION_CLASS
+IBUS_CONNECTION_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibuscomponent</FILE>
+<TITLE>IBusComponent</TITLE>
+IBusComponent
+ibus_component_new
+ibus_component_new_from_xml_node
+ibus_component_new_from_file
+ibus_component_add_observed_path
+ibus_component_add_engine
+ibus_component_get_engines
+ibus_component_output
+ibus_component_output_engines
+ibus_component_check_modification
+ibus_component_start
+ibus_component_stop
+ibus_component_is_running
+ibus_component_get_from_engine
+<SUBSECTION Standard>
+IBUS_COMPONENT
+IBUS_IS_COMPONENT
+IBUS_TYPE_COMPONENT
+ibus_component_get_type
+IBUS_COMPONENT_CLASS
+IBUS_IS_COMPONENT_CLASS
+IBUS_COMPONENT_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusobservedpath</FILE>
+<TITLE>IBusObservedPath</TITLE>
+IBusObservedPath
+ibus_observed_path_new_from_xml_node
+ibus_observed_path_new
+ibus_observed_path_traverse
+ibus_observed_path_check_modification
+ibus_observed_path_output
+<SUBSECTION Standard>
+IBUS_OBSERVED_PATH
+IBUS_IS_OBSERVED_PATH
+IBUS_TYPE_OBSERVED_PATH
+ibus_observed_path_get_type
+IBUS_OBSERVED_PATH_CLASS
+IBUS_IS_OBSERVED_PATH_CLASS
+IBUS_OBSERVED_PATH_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusserver</FILE>
+IBusNewConnectionFunc
+<TITLE>IBusServer</TITLE>
+IBusServer
+ibus_server_new
+ibus_server_listen
+ibus_server_disconnect
+ibus_server_get_address
+ibus_server_get_id
+ibus_server_is_connected
+<SUBSECTION Standard>
+IBUS_SERVER
+IBUS_IS_SERVER
+IBUS_TYPE_SERVER
+ibus_server_get_type
+IBUS_SERVER_CLASS
+IBUS_IS_SERVER_CLASS
+IBUS_SERVER_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusengine</FILE>
+<TITLE>IBusEngine</TITLE>
+IBusEngine
+ibus_engine_new
+ibus_engine_commit_text
+ibus_engine_update_preedit_text
+ibus_engine_show_preedit_text
+ibus_engine_hide_preedit_text
+ibus_engine_update_auxiliary_text
+ibus_engine_show_auxiliary_text
+ibus_engine_hide_auxiliary_text
+ibus_engine_update_lookup_table
+ibus_engine_update_lookup_table_fast
+ibus_engine_show_lookup_table
+ibus_engine_hide_lookup_table
+ibus_engine_forward_key_event
+ibus_engine_register_properties
+ibus_engine_update_property
+ibus_engine_get_name
+<SUBSECTION Standard>
+IBUS_ENGINE
+IBUS_IS_ENGINE
+IBUS_TYPE_ENGINE
+ibus_engine_get_type
+IBUS_ENGINE_CLASS
+IBUS_IS_ENGINE_CLASS
+IBUS_ENGINE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusconfigservice</FILE>
+<TITLE>IBusConfigService</TITLE>
+IBusConfigService
+ibus_config_service_new
+ibus_config_service_value_changed
+<SUBSECTION Standard>
+IBUS_CONFIG_SERVICE
+IBUS_IS_CONFIG_SERVICE
+IBUS_TYPE_CONFIG_SERVICE
+ibus_config_service_get_type
+IBUS_CONFIG_SERVICE_CLASS
+IBUS_IS_CONFIG_SERVICE_CLASS
+IBUS_CONFIG_SERVICE_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibusinputcontext</FILE>
+<TITLE>IBusInputContext</TITLE>
+IBusInputContext
+ibus_input_context_process_key_event
+ibus_input_context_set_cursor_location
+ibus_input_context_set_capabilities
+ibus_input_context_focus_in
+ibus_input_context_focus_out
+ibus_input_context_reset
+ibus_input_context_enable
+ibus_input_context_disable
+<SUBSECTION Standard>
+IBUS_INPUT_CONTEXT
+IBUS_IS_INPUT_CONTEXT
+IBUS_TYPE_INPUT_CONTEXT
+ibus_input_context_get_type
+IBUS_INPUT_CONTEXT_CLASS
+IBUS_IS_INPUT_CONTEXT_CLASS
+IBUS_INPUT_CONTEXT_GET_CLASS
+</SECTION>
+
+<SECTION>
+<FILE>ibuspendingcall</FILE>
+IBusPendingCall
+IBusPendingCallNotifyFunction
+ibus_pending_call_ref
+ibus_pending_call_unref
+ibus_pending_call_set_notify
+ibus_pending_call_cancel
+ibus_pending_call_get_completed
+ibus_pending_call_steal_reply
+ibus_pending_call_block
+ibus_pending_call_wait
+ibus_pending_call_allocate_data_slot
+ibus_pending_call_free_data_slot
+ibus_pending_call_set_data
+ibus_pending_call_get_data
+</SECTION>
+
+<SECTION>
+<FILE>ibusxml</FILE>
+XMLNode
+ibus_xml_parse_file
+ibus_xml_parse_buffer
+ibus_xml_free
+ibus_xml_output
+</SECTION>
+
+<SECTION>
+<FILE>ibustypes</FILE>
+IBusModifierType
+IBusCapabilite
+IBusRectangle
+IBusFreeFunc
+</SECTION>
+
+<SECTION>
+<FILE>ibusmessage</FILE>
+IBUS_TYPE_OBJECT_PATH
+IBUS_TYPE_ARRAY
+IBUS_TYPE_STRUCT
+IBUS_TYPE_DICT_ENTRY
+IBUS_TYPE_VARIANT
+IBusMessage
+IBusMessageIter
+ibus_type_get_object_path
+ibus_type_get_array
+ibus_type_get_struct
+ibus_type_get_dict_entry
+ibus_type_get_variant
+ibus_message_new
+ibus_message_ref
+ibus_message_unref
+ibus_message_new_method_call
+ibus_message_new_method_return
+ibus_message_new_error
+ibus_message_new_error_printf
+ibus_message_new_signal
+ibus_message_is_method_call
+ibus_message_is_error
+ibus_message_is_signal
+ibus_message_set_destination
+ibus_message_set_sender
+ibus_message_set_error_name
+ibus_message_set_interface
+ibus_message_set_member
+ibus_message_set_path
+ibus_message_set_no_reply
+ibus_message_set_reply_serial
+ibus_message_get_type
+ibus_message_get_destination
+ibus_message_get_sender
+ibus_message_get_error_name
+ibus_message_get_error_message
+ibus_message_get_interface
+ibus_message_get_member
+ibus_message_get_path
+ibus_message_get_no_reply
+ibus_message_get_reply_serial
+ibus_message_get_serial
+ibus_message_append_args
+ibus_message_append_args_valist
+ibus_message_get_args
+ibus_message_get_args_valist
+ibus_message_iter_init_append
+ibus_message_iter_append
+ibus_message_iter_init
+ibus_message_iter_peek
+ibus_message_iter_get_basic
+ibus_message_iter_get
+ibus_message_iter_next
+ibus_message_iter_has_next
+ibus_message_iter_open_container
+ibus_message_iter_close_container
+ibus_message_iter_recurse
+ibus_message_iter_get_arg_type
+ibus_message_iter_get_element_type
+ibus_message_to_string
+</SECTION>
+
+<SECTION>
+<FILE>stamp-ibusenumtypes</FILE>
+</SECTION>
+
+<SECTION>
+<FILE>ibuserror</FILE>
+IBusError
+ibus_error_new
+ibus_error_new_from_text
+ibus_error_new_from_printf
+ibus_error_new_from_message
+ibus_error_free
+</SECTION>
+
+<SECTION>
+<FILE>ibusenumtypes</FILE>
+ibus_object_flags_get_type
+IBUS_TYPE_OBJECT_FLAGS
+ibus_attr_type_get_type
+IBUS_TYPE_ATTR_TYPE
+ibus_attr_underline_get_type
+IBUS_TYPE_ATTR_UNDERLINE
+ibus_prop_type_get_type
+IBUS_TYPE_PROP_TYPE
+ibus_prop_state_get_type
+IBUS_TYPE_PROP_STATE
+ibus_modifier_type_get_type
+IBUS_TYPE_MODIFIER_TYPE
+ibus_capabilite_get_type
+IBUS_TYPE_CAPABILITE
+</SECTION>
+
+<SECTION>
+<FILE>ibusshare</FILE>
+IBUS_SERVICE_IBUS
+IBUS_SERVICE_PANEL
+IBUS_SERVICE_CONFIG
+IBUS_SERVICE_NOTIFICATIONS
+IBUS_PATH_IBUS
+IBUS_PATH_FACTORY
+IBUS_PATH_PANEL
+IBUS_PATH_CONFIG
+IBUS_PATH_NOTIFICATIONS
+IBUS_PATH_INPUT_CONTEXT
+IBUS_INTERFACE_IBUS
+IBUS_INTERFACE_INPUT_CONTEXT
+IBUS_INTERFACE_FACTORY
+IBUS_INTERFACE_ENGINE
+IBUS_INTERFACE_PANEL
+IBUS_INTERFACE_CONFIG
+IBUS_INTERFACE_NOTIFICATIONS
+ibus_get_address
+ibus_get_user_name
+ibus_get_socket_path
+ibus_keyval_name
+ibus_keyval_from_name
+ibus_free_strv
+ibus_key_event_to_string
+ibus_key_event_from_string
+ibus_init
+ibus_main
+ibus_quit
+</SECTION>
+
+<SECTION>
+<FILE>ibusconfigprivate</FILE>
+</SECTION>
+
+<SECTION>
+<FILE>stamp-ibusmarshalers</FILE>
+</SECTION>
+
+<SECTION>
+<FILE>keyname-table</FILE>
+gdk_key
+</SECTION>
+
+<SECTION>
+<FILE>ibusmarshalers</FILE>
+ibus_marshal_VOID__VOID
+ibus_marshal_VOID__NONE
+ibus_marshal_VOID__OBJECT
+ibus_marshal_VOID__POINTER
+ibus_marshal_VOID__STRING
+ibus_marshal_VOID__STRING_INT
+ibus_marshal_VOID__STRING_UINT
+ibus_marshal_BOOLEAN__POINTER
+ibus_marshal_BOOL__POINTER
+ibus_marshal_BOOLEAN__POINTER_POINTER
+ibus_marshal_BOOL__POINTER_POINTER
+ibus_marshal_BOOLEAN__UINT_UINT
+ibus_marshal_BOOL__UINT_UINT
+ibus_marshal_VOID__INT_INT_INT_INT
+ibus_marshal_VOID__UINT_UINT
+ibus_marshal_VOID__OBJECT_UINT_BOOLEAN
+ibus_marshal_VOID__OBJECT_UINT_BOOL
+ibus_marshal_VOID__OBJECT_BOOLEAN
+ibus_marshal_VOID__OBJECT_BOOL
+ibus_marshal_VOID__BOXED_BOOLEAN
+ibus_marshal_VOID__BOXED_BOOL
+ibus_marshal_VOID__BOXED
+ibus_marshal_VOID__STRING_STRING_BOXED
+ibus_marshal_VOID__STRING_STRING_STRING
+ibus_marshal_VOID__UINT
+ibus_marshal_VOID__UINT_POINTER
+</SECTION>
+
+<SECTION>
+<FILE>ibus</FILE>
+</SECTION>
+
+<SECTION>
+<FILE>ibuskeysyms</FILE>
+IBUS_VoidSymbol
+IBUS_BackSpace
+IBUS_Tab
+IBUS_Linefeed
+IBUS_Clear
+IBUS_Return
+IBUS_Pause
+IBUS_Scroll_Lock
+IBUS_Sys_Req
+IBUS_Escape
+IBUS_Delete
+IBUS_Multi_key
+IBUS_Codeinput
+IBUS_SingleCandidate
+IBUS_MultipleCandidate
+IBUS_PreviousCandidate
+IBUS_Kanji
+IBUS_Muhenkan
+IBUS_Henkan_Mode
+IBUS_Henkan
+IBUS_Romaji
+IBUS_Hiragana
+IBUS_Katakana
+IBUS_Hiragana_Katakana
+IBUS_Zenkaku
+IBUS_Hankaku
+IBUS_Zenkaku_Hankaku
+IBUS_Touroku
+IBUS_Massyo
+IBUS_Kana_Lock
+IBUS_Kana_Shift
+IBUS_Eisu_Shift
+IBUS_Eisu_toggle
+IBUS_Kanji_Bangou
+IBUS_Zen_Koho
+IBUS_Mae_Koho
+IBUS_Home
+IBUS_Left
+IBUS_Up
+IBUS_Right
+IBUS_Down
+IBUS_Prior
+IBUS_Page_Up
+IBUS_Next
+IBUS_Page_Down
+IBUS_End
+IBUS_Begin
+IBUS_Select
+IBUS_Print
+IBUS_Execute
+IBUS_Insert
+IBUS_Undo
+IBUS_Redo
+IBUS_Menu
+IBUS_Find
+IBUS_Cancel
+IBUS_Help
+IBUS_Break
+IBUS_Mode_switch
+IBUS_script_switch
+IBUS_Num_Lock
+IBUS_KP_Space
+IBUS_KP_Tab
+IBUS_KP_Enter
+IBUS_KP_F1
+IBUS_KP_F2
+IBUS_KP_F3
+IBUS_KP_F4
+IBUS_KP_Home
+IBUS_KP_Left
+IBUS_KP_Up
+IBUS_KP_Right
+IBUS_KP_Down
+IBUS_KP_Prior
+IBUS_KP_Page_Up
+IBUS_KP_Next
+IBUS_KP_Page_Down
+IBUS_KP_End
+IBUS_KP_Begin
+IBUS_KP_Insert
+IBUS_KP_Delete
+IBUS_KP_Equal
+IBUS_KP_Multiply
+IBUS_KP_Add
+IBUS_KP_Separator
+IBUS_KP_Subtract
+IBUS_KP_Decimal
+IBUS_KP_Divide
+IBUS_KP_0
+IBUS_KP_1
+IBUS_KP_2
+IBUS_KP_3
+IBUS_KP_4
+IBUS_KP_5
+IBUS_KP_6
+IBUS_KP_7
+IBUS_KP_8
+IBUS_KP_9
+IBUS_F1
+IBUS_F2
+IBUS_F3
+IBUS_F4
+IBUS_F5
+IBUS_F6
+IBUS_F7
+IBUS_F8
+IBUS_F9
+IBUS_F10
+IBUS_F11
+IBUS_L1
+IBUS_F12
+IBUS_L2
+IBUS_F13
+IBUS_L3
+IBUS_F14
+IBUS_L4
+IBUS_F15
+IBUS_L5
+IBUS_F16
+IBUS_L6
+IBUS_F17
+IBUS_L7
+IBUS_F18
+IBUS_L8
+IBUS_F19
+IBUS_L9
+IBUS_F20
+IBUS_L10
+IBUS_F21
+IBUS_R1
+IBUS_F22
+IBUS_R2
+IBUS_F23
+IBUS_R3
+IBUS_F24
+IBUS_R4
+IBUS_F25
+IBUS_R5
+IBUS_F26
+IBUS_R6
+IBUS_F27
+IBUS_R7
+IBUS_F28
+IBUS_R8
+IBUS_F29
+IBUS_R9
+IBUS_F30
+IBUS_R10
+IBUS_F31
+IBUS_R11
+IBUS_F32
+IBUS_R12
+IBUS_F33
+IBUS_R13
+IBUS_F34
+IBUS_R14
+IBUS_F35
+IBUS_R15
+IBUS_Shift_L
+IBUS_Shift_R
+IBUS_Control_L
+IBUS_Control_R
+IBUS_Caps_Lock
+IBUS_Shift_Lock
+IBUS_Meta_L
+IBUS_Meta_R
+IBUS_Alt_L
+IBUS_Alt_R
+IBUS_Super_L
+IBUS_Super_R
+IBUS_Hyper_L
+IBUS_Hyper_R
+IBUS_ISO_Lock
+IBUS_ISO_Level2_Latch
+IBUS_ISO_Level3_Shift
+IBUS_ISO_Level3_Latch
+IBUS_ISO_Level3_Lock
+IBUS_ISO_Level5_Shift
+IBUS_ISO_Level5_Latch
+IBUS_ISO_Level5_Lock
+IBUS_ISO_Group_Shift
+IBUS_ISO_Group_Latch
+IBUS_ISO_Group_Lock
+IBUS_ISO_Next_Group
+IBUS_ISO_Next_Group_Lock
+IBUS_ISO_Prev_Group
+IBUS_ISO_Prev_Group_Lock
+IBUS_ISO_First_Group
+IBUS_ISO_First_Group_Lock
+IBUS_ISO_Last_Group
+IBUS_ISO_Last_Group_Lock
+IBUS_ISO_Left_Tab
+IBUS_ISO_Move_Line_Up
+IBUS_ISO_Move_Line_Down
+IBUS_ISO_Partial_Line_Up
+IBUS_ISO_Partial_Line_Down
+IBUS_ISO_Partial_Space_Left
+IBUS_ISO_Partial_Space_Right
+IBUS_ISO_Set_Margin_Left
+IBUS_ISO_Set_Margin_Right
+IBUS_ISO_Release_Margin_Left
+IBUS_ISO_Release_Margin_Right
+IBUS_ISO_Release_Both_Margins
+IBUS_ISO_Fast_Cursor_Left
+IBUS_ISO_Fast_Cursor_Right
+IBUS_ISO_Fast_Cursor_Up
+IBUS_ISO_Fast_Cursor_Down
+IBUS_ISO_Continuous_Underline
+IBUS_ISO_Discontinuous_Underline
+IBUS_ISO_Emphasize
+IBUS_ISO_Center_Object
+IBUS_ISO_Enter
+IBUS_dead_grave
+IBUS_dead_acute
+IBUS_dead_circumflex
+IBUS_dead_tilde
+IBUS_dead_perispomeni
+IBUS_dead_macron
+IBUS_dead_breve
+IBUS_dead_abovedot
+IBUS_dead_diaeresis
+IBUS_dead_abovering
+IBUS_dead_doubleacute
+IBUS_dead_caron
+IBUS_dead_cedilla
+IBUS_dead_ogonek
+IBUS_dead_iota
+IBUS_dead_voiced_sound
+IBUS_dead_semivoiced_sound
+IBUS_dead_belowdot
+IBUS_dead_hook
+IBUS_dead_horn
+IBUS_dead_stroke
+IBUS_dead_abovecomma
+IBUS_dead_psili
+IBUS_dead_abovereversedcomma
+IBUS_dead_dasia
+IBUS_dead_belowring
+IBUS_dead_belowmacron
+IBUS_dead_belowcircumflex
+IBUS_dead_belowtilde
+IBUS_dead_belowbreve
+IBUS_dead_belowdiaeresis
+IBUS_First_Virtual_Screen
+IBUS_Prev_Virtual_Screen
+IBUS_Next_Virtual_Screen
+IBUS_Last_Virtual_Screen
+IBUS_Terminate_Server
+IBUS_AccessX_Enable
+IBUS_AccessX_Feedback_Enable
+IBUS_RepeatKeys_Enable
+IBUS_SlowKeys_Enable
+IBUS_BounceKeys_Enable
+IBUS_StickyKeys_Enable
+IBUS_MouseKeys_Enable
+IBUS_MouseKeys_Accel_Enable
+IBUS_Overlay1_Enable
+IBUS_Overlay2_Enable
+IBUS_AudibleBell_Enable
+IBUS_Pointer_Left
+IBUS_Pointer_Right
+IBUS_Pointer_Up
+IBUS_Pointer_Down
+IBUS_Pointer_UpLeft
+IBUS_Pointer_UpRight
+IBUS_Pointer_DownLeft
+IBUS_Pointer_DownRight
+IBUS_Pointer_Button_Dflt
+IBUS_Pointer_Button1
+IBUS_Pointer_Button2
+IBUS_Pointer_Button3
+IBUS_Pointer_Button4
+IBUS_Pointer_Button5
+IBUS_Pointer_DblClick_Dflt
+IBUS_Pointer_DblClick1
+IBUS_Pointer_DblClick2
+IBUS_Pointer_DblClick3
+IBUS_Pointer_DblClick4
+IBUS_Pointer_DblClick5
+IBUS_Pointer_Drag_Dflt
+IBUS_Pointer_Drag1
+IBUS_Pointer_Drag2
+IBUS_Pointer_Drag3
+IBUS_Pointer_Drag4
+IBUS_Pointer_Drag5
+IBUS_Pointer_EnableKeys
+IBUS_Pointer_Accelerate
+IBUS_Pointer_DfltBtnNext
+IBUS_Pointer_DfltBtnPrev
+IBUS_3270_Duplicate
+IBUS_3270_FieldMark
+IBUS_3270_Right2
+IBUS_3270_Left2
+IBUS_3270_BackTab
+IBUS_3270_EraseEOF
+IBUS_3270_EraseInput
+IBUS_3270_Reset
+IBUS_3270_Quit
+IBUS_3270_PA1
+IBUS_3270_PA2
+IBUS_3270_PA3
+IBUS_3270_Test
+IBUS_3270_Attn
+IBUS_3270_CursorBlink
+IBUS_3270_AltCursor
+IBUS_3270_KeyClick
+IBUS_3270_Jump
+IBUS_3270_Ident
+IBUS_3270_Rule
+IBUS_3270_Copy
+IBUS_3270_Play
+IBUS_3270_Setup
+IBUS_3270_Record
+IBUS_3270_ChangeScreen
+IBUS_3270_DeleteWord
+IBUS_3270_ExSelect
+IBUS_3270_CursorSelect
+IBUS_3270_PrintScreen
+IBUS_3270_Enter
+IBUS_space
+IBUS_exclam
+IBUS_quotedbl
+IBUS_numbersign
+IBUS_dollar
+IBUS_percent
+IBUS_ampersand
+IBUS_apostrophe
+IBUS_quoteright
+IBUS_parenleft
+IBUS_parenright
+IBUS_asterisk
+IBUS_plus
+IBUS_comma
+IBUS_minus
+IBUS_period
+IBUS_slash
+IBUS_0
+IBUS_1
+IBUS_2
+IBUS_3
+IBUS_4
+IBUS_5
+IBUS_6
+IBUS_7
+IBUS_8
+IBUS_9
+IBUS_colon
+IBUS_semicolon
+IBUS_less
+IBUS_equal
+IBUS_greater
+IBUS_question
+IBUS_at
+IBUS_A
+IBUS_B
+IBUS_C
+IBUS_D
+IBUS_E
+IBUS_F
+IBUS_G
+IBUS_H
+IBUS_I
+IBUS_J
+IBUS_K
+IBUS_L
+IBUS_M
+IBUS_N
+IBUS_O
+IBUS_P
+IBUS_Q
+IBUS_R
+IBUS_S
+IBUS_T
+IBUS_U
+IBUS_V
+IBUS_W
+IBUS_X
+IBUS_Y
+IBUS_Z
+IBUS_bracketleft
+IBUS_backslash
+IBUS_bracketright
+IBUS_asciicircum
+IBUS_underscore
+IBUS_grave
+IBUS_quoteleft
+IBUS_a
+IBUS_b
+IBUS_c
+IBUS_d
+IBUS_e
+IBUS_f
+IBUS_g
+IBUS_h
+IBUS_i
+IBUS_j
+IBUS_k
+IBUS_l
+IBUS_m
+IBUS_n
+IBUS_o
+IBUS_p
+IBUS_q
+IBUS_r
+IBUS_s
+IBUS_t
+IBUS_u
+IBUS_v
+IBUS_w
+IBUS_x
+IBUS_y
+IBUS_z
+IBUS_braceleft
+IBUS_bar
+IBUS_braceright
+IBUS_asciitilde
+IBUS_nobreakspace
+IBUS_exclamdown
+IBUS_cent
+IBUS_sterling
+IBUS_currency
+IBUS_yen
+IBUS_brokenbar
+IBUS_section
+IBUS_diaeresis
+IBUS_copyright
+IBUS_ordfeminine
+IBUS_guillemotleft
+IBUS_notsign
+IBUS_hyphen
+IBUS_registered
+IBUS_macron
+IBUS_degree
+IBUS_plusminus
+IBUS_twosuperior
+IBUS_threesuperior
+IBUS_acute
+IBUS_mu
+IBUS_paragraph
+IBUS_periodcentered
+IBUS_cedilla
+IBUS_onesuperior
+IBUS_masculine
+IBUS_guillemotright
+IBUS_onequarter
+IBUS_onehalf
+IBUS_threequarters
+IBUS_questiondown
+IBUS_Agrave
+IBUS_Aacute
+IBUS_Acircumflex
+IBUS_Atilde
+IBUS_Adiaeresis
+IBUS_Aring
+IBUS_AE
+IBUS_Ccedilla
+IBUS_Egrave
+IBUS_Eacute
+IBUS_Ecircumflex
+IBUS_Ediaeresis
+IBUS_Igrave
+IBUS_Iacute
+IBUS_Icircumflex
+IBUS_Idiaeresis
+IBUS_ETH
+IBUS_Eth
+IBUS_Ntilde
+IBUS_Ograve
+IBUS_Oacute
+IBUS_Ocircumflex
+IBUS_Otilde
+IBUS_Odiaeresis
+IBUS_multiply
+IBUS_Oslash
+IBUS_Ooblique
+IBUS_Ugrave
+IBUS_Uacute
+IBUS_Ucircumflex
+IBUS_Udiaeresis
+IBUS_Yacute
+IBUS_THORN
+IBUS_Thorn
+IBUS_ssharp
+IBUS_agrave
+IBUS_aacute
+IBUS_acircumflex
+IBUS_atilde
+IBUS_adiaeresis
+IBUS_aring
+IBUS_ae
+IBUS_ccedilla
+IBUS_egrave
+IBUS_eacute
+IBUS_ecircumflex
+IBUS_ediaeresis
+IBUS_igrave
+IBUS_iacute
+IBUS_icircumflex
+IBUS_idiaeresis
+IBUS_eth
+IBUS_ntilde
+IBUS_ograve
+IBUS_oacute
+IBUS_ocircumflex
+IBUS_otilde
+IBUS_odiaeresis
+IBUS_division
+IBUS_oslash
+IBUS_ooblique
+IBUS_ugrave
+IBUS_uacute
+IBUS_ucircumflex
+IBUS_udiaeresis
+IBUS_yacute
+IBUS_thorn
+IBUS_ydiaeresis
+IBUS_Aogonek
+IBUS_breve
+IBUS_Lstroke
+IBUS_Lcaron
+IBUS_Sacute
+IBUS_Scaron
+IBUS_Scedilla
+IBUS_Tcaron
+IBUS_Zacute
+IBUS_Zcaron
+IBUS_Zabovedot
+IBUS_aogonek
+IBUS_ogonek
+IBUS_lstroke
+IBUS_lcaron
+IBUS_sacute
+IBUS_caron
+IBUS_scaron
+IBUS_scedilla
+IBUS_tcaron
+IBUS_zacute
+IBUS_doubleacute
+IBUS_zcaron
+IBUS_zabovedot
+IBUS_Racute
+IBUS_Abreve
+IBUS_Lacute
+IBUS_Cacute
+IBUS_Ccaron
+IBUS_Eogonek
+IBUS_Ecaron
+IBUS_Dcaron
+IBUS_Dstroke
+IBUS_Nacute
+IBUS_Ncaron
+IBUS_Odoubleacute
+IBUS_Rcaron
+IBUS_Uring
+IBUS_Udoubleacute
+IBUS_Tcedilla
+IBUS_racute
+IBUS_abreve
+IBUS_lacute
+IBUS_cacute
+IBUS_ccaron
+IBUS_eogonek
+IBUS_ecaron
+IBUS_dcaron
+IBUS_dstroke
+IBUS_nacute
+IBUS_ncaron
+IBUS_odoubleacute
+IBUS_udoubleacute
+IBUS_rcaron
+IBUS_uring
+IBUS_tcedilla
+IBUS_abovedot
+IBUS_Hstroke
+IBUS_Hcircumflex
+IBUS_Iabovedot
+IBUS_Gbreve
+IBUS_Jcircumflex
+IBUS_hstroke
+IBUS_hcircumflex
+IBUS_idotless
+IBUS_gbreve
+IBUS_jcircumflex
+IBUS_Cabovedot
+IBUS_Ccircumflex
+IBUS_Gabovedot
+IBUS_Gcircumflex
+IBUS_Ubreve
+IBUS_Scircumflex
+IBUS_cabovedot
+IBUS_ccircumflex
+IBUS_gabovedot
+IBUS_gcircumflex
+IBUS_ubreve
+IBUS_scircumflex
+IBUS_kra
+IBUS_kappa
+IBUS_Rcedilla
+IBUS_Itilde
+IBUS_Lcedilla
+IBUS_Emacron
+IBUS_Gcedilla
+IBUS_Tslash
+IBUS_rcedilla
+IBUS_itilde
+IBUS_lcedilla
+IBUS_emacron
+IBUS_gcedilla
+IBUS_tslash
+IBUS_ENG
+IBUS_eng
+IBUS_Amacron
+IBUS_Iogonek
+IBUS_Eabovedot
+IBUS_Imacron
+IBUS_Ncedilla
+IBUS_Omacron
+IBUS_Kcedilla
+IBUS_Uogonek
+IBUS_Utilde
+IBUS_Umacron
+IBUS_amacron
+IBUS_iogonek
+IBUS_eabovedot
+IBUS_imacron
+IBUS_ncedilla
+IBUS_omacron
+IBUS_kcedilla
+IBUS_uogonek
+IBUS_utilde
+IBUS_umacron
+IBUS_Babovedot
+IBUS_babovedot
+IBUS_Dabovedot
+IBUS_Wgrave
+IBUS_Wacute
+IBUS_dabovedot
+IBUS_Ygrave
+IBUS_Fabovedot
+IBUS_fabovedot
+IBUS_Mabovedot
+IBUS_mabovedot
+IBUS_Pabovedot
+IBUS_wgrave
+IBUS_pabovedot
+IBUS_wacute
+IBUS_Sabovedot
+IBUS_ygrave
+IBUS_Wdiaeresis
+IBUS_wdiaeresis
+IBUS_sabovedot
+IBUS_Wcircumflex
+IBUS_Tabovedot
+IBUS_Ycircumflex
+IBUS_wcircumflex
+IBUS_tabovedot
+IBUS_ycircumflex
+IBUS_OE
+IBUS_oe
+IBUS_Ydiaeresis
+IBUS_overline
+IBUS_kana_fullstop
+IBUS_kana_openingbracket
+IBUS_kana_closingbracket
+IBUS_kana_comma
+IBUS_kana_conjunctive
+IBUS_kana_middledot
+IBUS_kana_WO
+IBUS_kana_a
+IBUS_kana_i
+IBUS_kana_u
+IBUS_kana_e
+IBUS_kana_o
+IBUS_kana_ya
+IBUS_kana_yu
+IBUS_kana_yo
+IBUS_kana_tsu
+IBUS_kana_tu
+IBUS_prolongedsound
+IBUS_kana_A
+IBUS_kana_I
+IBUS_kana_U
+IBUS_kana_E
+IBUS_kana_O
+IBUS_kana_KA
+IBUS_kana_KI
+IBUS_kana_KU
+IBUS_kana_KE
+IBUS_kana_KO
+IBUS_kana_SA
+IBUS_kana_SHI
+IBUS_kana_SU
+IBUS_kana_SE
+IBUS_kana_SO
+IBUS_kana_TA
+IBUS_kana_CHI
+IBUS_kana_TI
+IBUS_kana_TSU
+IBUS_kana_TU
+IBUS_kana_TE
+IBUS_kana_TO
+IBUS_kana_NA
+IBUS_kana_NI
+IBUS_kana_NU
+IBUS_kana_NE
+IBUS_kana_NO
+IBUS_kana_HA
+IBUS_kana_HI
+IBUS_kana_FU
+IBUS_kana_HU
+IBUS_kana_HE
+IBUS_kana_HO
+IBUS_kana_MA
+IBUS_kana_MI
+IBUS_kana_MU
+IBUS_kana_ME
+IBUS_kana_MO
+IBUS_kana_YA
+IBUS_kana_YU
+IBUS_kana_YO
+IBUS_kana_RA
+IBUS_kana_RI
+IBUS_kana_RU
+IBUS_kana_RE
+IBUS_kana_RO
+IBUS_kana_WA
+IBUS_kana_N
+IBUS_voicedsound
+IBUS_semivoicedsound
+IBUS_kana_switch
+IBUS_Farsi_0
+IBUS_Farsi_1
+IBUS_Farsi_2
+IBUS_Farsi_3
+IBUS_Farsi_4
+IBUS_Farsi_5
+IBUS_Farsi_6
+IBUS_Farsi_7
+IBUS_Farsi_8
+IBUS_Farsi_9
+IBUS_Arabic_percent
+IBUS_Arabic_superscript_alef
+IBUS_Arabic_tteh
+IBUS_Arabic_peh
+IBUS_Arabic_tcheh
+IBUS_Arabic_ddal
+IBUS_Arabic_rreh
+IBUS_Arabic_comma
+IBUS_Arabic_fullstop
+IBUS_Arabic_0
+IBUS_Arabic_1
+IBUS_Arabic_2
+IBUS_Arabic_3
+IBUS_Arabic_4
+IBUS_Arabic_5
+IBUS_Arabic_6
+IBUS_Arabic_7
+IBUS_Arabic_8
+IBUS_Arabic_9
+IBUS_Arabic_semicolon
+IBUS_Arabic_question_mark
+IBUS_Arabic_hamza
+IBUS_Arabic_maddaonalef
+IBUS_Arabic_hamzaonalef
+IBUS_Arabic_hamzaonwaw
+IBUS_Arabic_hamzaunderalef
+IBUS_Arabic_hamzaonyeh
+IBUS_Arabic_alef
+IBUS_Arabic_beh
+IBUS_Arabic_tehmarbuta
+IBUS_Arabic_teh
+IBUS_Arabic_theh
+IBUS_Arabic_jeem
+IBUS_Arabic_hah
+IBUS_Arabic_khah
+IBUS_Arabic_dal
+IBUS_Arabic_thal
+IBUS_Arabic_ra
+IBUS_Arabic_zain
+IBUS_Arabic_seen
+IBUS_Arabic_sheen
+IBUS_Arabic_sad
+IBUS_Arabic_dad
+IBUS_Arabic_tah
+IBUS_Arabic_zah
+IBUS_Arabic_ain
+IBUS_Arabic_ghain
+IBUS_Arabic_tatweel
+IBUS_Arabic_feh
+IBUS_Arabic_qaf
+IBUS_Arabic_kaf
+IBUS_Arabic_lam
+IBUS_Arabic_meem
+IBUS_Arabic_noon
+IBUS_Arabic_ha
+IBUS_Arabic_heh
+IBUS_Arabic_waw
+IBUS_Arabic_alefmaksura
+IBUS_Arabic_yeh
+IBUS_Arabic_fathatan
+IBUS_Arabic_dammatan
+IBUS_Arabic_kasratan
+IBUS_Arabic_fatha
+IBUS_Arabic_damma
+IBUS_Arabic_kasra
+IBUS_Arabic_shadda
+IBUS_Arabic_sukun
+IBUS_Arabic_madda_above
+IBUS_Arabic_hamza_above
+IBUS_Arabic_hamza_below
+IBUS_Arabic_jeh
+IBUS_Arabic_veh
+IBUS_Arabic_keheh
+IBUS_Arabic_gaf
+IBUS_Arabic_noon_ghunna
+IBUS_Arabic_heh_doachashmee
+IBUS_Farsi_yeh
+IBUS_Arabic_farsi_yeh
+IBUS_Arabic_yeh_baree
+IBUS_Arabic_heh_goal
+IBUS_Arabic_switch
+IBUS_Cyrillic_GHE_bar
+IBUS_Cyrillic_ghe_bar
+IBUS_Cyrillic_ZHE_descender
+IBUS_Cyrillic_zhe_descender
+IBUS_Cyrillic_KA_descender
+IBUS_Cyrillic_ka_descender
+IBUS_Cyrillic_KA_vertstroke
+IBUS_Cyrillic_ka_vertstroke
+IBUS_Cyrillic_EN_descender
+IBUS_Cyrillic_en_descender
+IBUS_Cyrillic_U_straight
+IBUS_Cyrillic_u_straight
+IBUS_Cyrillic_U_straight_bar
+IBUS_Cyrillic_u_straight_bar
+IBUS_Cyrillic_HA_descender
+IBUS_Cyrillic_ha_descender
+IBUS_Cyrillic_CHE_descender
+IBUS_Cyrillic_che_descender
+IBUS_Cyrillic_CHE_vertstroke
+IBUS_Cyrillic_che_vertstroke
+IBUS_Cyrillic_SHHA
+IBUS_Cyrillic_shha
+IBUS_Cyrillic_SCHWA
+IBUS_Cyrillic_schwa
+IBUS_Cyrillic_I_macron
+IBUS_Cyrillic_i_macron
+IBUS_Cyrillic_O_bar
+IBUS_Cyrillic_o_bar
+IBUS_Cyrillic_U_macron
+IBUS_Cyrillic_u_macron
+IBUS_Serbian_dje
+IBUS_Macedonia_gje
+IBUS_Cyrillic_io
+IBUS_Ukrainian_ie
+IBUS_Ukranian_je
+IBUS_Macedonia_dse
+IBUS_Ukrainian_i
+IBUS_Ukranian_i
+IBUS_Ukrainian_yi
+IBUS_Ukranian_yi
+IBUS_Cyrillic_je
+IBUS_Serbian_je
+IBUS_Cyrillic_lje
+IBUS_Serbian_lje
+IBUS_Cyrillic_nje
+IBUS_Serbian_nje
+IBUS_Serbian_tshe
+IBUS_Macedonia_kje
+IBUS_Ukrainian_ghe_with_upturn
+IBUS_Byelorussian_shortu
+IBUS_Cyrillic_dzhe
+IBUS_Serbian_dze
+IBUS_numerosign
+IBUS_Serbian_DJE
+IBUS_Macedonia_GJE
+IBUS_Cyrillic_IO
+IBUS_Ukrainian_IE
+IBUS_Ukranian_JE
+IBUS_Macedonia_DSE
+IBUS_Ukrainian_I
+IBUS_Ukranian_I
+IBUS_Ukrainian_YI
+IBUS_Ukranian_YI
+IBUS_Cyrillic_JE
+IBUS_Serbian_JE
+IBUS_Cyrillic_LJE
+IBUS_Serbian_LJE
+IBUS_Cyrillic_NJE
+IBUS_Serbian_NJE
+IBUS_Serbian_TSHE
+IBUS_Macedonia_KJE
+IBUS_Ukrainian_GHE_WITH_UPTURN
+IBUS_Byelorussian_SHORTU
+IBUS_Cyrillic_DZHE
+IBUS_Serbian_DZE
+IBUS_Cyrillic_yu
+IBUS_Cyrillic_a
+IBUS_Cyrillic_be
+IBUS_Cyrillic_tse
+IBUS_Cyrillic_de
+IBUS_Cyrillic_ie
+IBUS_Cyrillic_ef
+IBUS_Cyrillic_ghe
+IBUS_Cyrillic_ha
+IBUS_Cyrillic_i
+IBUS_Cyrillic_shorti
+IBUS_Cyrillic_ka
+IBUS_Cyrillic_el
+IBUS_Cyrillic_em
+IBUS_Cyrillic_en
+IBUS_Cyrillic_o
+IBUS_Cyrillic_pe
+IBUS_Cyrillic_ya
+IBUS_Cyrillic_er
+IBUS_Cyrillic_es
+IBUS_Cyrillic_te
+IBUS_Cyrillic_u
+IBUS_Cyrillic_zhe
+IBUS_Cyrillic_ve
+IBUS_Cyrillic_softsign
+IBUS_Cyrillic_yeru
+IBUS_Cyrillic_ze
+IBUS_Cyrillic_sha
+IBUS_Cyrillic_e
+IBUS_Cyrillic_shcha
+IBUS_Cyrillic_che
+IBUS_Cyrillic_hardsign
+IBUS_Cyrillic_YU
+IBUS_Cyrillic_A
+IBUS_Cyrillic_BE
+IBUS_Cyrillic_TSE
+IBUS_Cyrillic_DE
+IBUS_Cyrillic_IE
+IBUS_Cyrillic_EF
+IBUS_Cyrillic_GHE
+IBUS_Cyrillic_HA
+IBUS_Cyrillic_I
+IBUS_Cyrillic_SHORTI
+IBUS_Cyrillic_KA
+IBUS_Cyrillic_EL
+IBUS_Cyrillic_EM
+IBUS_Cyrillic_EN
+IBUS_Cyrillic_O
+IBUS_Cyrillic_PE
+IBUS_Cyrillic_YA
+IBUS_Cyrillic_ER
+IBUS_Cyrillic_ES
+IBUS_Cyrillic_TE
+IBUS_Cyrillic_U
+IBUS_Cyrillic_ZHE
+IBUS_Cyrillic_VE
+IBUS_Cyrillic_SOFTSIGN
+IBUS_Cyrillic_YERU
+IBUS_Cyrillic_ZE
+IBUS_Cyrillic_SHA
+IBUS_Cyrillic_E
+IBUS_Cyrillic_SHCHA
+IBUS_Cyrillic_CHE
+IBUS_Cyrillic_HARDSIGN
+IBUS_Greek_ALPHAaccent
+IBUS_Greek_EPSILONaccent
+IBUS_Greek_ETAaccent
+IBUS_Greek_IOTAaccent
+IBUS_Greek_IOTAdieresis
+IBUS_Greek_IOTAdiaeresis
+IBUS_Greek_OMICRONaccent
+IBUS_Greek_UPSILONaccent
+IBUS_Greek_UPSILONdieresis
+IBUS_Greek_OMEGAaccent
+IBUS_Greek_accentdieresis
+IBUS_Greek_horizbar
+IBUS_Greek_alphaaccent
+IBUS_Greek_epsilonaccent
+IBUS_Greek_etaaccent
+IBUS_Greek_iotaaccent
+IBUS_Greek_iotadieresis
+IBUS_Greek_iotaaccentdieresis
+IBUS_Greek_omicronaccent
+IBUS_Greek_upsilonaccent
+IBUS_Greek_upsilondieresis
+IBUS_Greek_upsilonaccentdieresis
+IBUS_Greek_omegaaccent
+IBUS_Greek_ALPHA
+IBUS_Greek_BETA
+IBUS_Greek_GAMMA
+IBUS_Greek_DELTA
+IBUS_Greek_EPSILON
+IBUS_Greek_ZETA
+IBUS_Greek_ETA
+IBUS_Greek_THETA
+IBUS_Greek_IOTA
+IBUS_Greek_KAPPA
+IBUS_Greek_LAMDA
+IBUS_Greek_LAMBDA
+IBUS_Greek_MU
+IBUS_Greek_NU
+IBUS_Greek_XI
+IBUS_Greek_OMICRON
+IBUS_Greek_PI
+IBUS_Greek_RHO
+IBUS_Greek_SIGMA
+IBUS_Greek_TAU
+IBUS_Greek_UPSILON
+IBUS_Greek_PHI
+IBUS_Greek_CHI
+IBUS_Greek_PSI
+IBUS_Greek_OMEGA
+IBUS_Greek_alpha
+IBUS_Greek_beta
+IBUS_Greek_gamma
+IBUS_Greek_delta
+IBUS_Greek_epsilon
+IBUS_Greek_zeta
+IBUS_Greek_eta
+IBUS_Greek_theta
+IBUS_Greek_iota
+IBUS_Greek_kappa
+IBUS_Greek_lamda
+IBUS_Greek_lambda
+IBUS_Greek_mu
+IBUS_Greek_nu
+IBUS_Greek_xi
+IBUS_Greek_omicron
+IBUS_Greek_pi
+IBUS_Greek_rho
+IBUS_Greek_sigma
+IBUS_Greek_finalsmallsigma
+IBUS_Greek_tau
+IBUS_Greek_upsilon
+IBUS_Greek_phi
+IBUS_Greek_chi
+IBUS_Greek_psi
+IBUS_Greek_omega
+IBUS_Greek_switch
+IBUS_leftradical
+IBUS_topleftradical
+IBUS_horizconnector
+IBUS_topintegral
+IBUS_botintegral
+IBUS_vertconnector
+IBUS_topleftsqbracket
+IBUS_botleftsqbracket
+IBUS_toprightsqbracket
+IBUS_botrightsqbracket
+IBUS_topleftparens
+IBUS_botleftparens
+IBUS_toprightparens
+IBUS_botrightparens
+IBUS_leftmiddlecurlybrace
+IBUS_rightmiddlecurlybrace
+IBUS_topleftsummation
+IBUS_botleftsummation
+IBUS_topvertsummationconnector
+IBUS_botvertsummationconnector
+IBUS_toprightsummation
+IBUS_botrightsummation
+IBUS_rightmiddlesummation
+IBUS_lessthanequal
+IBUS_notequal
+IBUS_greaterthanequal
+IBUS_integral
+IBUS_therefore
+IBUS_variation
+IBUS_infinity
+IBUS_nabla
+IBUS_approximate
+IBUS_similarequal
+IBUS_ifonlyif
+IBUS_implies
+IBUS_identical
+IBUS_radical
+IBUS_includedin
+IBUS_includes
+IBUS_intersection
+IBUS_union
+IBUS_logicaland
+IBUS_logicalor
+IBUS_partialderivative
+IBUS_function
+IBUS_leftarrow
+IBUS_uparrow
+IBUS_rightarrow
+IBUS_downarrow
+IBUS_blank
+IBUS_soliddiamond
+IBUS_checkerboard
+IBUS_ht
+IBUS_ff
+IBUS_cr
+IBUS_lf
+IBUS_nl
+IBUS_vt
+IBUS_lowrightcorner
+IBUS_uprightcorner
+IBUS_upleftcorner
+IBUS_lowleftcorner
+IBUS_crossinglines
+IBUS_horizlinescan1
+IBUS_horizlinescan3
+IBUS_horizlinescan5
+IBUS_horizlinescan7
+IBUS_horizlinescan9
+IBUS_leftt
+IBUS_rightt
+IBUS_bott
+IBUS_topt
+IBUS_vertbar
+IBUS_emspace
+IBUS_enspace
+IBUS_em3space
+IBUS_em4space
+IBUS_digitspace
+IBUS_punctspace
+IBUS_thinspace
+IBUS_hairspace
+IBUS_emdash
+IBUS_endash
+IBUS_signifblank
+IBUS_ellipsis
+IBUS_doubbaselinedot
+IBUS_onethird
+IBUS_twothirds
+IBUS_onefifth
+IBUS_twofifths
+IBUS_threefifths
+IBUS_fourfifths
+IBUS_onesixth
+IBUS_fivesixths
+IBUS_careof
+IBUS_figdash
+IBUS_leftanglebracket
+IBUS_decimalpoint
+IBUS_rightanglebracket
+IBUS_marker
+IBUS_oneeighth
+IBUS_threeeighths
+IBUS_fiveeighths
+IBUS_seveneighths
+IBUS_trademark
+IBUS_signaturemark
+IBUS_trademarkincircle
+IBUS_leftopentriangle
+IBUS_rightopentriangle
+IBUS_emopencircle
+IBUS_emopenrectangle
+IBUS_leftsinglequotemark
+IBUS_rightsinglequotemark
+IBUS_leftdoublequotemark
+IBUS_rightdoublequotemark
+IBUS_prescription
+IBUS_minutes
+IBUS_seconds
+IBUS_latincross
+IBUS_hexagram
+IBUS_filledrectbullet
+IBUS_filledlefttribullet
+IBUS_filledrighttribullet
+IBUS_emfilledcircle
+IBUS_emfilledrect
+IBUS_enopencircbullet
+IBUS_enopensquarebullet
+IBUS_openrectbullet
+IBUS_opentribulletup
+IBUS_opentribulletdown
+IBUS_openstar
+IBUS_enfilledcircbullet
+IBUS_enfilledsqbullet
+IBUS_filledtribulletup
+IBUS_filledtribulletdown
+IBUS_leftpointer
+IBUS_rightpointer
+IBUS_club
+IBUS_diamond
+IBUS_heart
+IBUS_maltesecross
+IBUS_dagger
+IBUS_doubledagger
+IBUS_checkmark
+IBUS_ballotcross
+IBUS_musicalsharp
+IBUS_musicalflat
+IBUS_malesymbol
+IBUS_femalesymbol
+IBUS_telephone
+IBUS_telephonerecorder
+IBUS_phonographcopyright
+IBUS_caret
+IBUS_singlelowquotemark
+IBUS_doublelowquotemark
+IBUS_cursor
+IBUS_leftcaret
+IBUS_rightcaret
+IBUS_downcaret
+IBUS_upcaret
+IBUS_overbar
+IBUS_downtack
+IBUS_upshoe
+IBUS_downstile
+IBUS_underbar
+IBUS_jot
+IBUS_quad
+IBUS_uptack
+IBUS_circle
+IBUS_upstile
+IBUS_downshoe
+IBUS_rightshoe
+IBUS_leftshoe
+IBUS_lefttack
+IBUS_righttack
+IBUS_hebrew_doublelowline
+IBUS_hebrew_aleph
+IBUS_hebrew_bet
+IBUS_hebrew_beth
+IBUS_hebrew_gimel
+IBUS_hebrew_gimmel
+IBUS_hebrew_dalet
+IBUS_hebrew_daleth
+IBUS_hebrew_he
+IBUS_hebrew_waw
+IBUS_hebrew_zain
+IBUS_hebrew_zayin
+IBUS_hebrew_chet
+IBUS_hebrew_het
+IBUS_hebrew_tet
+IBUS_hebrew_teth
+IBUS_hebrew_yod
+IBUS_hebrew_finalkaph
+IBUS_hebrew_kaph
+IBUS_hebrew_lamed
+IBUS_hebrew_finalmem
+IBUS_hebrew_mem
+IBUS_hebrew_finalnun
+IBUS_hebrew_nun
+IBUS_hebrew_samech
+IBUS_hebrew_samekh
+IBUS_hebrew_ayin
+IBUS_hebrew_finalpe
+IBUS_hebrew_pe
+IBUS_hebrew_finalzade
+IBUS_hebrew_finalzadi
+IBUS_hebrew_zade
+IBUS_hebrew_zadi
+IBUS_hebrew_qoph
+IBUS_hebrew_kuf
+IBUS_hebrew_resh
+IBUS_hebrew_shin
+IBUS_hebrew_taw
+IBUS_hebrew_taf
+IBUS_Hebrew_switch
+IBUS_Thai_kokai
+IBUS_Thai_khokhai
+IBUS_Thai_khokhuat
+IBUS_Thai_khokhwai
+IBUS_Thai_khokhon
+IBUS_Thai_khorakhang
+IBUS_Thai_ngongu
+IBUS_Thai_chochan
+IBUS_Thai_choching
+IBUS_Thai_chochang
+IBUS_Thai_soso
+IBUS_Thai_chochoe
+IBUS_Thai_yoying
+IBUS_Thai_dochada
+IBUS_Thai_topatak
+IBUS_Thai_thothan
+IBUS_Thai_thonangmontho
+IBUS_Thai_thophuthao
+IBUS_Thai_nonen
+IBUS_Thai_dodek
+IBUS_Thai_totao
+IBUS_Thai_thothung
+IBUS_Thai_thothahan
+IBUS_Thai_thothong
+IBUS_Thai_nonu
+IBUS_Thai_bobaimai
+IBUS_Thai_popla
+IBUS_Thai_phophung
+IBUS_Thai_fofa
+IBUS_Thai_phophan
+IBUS_Thai_fofan
+IBUS_Thai_phosamphao
+IBUS_Thai_moma
+IBUS_Thai_yoyak
+IBUS_Thai_rorua
+IBUS_Thai_ru
+IBUS_Thai_loling
+IBUS_Thai_lu
+IBUS_Thai_wowaen
+IBUS_Thai_sosala
+IBUS_Thai_sorusi
+IBUS_Thai_sosua
+IBUS_Thai_hohip
+IBUS_Thai_lochula
+IBUS_Thai_oang
+IBUS_Thai_honokhuk
+IBUS_Thai_paiyannoi
+IBUS_Thai_saraa
+IBUS_Thai_maihanakat
+IBUS_Thai_saraaa
+IBUS_Thai_saraam
+IBUS_Thai_sarai
+IBUS_Thai_saraii
+IBUS_Thai_saraue
+IBUS_Thai_sarauee
+IBUS_Thai_sarau
+IBUS_Thai_sarauu
+IBUS_Thai_phinthu
+IBUS_Thai_maihanakat_maitho
+IBUS_Thai_baht
+IBUS_Thai_sarae
+IBUS_Thai_saraae
+IBUS_Thai_sarao
+IBUS_Thai_saraaimaimuan
+IBUS_Thai_saraaimaimalai
+IBUS_Thai_lakkhangyao
+IBUS_Thai_maiyamok
+IBUS_Thai_maitaikhu
+IBUS_Thai_maiek
+IBUS_Thai_maitho
+IBUS_Thai_maitri
+IBUS_Thai_maichattawa
+IBUS_Thai_thanthakhat
+IBUS_Thai_nikhahit
+IBUS_Thai_leksun
+IBUS_Thai_leknung
+IBUS_Thai_leksong
+IBUS_Thai_leksam
+IBUS_Thai_leksi
+IBUS_Thai_lekha
+IBUS_Thai_lekhok
+IBUS_Thai_lekchet
+IBUS_Thai_lekpaet
+IBUS_Thai_lekkao
+IBUS_Hangul
+IBUS_Hangul_Start
+IBUS_Hangul_End
+IBUS_Hangul_Hanja
+IBUS_Hangul_Jamo
+IBUS_Hangul_Romaja
+IBUS_Hangul_Codeinput
+IBUS_Hangul_Jeonja
+IBUS_Hangul_Banja
+IBUS_Hangul_PreHanja
+IBUS_Hangul_PostHanja
+IBUS_Hangul_SingleCandidate
+IBUS_Hangul_MultipleCandidate
+IBUS_Hangul_PreviousCandidate
+IBUS_Hangul_Special
+IBUS_Hangul_switch
+IBUS_Hangul_Kiyeog
+IBUS_Hangul_SsangKiyeog
+IBUS_Hangul_KiyeogSios
+IBUS_Hangul_Nieun
+IBUS_Hangul_NieunJieuj
+IBUS_Hangul_NieunHieuh
+IBUS_Hangul_Dikeud
+IBUS_Hangul_SsangDikeud
+IBUS_Hangul_Rieul
+IBUS_Hangul_RieulKiyeog
+IBUS_Hangul_RieulMieum
+IBUS_Hangul_RieulPieub
+IBUS_Hangul_RieulSios
+IBUS_Hangul_RieulTieut
+IBUS_Hangul_RieulPhieuf
+IBUS_Hangul_RieulHieuh
+IBUS_Hangul_Mieum
+IBUS_Hangul_Pieub
+IBUS_Hangul_SsangPieub
+IBUS_Hangul_PieubSios
+IBUS_Hangul_Sios
+IBUS_Hangul_SsangSios
+IBUS_Hangul_Ieung
+IBUS_Hangul_Jieuj
+IBUS_Hangul_SsangJieuj
+IBUS_Hangul_Cieuc
+IBUS_Hangul_Khieuq
+IBUS_Hangul_Tieut
+IBUS_Hangul_Phieuf
+IBUS_Hangul_Hieuh
+IBUS_Hangul_A
+IBUS_Hangul_AE
+IBUS_Hangul_YA
+IBUS_Hangul_YAE
+IBUS_Hangul_EO
+IBUS_Hangul_E
+IBUS_Hangul_YEO
+IBUS_Hangul_YE
+IBUS_Hangul_O
+IBUS_Hangul_WA
+IBUS_Hangul_WAE
+IBUS_Hangul_OE
+IBUS_Hangul_YO
+IBUS_Hangul_U
+IBUS_Hangul_WEO
+IBUS_Hangul_WE
+IBUS_Hangul_WI
+IBUS_Hangul_YU
+IBUS_Hangul_EU
+IBUS_Hangul_YI
+IBUS_Hangul_I
+IBUS_Hangul_J_Kiyeog
+IBUS_Hangul_J_SsangKiyeog
+IBUS_Hangul_J_KiyeogSios
+IBUS_Hangul_J_Nieun
+IBUS_Hangul_J_NieunJieuj
+IBUS_Hangul_J_NieunHieuh
+IBUS_Hangul_J_Dikeud
+IBUS_Hangul_J_Rieul
+IBUS_Hangul_J_RieulKiyeog
+IBUS_Hangul_J_RieulMieum
+IBUS_Hangul_J_RieulPieub
+IBUS_Hangul_J_RieulSios
+IBUS_Hangul_J_RieulTieut
+IBUS_Hangul_J_RieulPhieuf
+IBUS_Hangul_J_RieulHieuh
+IBUS_Hangul_J_Mieum
+IBUS_Hangul_J_Pieub
+IBUS_Hangul_J_PieubSios
+IBUS_Hangul_J_Sios
+IBUS_Hangul_J_SsangSios
+IBUS_Hangul_J_Ieung
+IBUS_Hangul_J_Jieuj
+IBUS_Hangul_J_Cieuc
+IBUS_Hangul_J_Khieuq
+IBUS_Hangul_J_Tieut
+IBUS_Hangul_J_Phieuf
+IBUS_Hangul_J_Hieuh
+IBUS_Hangul_RieulYeorinHieuh
+IBUS_Hangul_SunkyeongeumMieum
+IBUS_Hangul_SunkyeongeumPieub
+IBUS_Hangul_PanSios
+IBUS_Hangul_KkogjiDalrinIeung
+IBUS_Hangul_SunkyeongeumPhieuf
+IBUS_Hangul_YeorinHieuh
+IBUS_Hangul_AraeA
+IBUS_Hangul_AraeAE
+IBUS_Hangul_J_PanSios
+IBUS_Hangul_J_KkogjiDalrinIeung
+IBUS_Hangul_J_YeorinHieuh
+IBUS_Korean_Won
+IBUS_Armenian_ligature_ew
+IBUS_Armenian_full_stop
+IBUS_Armenian_verjaket
+IBUS_Armenian_separation_mark
+IBUS_Armenian_but
+IBUS_Armenian_hyphen
+IBUS_Armenian_yentamna
+IBUS_Armenian_exclam
+IBUS_Armenian_amanak
+IBUS_Armenian_accent
+IBUS_Armenian_shesht
+IBUS_Armenian_question
+IBUS_Armenian_paruyk
+IBUS_Armenian_AYB
+IBUS_Armenian_ayb
+IBUS_Armenian_BEN
+IBUS_Armenian_ben
+IBUS_Armenian_GIM
+IBUS_Armenian_gim
+IBUS_Armenian_DA
+IBUS_Armenian_da
+IBUS_Armenian_YECH
+IBUS_Armenian_yech
+IBUS_Armenian_ZA
+IBUS_Armenian_za
+IBUS_Armenian_E
+IBUS_Armenian_e
+IBUS_Armenian_AT
+IBUS_Armenian_at
+IBUS_Armenian_TO
+IBUS_Armenian_to
+IBUS_Armenian_ZHE
+IBUS_Armenian_zhe
+IBUS_Armenian_INI
+IBUS_Armenian_ini
+IBUS_Armenian_LYUN
+IBUS_Armenian_lyun
+IBUS_Armenian_KHE
+IBUS_Armenian_khe
+IBUS_Armenian_TSA
+IBUS_Armenian_tsa
+IBUS_Armenian_KEN
+IBUS_Armenian_ken
+IBUS_Armenian_HO
+IBUS_Armenian_ho
+IBUS_Armenian_DZA
+IBUS_Armenian_dza
+IBUS_Armenian_GHAT
+IBUS_Armenian_ghat
+IBUS_Armenian_TCHE
+IBUS_Armenian_tche
+IBUS_Armenian_MEN
+IBUS_Armenian_men
+IBUS_Armenian_HI
+IBUS_Armenian_hi
+IBUS_Armenian_NU
+IBUS_Armenian_nu
+IBUS_Armenian_SHA
+IBUS_Armenian_sha
+IBUS_Armenian_VO
+IBUS_Armenian_vo
+IBUS_Armenian_CHA
+IBUS_Armenian_cha
+IBUS_Armenian_PE
+IBUS_Armenian_pe
+IBUS_Armenian_JE
+IBUS_Armenian_je
+IBUS_Armenian_RA
+IBUS_Armenian_ra
+IBUS_Armenian_SE
+IBUS_Armenian_se
+IBUS_Armenian_VEV
+IBUS_Armenian_vev
+IBUS_Armenian_TYUN
+IBUS_Armenian_tyun
+IBUS_Armenian_RE
+IBUS_Armenian_re
+IBUS_Armenian_TSO
+IBUS_Armenian_tso
+IBUS_Armenian_VYUN
+IBUS_Armenian_vyun
+IBUS_Armenian_PYUR
+IBUS_Armenian_pyur
+IBUS_Armenian_KE
+IBUS_Armenian_ke
+IBUS_Armenian_O
+IBUS_Armenian_o
+IBUS_Armenian_FE
+IBUS_Armenian_fe
+IBUS_Armenian_apostrophe
+IBUS_Georgian_an
+IBUS_Georgian_ban
+IBUS_Georgian_gan
+IBUS_Georgian_don
+IBUS_Georgian_en
+IBUS_Georgian_vin
+IBUS_Georgian_zen
+IBUS_Georgian_tan
+IBUS_Georgian_in
+IBUS_Georgian_kan
+IBUS_Georgian_las
+IBUS_Georgian_man
+IBUS_Georgian_nar
+IBUS_Georgian_on
+IBUS_Georgian_par
+IBUS_Georgian_zhar
+IBUS_Georgian_rae
+IBUS_Georgian_san
+IBUS_Georgian_tar
+IBUS_Georgian_un
+IBUS_Georgian_phar
+IBUS_Georgian_khar
+IBUS_Georgian_ghan
+IBUS_Georgian_qar
+IBUS_Georgian_shin
+IBUS_Georgian_chin
+IBUS_Georgian_can
+IBUS_Georgian_jil
+IBUS_Georgian_cil
+IBUS_Georgian_char
+IBUS_Georgian_xan
+IBUS_Georgian_jhan
+IBUS_Georgian_hae
+IBUS_Georgian_he
+IBUS_Georgian_hie
+IBUS_Georgian_we
+IBUS_Georgian_har
+IBUS_Georgian_hoe
+IBUS_Georgian_fi
+IBUS_Xabovedot
+IBUS_Ibreve
+IBUS_Zstroke
+IBUS_Gcaron
+IBUS_Ocaron
+IBUS_Obarred
+IBUS_xabovedot
+IBUS_ibreve
+IBUS_zstroke
+IBUS_gcaron
+IBUS_ocaron
+IBUS_obarred
+IBUS_SCHWA
+IBUS_schwa
+IBUS_Lbelowdot
+IBUS_lbelowdot
+IBUS_Abelowdot
+IBUS_abelowdot
+IBUS_Ahook
+IBUS_ahook
+IBUS_Acircumflexacute
+IBUS_acircumflexacute
+IBUS_Acircumflexgrave
+IBUS_acircumflexgrave
+IBUS_Acircumflexhook
+IBUS_acircumflexhook
+IBUS_Acircumflextilde
+IBUS_acircumflextilde
+IBUS_Acircumflexbelowdot
+IBUS_acircumflexbelowdot
+IBUS_Abreveacute
+IBUS_abreveacute
+IBUS_Abrevegrave
+IBUS_abrevegrave
+IBUS_Abrevehook
+IBUS_abrevehook
+IBUS_Abrevetilde
+IBUS_abrevetilde
+IBUS_Abrevebelowdot
+IBUS_abrevebelowdot
+IBUS_Ebelowdot
+IBUS_ebelowdot
+IBUS_Ehook
+IBUS_ehook
+IBUS_Etilde
+IBUS_etilde
+IBUS_Ecircumflexacute
+IBUS_ecircumflexacute
+IBUS_Ecircumflexgrave
+IBUS_ecircumflexgrave
+IBUS_Ecircumflexhook
+IBUS_ecircumflexhook
+IBUS_Ecircumflextilde
+IBUS_ecircumflextilde
+IBUS_Ecircumflexbelowdot
+IBUS_ecircumflexbelowdot
+IBUS_Ihook
+IBUS_ihook
+IBUS_Ibelowdot
+IBUS_ibelowdot
+IBUS_Obelowdot
+IBUS_obelowdot
+IBUS_Ohook
+IBUS_ohook
+IBUS_Ocircumflexacute
+IBUS_ocircumflexacute
+IBUS_Ocircumflexgrave
+IBUS_ocircumflexgrave
+IBUS_Ocircumflexhook
+IBUS_ocircumflexhook
+IBUS_Ocircumflextilde
+IBUS_ocircumflextilde
+IBUS_Ocircumflexbelowdot
+IBUS_ocircumflexbelowdot
+IBUS_Ohornacute
+IBUS_ohornacute
+IBUS_Ohorngrave
+IBUS_ohorngrave
+IBUS_Ohornhook
+IBUS_ohornhook
+IBUS_Ohorntilde
+IBUS_ohorntilde
+IBUS_Ohornbelowdot
+IBUS_ohornbelowdot
+IBUS_Ubelowdot
+IBUS_ubelowdot
+IBUS_Uhook
+IBUS_uhook
+IBUS_Uhornacute
+IBUS_uhornacute
+IBUS_Uhorngrave
+IBUS_uhorngrave
+IBUS_Uhornhook
+IBUS_uhornhook
+IBUS_Uhorntilde
+IBUS_uhorntilde
+IBUS_Uhornbelowdot
+IBUS_uhornbelowdot
+IBUS_Ybelowdot
+IBUS_ybelowdot
+IBUS_Yhook
+IBUS_yhook
+IBUS_Ytilde
+IBUS_ytilde
+IBUS_Ohorn
+IBUS_ohorn
+IBUS_Uhorn
+IBUS_uhorn
+IBUS_EcuSign
+IBUS_ColonSign
+IBUS_CruzeiroSign
+IBUS_FFrancSign
+IBUS_LiraSign
+IBUS_MillSign
+IBUS_NairaSign
+IBUS_PesetaSign
+IBUS_RupeeSign
+IBUS_WonSign
+IBUS_NewSheqelSign
+IBUS_DongSign
+IBUS_EuroSign
+IBUS_zerosuperior
+IBUS_foursuperior
+IBUS_fivesuperior
+IBUS_sixsuperior
+IBUS_sevensuperior
+IBUS_eightsuperior
+IBUS_ninesuperior
+IBUS_zerosubscript
+IBUS_onesubscript
+IBUS_twosubscript
+IBUS_threesubscript
+IBUS_foursubscript
+IBUS_fivesubscript
+IBUS_sixsubscript
+IBUS_sevensubscript
+IBUS_eightsubscript
+IBUS_ninesubscript
+IBUS_partdifferential
+IBUS_emptyset
+IBUS_elementof
+IBUS_notelementof
+IBUS_containsas
+IBUS_squareroot
+IBUS_cuberoot
+IBUS_fourthroot
+IBUS_dintegral
+IBUS_tintegral
+IBUS_because
+IBUS_approxeq
+IBUS_notapproxeq
+IBUS_notidentical
+IBUS_stricteq
+IBUS_braille_dot_1
+IBUS_braille_dot_2
+IBUS_braille_dot_3
+IBUS_braille_dot_4
+IBUS_braille_dot_5
+IBUS_braille_dot_6
+IBUS_braille_dot_7
+IBUS_braille_dot_8
+IBUS_braille_dot_9
+IBUS_braille_dot_10
+IBUS_braille_blank
+IBUS_braille_dots_1
+IBUS_braille_dots_2
+IBUS_braille_dots_12
+IBUS_braille_dots_3
+IBUS_braille_dots_13
+IBUS_braille_dots_23
+IBUS_braille_dots_123
+IBUS_braille_dots_4
+IBUS_braille_dots_14
+IBUS_braille_dots_24
+IBUS_braille_dots_124
+IBUS_braille_dots_34
+IBUS_braille_dots_134
+IBUS_braille_dots_234
+IBUS_braille_dots_1234
+IBUS_braille_dots_5
+IBUS_braille_dots_15
+IBUS_braille_dots_25
+IBUS_braille_dots_125
+IBUS_braille_dots_35
+IBUS_braille_dots_135
+IBUS_braille_dots_235
+IBUS_braille_dots_1235
+IBUS_braille_dots_45
+IBUS_braille_dots_145
+IBUS_braille_dots_245
+IBUS_braille_dots_1245
+IBUS_braille_dots_345
+IBUS_braille_dots_1345
+IBUS_braille_dots_2345
+IBUS_braille_dots_12345
+IBUS_braille_dots_6
+IBUS_braille_dots_16
+IBUS_braille_dots_26
+IBUS_braille_dots_126
+IBUS_braille_dots_36
+IBUS_braille_dots_136
+IBUS_braille_dots_236
+IBUS_braille_dots_1236
+IBUS_braille_dots_46
+IBUS_braille_dots_146
+IBUS_braille_dots_246
+IBUS_braille_dots_1246
+IBUS_braille_dots_346
+IBUS_braille_dots_1346
+IBUS_braille_dots_2346
+IBUS_braille_dots_12346
+IBUS_braille_dots_56
+IBUS_braille_dots_156
+IBUS_braille_dots_256
+IBUS_braille_dots_1256
+IBUS_braille_dots_356
+IBUS_braille_dots_1356
+IBUS_braille_dots_2356
+IBUS_braille_dots_12356
+IBUS_braille_dots_456
+IBUS_braille_dots_1456
+IBUS_braille_dots_2456
+IBUS_braille_dots_12456
+IBUS_braille_dots_3456
+IBUS_braille_dots_13456
+IBUS_braille_dots_23456
+IBUS_braille_dots_123456
+IBUS_braille_dots_7
+IBUS_braille_dots_17
+IBUS_braille_dots_27
+IBUS_braille_dots_127
+IBUS_braille_dots_37
+IBUS_braille_dots_137
+IBUS_braille_dots_237
+IBUS_braille_dots_1237
+IBUS_braille_dots_47
+IBUS_braille_dots_147
+IBUS_braille_dots_247
+IBUS_braille_dots_1247
+IBUS_braille_dots_347
+IBUS_braille_dots_1347
+IBUS_braille_dots_2347
+IBUS_braille_dots_12347
+IBUS_braille_dots_57
+IBUS_braille_dots_157
+IBUS_braille_dots_257
+IBUS_braille_dots_1257
+IBUS_braille_dots_357
+IBUS_braille_dots_1357
+IBUS_braille_dots_2357
+IBUS_braille_dots_12357
+IBUS_braille_dots_457
+IBUS_braille_dots_1457
+IBUS_braille_dots_2457
+IBUS_braille_dots_12457
+IBUS_braille_dots_3457
+IBUS_braille_dots_13457
+IBUS_braille_dots_23457
+IBUS_braille_dots_123457
+IBUS_braille_dots_67
+IBUS_braille_dots_167
+IBUS_braille_dots_267
+IBUS_braille_dots_1267
+IBUS_braille_dots_367
+IBUS_braille_dots_1367
+IBUS_braille_dots_2367
+IBUS_braille_dots_12367
+IBUS_braille_dots_467
+IBUS_braille_dots_1467
+IBUS_braille_dots_2467
+IBUS_braille_dots_12467
+IBUS_braille_dots_3467
+IBUS_braille_dots_13467
+IBUS_braille_dots_23467
+IBUS_braille_dots_123467
+IBUS_braille_dots_567
+IBUS_braille_dots_1567
+IBUS_braille_dots_2567
+IBUS_braille_dots_12567
+IBUS_braille_dots_3567
+IBUS_braille_dots_13567
+IBUS_braille_dots_23567
+IBUS_braille_dots_123567
+IBUS_braille_dots_4567
+IBUS_braille_dots_14567
+IBUS_braille_dots_24567
+IBUS_braille_dots_124567
+IBUS_braille_dots_34567
+IBUS_braille_dots_134567
+IBUS_braille_dots_234567
+IBUS_braille_dots_1234567
+IBUS_braille_dots_8
+IBUS_braille_dots_18
+IBUS_braille_dots_28
+IBUS_braille_dots_128
+IBUS_braille_dots_38
+IBUS_braille_dots_138
+IBUS_braille_dots_238
+IBUS_braille_dots_1238
+IBUS_braille_dots_48
+IBUS_braille_dots_148
+IBUS_braille_dots_248
+IBUS_braille_dots_1248
+IBUS_braille_dots_348
+IBUS_braille_dots_1348
+IBUS_braille_dots_2348
+IBUS_braille_dots_12348
+IBUS_braille_dots_58
+IBUS_braille_dots_158
+IBUS_braille_dots_258
+IBUS_braille_dots_1258
+IBUS_braille_dots_358
+IBUS_braille_dots_1358
+IBUS_braille_dots_2358
+IBUS_braille_dots_12358
+IBUS_braille_dots_458
+IBUS_braille_dots_1458
+IBUS_braille_dots_2458
+IBUS_braille_dots_12458
+IBUS_braille_dots_3458
+IBUS_braille_dots_13458
+IBUS_braille_dots_23458
+IBUS_braille_dots_123458
+IBUS_braille_dots_68
+IBUS_braille_dots_168
+IBUS_braille_dots_268
+IBUS_braille_dots_1268
+IBUS_braille_dots_368
+IBUS_braille_dots_1368
+IBUS_braille_dots_2368
+IBUS_braille_dots_12368
+IBUS_braille_dots_468
+IBUS_braille_dots_1468
+IBUS_braille_dots_2468
+IBUS_braille_dots_12468
+IBUS_braille_dots_3468
+IBUS_braille_dots_13468
+IBUS_braille_dots_23468
+IBUS_braille_dots_123468
+IBUS_braille_dots_568
+IBUS_braille_dots_1568
+IBUS_braille_dots_2568
+IBUS_braille_dots_12568
+IBUS_braille_dots_3568
+IBUS_braille_dots_13568
+IBUS_braille_dots_23568
+IBUS_braille_dots_123568
+IBUS_braille_dots_4568
+IBUS_braille_dots_14568
+IBUS_braille_dots_24568
+IBUS_braille_dots_124568
+IBUS_braille_dots_34568
+IBUS_braille_dots_134568
+IBUS_braille_dots_234568
+IBUS_braille_dots_1234568
+IBUS_braille_dots_78
+IBUS_braille_dots_178
+IBUS_braille_dots_278
+IBUS_braille_dots_1278
+IBUS_braille_dots_378
+IBUS_braille_dots_1378
+IBUS_braille_dots_2378
+IBUS_braille_dots_12378
+IBUS_braille_dots_478
+IBUS_braille_dots_1478
+IBUS_braille_dots_2478
+IBUS_braille_dots_12478
+IBUS_braille_dots_3478
+IBUS_braille_dots_13478
+IBUS_braille_dots_23478
+IBUS_braille_dots_123478
+IBUS_braille_dots_578
+IBUS_braille_dots_1578
+IBUS_braille_dots_2578
+IBUS_braille_dots_12578
+IBUS_braille_dots_3578
+IBUS_braille_dots_13578
+IBUS_braille_dots_23578
+IBUS_braille_dots_123578
+IBUS_braille_dots_4578
+IBUS_braille_dots_14578
+IBUS_braille_dots_24578
+IBUS_braille_dots_124578
+IBUS_braille_dots_34578
+IBUS_braille_dots_134578
+IBUS_braille_dots_234578
+IBUS_braille_dots_1234578
+IBUS_braille_dots_678
+IBUS_braille_dots_1678
+IBUS_braille_dots_2678
+IBUS_braille_dots_12678
+IBUS_braille_dots_3678
+IBUS_braille_dots_13678
+IBUS_braille_dots_23678
+IBUS_braille_dots_123678
+IBUS_braille_dots_4678
+IBUS_braille_dots_14678
+IBUS_braille_dots_24678
+IBUS_braille_dots_124678
+IBUS_braille_dots_34678
+IBUS_braille_dots_134678
+IBUS_braille_dots_234678
+IBUS_braille_dots_1234678
+IBUS_braille_dots_5678
+IBUS_braille_dots_15678
+IBUS_braille_dots_25678
+IBUS_braille_dots_125678
+IBUS_braille_dots_35678
+IBUS_braille_dots_135678
+IBUS_braille_dots_235678
+IBUS_braille_dots_1235678
+IBUS_braille_dots_45678
+IBUS_braille_dots_145678
+IBUS_braille_dots_245678
+IBUS_braille_dots_1245678
+IBUS_braille_dots_345678
+IBUS_braille_dots_1345678
+IBUS_braille_dots_2345678
+IBUS_braille_dots_12345678
+</SECTION>
+
+<SECTION>
+<FILE>ibusdebug</FILE>
+ibus_warning
+</SECTION>
+
+<SECTION>
+<FILE>ibusinternal</FILE>
+I_
+dbus_server_setup
+dbus_connection_setup
+</SECTION>
+
diff --git a/ibus.spec.in b/ibus.spec.in
index 908ddbd..641ec86 100644
--- a/ibus.spec.in
+++ b/ibus.spec.in
@@ -1,6 +1,8 @@
 %{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
 %{!?gtk_binary_version: %define gtk_binary_version %(pkg-config  --variable=gtk_binary_version gtk+-2.0)}
 %define mod_path ibus-@PACKAGE_VERSION_MAJOR@.@PACKAGE_VERSION_MINOR@
+%define host_vendor %(if [[ "%{_host_vendor}" == "unknown" ]]; then echo redhat; else echo %{_host_vendor}; fi)
+%define host %{_host_cpu}-%{host_vendor}-%{_host_os}
 Name:       ibus
 Version:    @PACKAGE_VERSION@
 Release:    1%{?dist}
@@ -108,13 +110,32 @@ desktop-file-install --delete-original          \
 %clean
 rm -rf $RPM_BUILD_ROOT
 
+%pre
+if [ "$1" -gt 1 ] ; then
+export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
+gconftool-2 --makefile-uninstall-rule \
+%{_sysconfdir}/gconf/schemas/%{name}.schemas >/dev/null || :
+fi
+
+%post
+export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
+gconftool-2 --makefile-install-rule \
+%{_sysconfdir}/gconf/schemas/%{name}.schemas > /dev/null || :
+
+%preun
+if [ "$1" -eq 0 ] ; then
+export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
+gconftool-2 --makefile-uninstall-rule \
+%{_sysconfdir}/gconf/schemas/%{name}.schemas > /dev/null || :
+fi
+
 %post libs
 /sbin/ldconfig
 update-desktop-database -q
 %{_sbindir}/alternatives --install %{_sysconfdir}/X11/xinit/xinputrc xinputrc %{_xinputconf} 83 || :
 
 %post gtk
-%{_bindir}/update-gtk-immodules %{_host} || :
+%{_bindir}/update-gtk-immodules %{host} || :
 
 %postun libs
 /sbin/ldconfig
@@ -126,7 +147,7 @@ if [ "$1" = "0" ]; then
 fi
 
 %postun gtk
-%{_bindir}/update-gtk-immodules %{_host} || :
+%{_bindir}/update-gtk-immodules %{host} || :
 
 %files -f %{name}.lang
 %defattr(-,root,root,-)
@@ -140,8 +161,9 @@ fi
 %{_libexecdir}/ibus-gconf
 %{_libexecdir}/ibus-ui-gtk
 %{_libexecdir}/ibus-x11
-%config %{_xinputconf}
-
+%config(noreplace) %{_xinputconf}
+%config(noreplace) %{_sysconfdir}/gconf/schemas/%{name}.schemas
+%config(noreplace) %{_sysconfdir}/xdg/autostart/ibus.desktop
 
 %files libs
 %defattr(-,root,root,-)
@@ -163,5 +185,9 @@ fi
 %{_libdir}/pkgconfig/*
 
 %changelog
-* Thu Aug 07 2008 Huang Peng <shawn.p.huang@gmail.com> - @VERSION@-1
+* @DATE_DISPLAY@ Huang Peng <shawn.p.huang@gmail.com> - @VERSION@-1
+- Current version.
+
+* Thu Aug 07 2008 Huang Peng <shawn.p.huang@gmail.com> - 0.1.0.20080810-1
 - The first version.
+
diff --git a/po/fr.po b/po/fr.po
index 4b1850c..3f5e188 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ibus VERSION\n"
 "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n"
-"POT-Creation-Date: 2009-03-11 14:31+0800\n"
-"PO-Revision-Date: 2009-02-06 01:55+0100\n"
+"POT-Creation-Date: 2009-03-20 09:52+0800\n"
+"PO-Revision-Date: 2009-03-11 17:30+0100\n"
 "Last-Translator: Julroy67 <julroy67@gmail.com>\n"
 "Language-Team: French <julroy67@gmail.com>\n"
 "MIME-Version: 1.0\n"
@@ -25,15 +25,15 @@ msgstr "Autre"
 
 #: ui/gtk/panel.py:97
 msgid "IBus input method framework"
-msgstr ""
+msgstr "Framework de méthode d'entrée IBus"
 
 #: ui/gtk/panel.py:282
 msgid "Restart"
-msgstr ""
+msgstr "Redémarrer"
 
 #: ui/gtk/panel.py:337
 msgid "No input method"
-msgstr ""
+msgstr "Aucune méthode d'entrée"
 
 #: ui/gtk/panel.py:383
 msgid "IBus is an intelligent input bus for Linux/Unix."
@@ -92,7 +92,6 @@ msgid "Key code:"
 msgstr "Code touche :"
 
 #: setup/keyboardshortcut.py:76
-#, fuzzy
 msgid "Modifiers:"
 msgstr "Modificateurs :"
 
@@ -110,35 +109,33 @@ msgstr "Veuillez presser une touche (ou une combinaison de touches)"
 
 #: setup/enginecombobox.py:99
 msgid "Select an input method"
-msgstr ""
+msgstr "Sélectionnez une méthode d'entrée"
 
 #: setup/setup.glade:7
 msgid "IBus Preferences"
-msgstr ""
-
-#: setup/setup.glade:51
-msgid "Enable or disable:"
-msgstr ""
+msgstr "Préférences d'IBus"
 
-#: setup/setup.glade:62
-#, fuzzy
-msgid "Next input method:"
-msgstr "Moteur suivant :"
+#: setup/setup.glade:64 setup/setup.glade:96 setup/setup.glade:128
+msgid "..."
+msgstr "…"
 
-#: setup/setup.glade:76
+#: setup/setup.glade:148
 msgid "previous input method:"
-msgstr ""
+msgstr "méthode d'entrée précédente :"
 
-#: setup/setup.glade:100 setup/setup.glade:130 setup/setup.glade:164
-msgid "..."
-msgstr "…"
+#: setup/setup.glade:161
+msgid "Next input method:"
+msgstr "Méthode d'entrée suivante :"
+
+#: setup/setup.glade:174
+msgid "Enable or disable:"
+msgstr "Activer ou désactiver :"
 
 #: setup/setup.glade:188
 msgid "<b>Keyboard Shortcuts</b>"
 msgstr "<b>Raccourcis claviers</b>"
 
 #: setup/setup.glade:222
-#, fuzzy
 msgid "Candidates orientation:"
 msgstr "Orientation de la table :"
 
@@ -152,27 +149,29 @@ msgstr ""
 
 #: setup/setup.glade:249
 msgid "Show language panel:"
-msgstr ""
+msgstr "Afficher la barre de langue :"
 
 #: setup/setup.glade:259
 msgid ""
 "Never\n"
-"Dynamically\n"
+"When active\n"
 "Always"
 msgstr ""
+"Jamais\n"
+"Dynamiquement\n"
+"Toujours"
 
 #: setup/setup.glade:276
 msgid "Use custom font"
 msgstr "Utiliser une police personnalisée"
 
 #: setup/setup.glade:292
-#, fuzzy
 msgid "Custom font:"
-msgstr "Utiliser une police personnalisée"
+msgstr "Police personnalisée :"
 
 #: setup/setup.glade:317
 msgid "<b>Font and Style</b>"
-msgstr ""
+msgstr "<b>Police et Style</b>"
 
 #: setup/setup.glade:337
 msgid "General"
@@ -180,7 +179,7 @@ msgstr "Général"
 
 #: setup/setup.glade:465
 msgid "Input Methods"
-msgstr ""
+msgstr "Méthodes d'entrées"
 
 #: setup/setup.glade:482
 msgid ""
@@ -199,50 +198,13 @@ msgstr ""
 "\n"
 
 #: setup/setup.glade:510
-#, fuzzy
 msgid "Start ibus on login"
-msgstr "Démarrer automatiquement IBus lors de la connexion"
+msgstr "Démarrer IBus lors de la connexion"
 
 #: setup/setup.glade:521
-#, fuzzy
 msgid "<b>Startup</b>"
-msgstr "<b>Interface Utilisateur</b>"
+msgstr "<b>Démarrage</b>"
 
 #: setup/setup.glade:543
 msgid "About"
 msgstr "À propos"
-
-#~ msgid "Trigger:"
-#~ msgstr "Déclencheur :"
-
-#, fuzzy
-#~ msgid "Previous IME:"
-#~ msgstr "Moteur précédent :"
-
-#~ msgid "gtk-add"
-#~ msgstr "gtk-add"
-
-#~ msgid "gtk-remove"
-#~ msgstr "gtk-remove"
-
-#~ msgid "gtk-go-up"
-#~ msgstr "gtk-go-up"
-
-#~ msgid "gtk-go-down"
-#~ msgstr "gtk-go-down"
-
-#~ msgid "gtk-close"
-#~ msgstr "gtk-close"
-
-#~ msgid "Auto hide language bar"
-#~ msgstr "Cacher automatiquement la barre de langue"
-
-#, fuzzy
-#~ msgid "IBus - Running"
-#~ msgstr "IBus - Démarré"
-
-#~ msgid "IBus - Setup"
-#~ msgstr "IBus - Configuration"
-
-#~ msgid "Engine"
-#~ msgstr "Moteur"
diff --git a/po/ja.po b/po/ja.po
index 185f58e..eeb2117 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,9 +8,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ibus VERSION\n"
 "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n"
-"POT-Creation-Date: 2009-03-11 14:31+0800\n"
-"PO-Revision-Date: 2008-08-28 17:31+0900\n"
-"Last-Translator: UTUMI Hirosi <utuhiro78@yahoo.co.jp>\n"
+"POT-Creation-Date: 2009-03-20 09:52+0800\n"
+"PO-Revision-Date: 2009-03-19 16:12+0900\n"
+"Last-Translator: IWAI, Masaharu <iwai@alib.jp>\n"
 "Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -19,31 +19,33 @@ msgstr ""
 #: ibus/lang.py:40 ui/gtk/panel.py:307 ui/gtk/panel.py:308 ui/gtk/panel.py:309
 #: ui/gtk/panel.py:310
 msgid "Other"
-msgstr ""
+msgstr "その他"
 
 #: ui/gtk/panel.py:97
 msgid "IBus input method framework"
-msgstr ""
+msgstr "IBus インプットメソッドフレームワーク"
 
 #: ui/gtk/panel.py:282
 msgid "Restart"
-msgstr ""
+msgstr "再起動"
 
 #: ui/gtk/panel.py:337
 msgid "No input method"
-msgstr ""
+msgstr "インプットメソッドがありません"
 
 #: ui/gtk/panel.py:383
 msgid "IBus is an intelligent input bus for Linux/Unix."
-msgstr ""
+msgstr "IBus は、Linux/Unix のためのインテリジェントなインプットバスです。"
 
 #: ui/gtk/panel.py:387
 msgid "translator-credits"
-msgstr "UTUMI Hirosi <utuhiro78@yahoo.co.jp>"
+msgstr ""
+"UTUMI Hirosi <utuhiro78@yahoo.co.jp>\n"
+"IWAI, Masaharu <iwai@alib.jp>"
 
 #: ui/gtk/languagebar.py:84
 msgid "Switch engine"
-msgstr ""
+msgstr "エンジンの変更"
 
 #: setup/main.py:103
 msgid "trigger"
@@ -106,35 +108,33 @@ msgstr "キーもしくはキーの組み合わせを入力してください"
 
 #: setup/enginecombobox.py:99
 msgid "Select an input method"
-msgstr ""
+msgstr "インプットメソッドの選択"
 
 #: setup/setup.glade:7
 msgid "IBus Preferences"
-msgstr ""
-
-#: setup/setup.glade:51
-msgid "Enable or disable:"
-msgstr ""
+msgstr "IBus の設定"
 
-#: setup/setup.glade:62
-#, fuzzy
-msgid "Next input method:"
-msgstr "次のエンジン:"
+#: setup/setup.glade:64 setup/setup.glade:96 setup/setup.glade:128
+msgid "..."
+msgstr "..."
 
-#: setup/setup.glade:76
+#: setup/setup.glade:148
 msgid "previous input method:"
-msgstr ""
+msgstr "ひとつ前のインプットメソッド:"
 
-#: setup/setup.glade:100 setup/setup.glade:130 setup/setup.glade:164
-msgid "..."
-msgstr "..."
+#: setup/setup.glade:161
+msgid "Next input method:"
+msgstr "次のインプットメソッド:"
+
+#: setup/setup.glade:174
+msgid "Enable or disable:"
+msgstr "切り替え"
 
 #: setup/setup.glade:188
 msgid "<b>Keyboard Shortcuts</b>"
 msgstr "<b>キーボードショートカット</b>"
 
 #: setup/setup.glade:222
-#, fuzzy
 msgid "Candidates orientation:"
 msgstr "候補ウィンドウの向き:"
 
@@ -148,27 +148,29 @@ msgstr ""
 
 #: setup/setup.glade:249
 msgid "Show language panel:"
-msgstr ""
+msgstr "言語パネルの表示:"
 
 #: setup/setup.glade:259
 msgid ""
 "Never\n"
-"Dynamically\n"
+"When active\n"
 "Always"
 msgstr ""
+"表示しない\n"
+"有効なときだけ表示する\n"
+"常に表示する"
 
 #: setup/setup.glade:276
 msgid "Use custom font"
 msgstr "カスタムフォントを使う"
 
 #: setup/setup.glade:292
-#, fuzzy
 msgid "Custom font:"
-msgstr "カスタムフォントを使う"
+msgstr "カスタムフォント:"
 
 #: setup/setup.glade:317
 msgid "<b>Font and Style</b>"
-msgstr ""
+msgstr "<b>フォントとスタイル</b>"
 
 #: setup/setup.glade:337
 msgid "General"
@@ -176,7 +178,7 @@ msgstr "一般"
 
 #: setup/setup.glade:465
 msgid "Input Methods"
-msgstr ""
+msgstr "インプットメソッド"
 
 #: setup/setup.glade:482
 msgid ""
@@ -187,48 +189,21 @@ msgid ""
 "\n"
 "\n"
 msgstr ""
+"<big><b>IBus</b></big>\n"
+"<small>インテリジェントなインプットバス</small>\n"
+"ホームページ: http://code.google.com/p/ibus\n"
+"\n"
+"\n"
+"\n"
 
 #: setup/setup.glade:510
-#, fuzzy
 msgid "Start ibus on login"
-msgstr "セッションログイン時に IBus を自動的に起動"
+msgstr "ログイン時に IBus を起動"
 
 #: setup/setup.glade:521
 msgid "<b>Startup</b>"
-msgstr ""
+msgstr "<b>スタートアップ</b>"
 
 #: setup/setup.glade:543
 msgid "About"
 msgstr "About"
-
-#~ msgid "Trigger:"
-#~ msgstr "トリガー:"
-
-#, fuzzy
-#~ msgid "Previous IME:"
-#~ msgstr "前のエンジン:"
-
-#, fuzzy
-#~ msgid "gtk-remove"
-#~ msgstr "gtk-close"
-
-#~ msgid "gtk-close"
-#~ msgstr "gtk-close"
-
-#~ msgid "Auto hide language bar"
-#~ msgstr "言語バーを自動で隠す"
-
-#~ msgid "IBus - Running"
-#~ msgstr "IBus - 実行中"
-
-#~ msgid "IBus - Setup"
-#~ msgstr "IBus - セットアップ"
-
-#~ msgid "Engine"
-#~ msgstr "エンジン"
-
-#~ msgid "Started"
-#~ msgstr "開始"
-
-#~ msgid "Preload"
-#~ msgstr "プリロード"
diff --git a/po/pa.po b/po/pa.po
index 425a788..0bb12ce 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ibus\n"
 "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n"
-"POT-Creation-Date: 2009-03-11 14:31+0800\n"
+"POT-Creation-Date: 2009-03-20 09:52+0800\n"
 "PO-Revision-Date: 2008-10-17 14:15+0530\n"
 "Last-Translator: Amanpreet Singh <aalam@users.sf.net>\n"
 "Language-Team: Punjabi/Panjabi <punjabi-l10n@lists.sf.net>\n"
@@ -111,23 +111,23 @@ msgstr ""
 msgid "IBus Preferences"
 msgstr ""
 
-#: setup/setup.glade:51
-msgid "Enable or disable:"
+#: setup/setup.glade:64 setup/setup.glade:96 setup/setup.glade:128
+msgid "..."
+msgstr "..."
+
+#: setup/setup.glade:148
+msgid "previous input method:"
 msgstr ""
 
-#: setup/setup.glade:62
+#: setup/setup.glade:161
 #, fuzzy
 msgid "Next input method:"
 msgstr "ਅਗਲਾ ਇੰਜਣ:"
 
-#: setup/setup.glade:76
-msgid "previous input method:"
+#: setup/setup.glade:174
+msgid "Enable or disable:"
 msgstr ""
 
-#: setup/setup.glade:100 setup/setup.glade:130 setup/setup.glade:164
-msgid "..."
-msgstr "..."
-
 #: setup/setup.glade:188
 msgid "<b>Keyboard Shortcuts</b>"
 msgstr "<b>ਕੀਬੋਰਡ ਸ਼ਾਰਟਕੱਟ</b>"
@@ -152,7 +152,7 @@ msgstr ""
 #: setup/setup.glade:259
 msgid ""
 "Never\n"
-"Dynamically\n"
+"When active\n"
 "Always"
 msgstr ""
 
diff --git a/po/zh_CN.po b/po/zh_CN.po
index eb95e2f..6713459 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1.1.20080813\n"
 "Report-Msgid-Bugs-To: http://code.google.com/p/ibus/issues/entry\n"
-"POT-Creation-Date: 2009-03-11 14:31+0800\n"
+"POT-Creation-Date: 2009-03-20 09:52+0800\n"
 "PO-Revision-Date: 2008-08-13 21:59+0800\n"
 "Last-Translator: Huang Peng <shawn.p.huang@gmail.com>\n"
 "Language-Team: Huang Peng <shawn.p.huang@gmail.com>\n"
@@ -111,21 +111,21 @@ msgstr "选择输入法"
 msgid "IBus Preferences"
 msgstr "IBus设置"
 
-#: setup/setup.glade:51
-msgid "Enable or disable:"
-msgstr "开关"
-
-#: setup/setup.glade:62
-msgid "Next input method:"
-msgstr "下一入法"
+#: setup/setup.glade:64 setup/setup.glade:96 setup/setup.glade:128
+msgid "..."
+msgstr ""
 
-#: setup/setup.glade:76
+#: setup/setup.glade:148
 msgid "previous input method:"
 msgstr "前一入法"
 
-#: setup/setup.glade:100 setup/setup.glade:130 setup/setup.glade:164
-msgid "..."
-msgstr ""
+#: setup/setup.glade:161
+msgid "Next input method:"
+msgstr "下一入法"
+
+#: setup/setup.glade:174
+msgid "Enable or disable:"
+msgstr "开关"
 
 #: setup/setup.glade:188
 msgid "<b>Keyboard Shortcuts</b>"
@@ -150,11 +150,11 @@ msgstr "显示语言栏:"
 #: setup/setup.glade:259
 msgid ""
 "Never\n"
-"Dynamically\n"
+"When active\n"
 "Always"
 msgstr ""
 "从不\n"
-"动态\n"
+"活动时\n"
 "总是"
 
 #: setup/setup.glade:276
diff --git a/setup/main.py b/setup/main.py
index 42c3233..3ba6495 100644
--- a/setup/main.py
+++ b/setup/main.py
@@ -244,7 +244,7 @@ class Setup(object):
         dialog.destroy()
         if id != gtk.RESPONSE_OK:
             return
-        self.__config.set_value(section, _name, shortcuts)
+        self.__config.set_list(section, _name, shortcuts, "s")
         entry.set_text("; ".join(shortcuts))
 
 
diff --git a/setup/setup.glade b/setup/setup.glade
index a50efd1..ab7b061 100644
--- a/setup/setup.glade
+++ b/setup/setup.glade
@@ -45,57 +45,21 @@
                                 <property name="column_spacing">12</property>
                                 <property name="row_spacing">6</property>
                                 <child>
-                                  <widget class="GtkLabel" id="label7">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">Enable or disable:</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkLabel" id="label8">
-                                    <property name="visible">True</property>
-                                    <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">Next input method:</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="top_attach">1</property>
-                                    <property name="bottom_attach">2</property>
-                                    <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkLabel" id="label9">
-                                    <property name="visible">True</property>
-                                    <property name="sensitive">False</property>
-                                    <property name="xalign">0</property>
-                                    <property name="label" translatable="yes">previous input method:</property>
-                                  </widget>
-                                  <packing>
-                                    <property name="top_attach">2</property>
-                                    <property name="bottom_attach">3</property>
-                                    <property name="x_options">GTK_FILL</property>
-                                    <property name="y_options">GTK_FILL</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <widget class="GtkHBox" id="hbox4">
+                                  <widget class="GtkHBox" id="hbox6">
                                     <property name="visible">True</property>
                                     <property name="spacing">6</property>
                                     <child>
-                                      <widget class="GtkEntry" id="entry_trigger">
+                                      <widget class="GtkEntry" id="entry_prev_engine">
                                         <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
                                         <property name="can_focus">True</property>
                                         <property name="editable">False</property>
                                       </widget>
                                     </child>
                                     <child>
-                                      <widget class="GtkButton" id="button_trigger">
+                                      <widget class="GtkButton" id="button_prev_engine">
                                         <property name="visible">True</property>
+                                        <property name="sensitive">False</property>
                                         <property name="can_focus">True</property>
                                         <property name="label" translatable="yes">...</property>
                                         <property name="use_underline">True</property>
@@ -110,6 +74,8 @@
                                   <packing>
                                     <property name="left_attach">1</property>
                                     <property name="right_attach">2</property>
+                                    <property name="top_attach">2</property>
+                                    <property name="bottom_attach">3</property>
                                   </packing>
                                 </child>
                                 <child>
@@ -145,21 +111,19 @@
                                   </packing>
                                 </child>
                                 <child>
-                                  <widget class="GtkHBox" id="hbox6">
+                                  <widget class="GtkHBox" id="hbox4">
                                     <property name="visible">True</property>
                                     <property name="spacing">6</property>
                                     <child>
-                                      <widget class="GtkEntry" id="entry_prev_engine">
+                                      <widget class="GtkEntry" id="entry_trigger">
                                         <property name="visible">True</property>
-                                        <property name="sensitive">False</property>
                                         <property name="can_focus">True</property>
                                         <property name="editable">False</property>
                                       </widget>
                                     </child>
                                     <child>
-                                      <widget class="GtkButton" id="button_prev_engine">
+                                      <widget class="GtkButton" id="button_trigger">
                                         <property name="visible">True</property>
-                                        <property name="sensitive">False</property>
                                         <property name="can_focus">True</property>
                                         <property name="label" translatable="yes">...</property>
                                         <property name="use_underline">True</property>
@@ -174,8 +138,44 @@
                                   <packing>
                                     <property name="left_attach">1</property>
                                     <property name="right_attach">2</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkLabel" id="label9">
+                                    <property name="visible">True</property>
+                                    <property name="sensitive">False</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">previous input method:</property>
+                                  </widget>
+                                  <packing>
                                     <property name="top_attach">2</property>
                                     <property name="bottom_attach">3</property>
+                                    <property name="x_options">GTK_FILL</property>
+                                    <property name="y_options">GTK_FILL</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkLabel" id="label8">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Next input method:</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="top_attach">1</property>
+                                    <property name="bottom_attach">2</property>
+                                    <property name="x_options">GTK_FILL</property>
+                                    <property name="y_options">GTK_FILL</property>
+                                  </packing>
+                                </child>
+                                <child>
+                                  <widget class="GtkLabel" id="label7">
+                                    <property name="visible">True</property>
+                                    <property name="xalign">0</property>
+                                    <property name="label" translatable="yes">Enable or disable:</property>
+                                  </widget>
+                                  <packing>
+                                    <property name="x_options">GTK_FILL</property>
+                                    <property name="y_options">GTK_FILL</property>
                                   </packing>
                                 </child>
                               </widget>
@@ -257,7 +257,7 @@ Vertical</property>
                                       <widget class="GtkComboBox" id="combobox_panel_show">
                                         <property name="visible">True</property>
                                         <property name="items" translatable="yes">Never
-Dynamically
+When active
 Always</property>
                                       </widget>
                                       <packing>
diff --git a/src/ibusattribute.h b/src/ibusattribute.h
index 3a0ff7f..a3907c7 100644
--- a/src/ibusattribute.h
+++ b/src/ibusattribute.h
@@ -17,11 +17,19 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+/**
+ * SECTION: ibusattribute
+ * @short_description: Attributes of IBusText.
+ * @stability: Stable
+ * @see_also: #IBusText
+ *
+ * An IBusAttribute represents an attribute that associate to IBusText.
+ * It decorates preedit buffer and auxiliary text with underline, foreground and background colors.
+ */
 #ifndef __IBUS_ATTRIBUTE_H_
 #define __IBUS_ATTRIBUTE_H_
 
 #include "ibusserializable.h"
-
 /*
  * Type macros.
  */
@@ -53,12 +61,29 @@
 #define IBUS_ATTR_LIST_GET_CLASS(obj)   \
     (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_ATTR_LIST, IBusAttrListClass))
 
+/**
+ * IBusAttrType:
+ * @IBUS_ATTR_TYPE_UNDERLINE: Decorate with underline.
+ * @IBUS_ATTR_TYPE_FOREGROUND: Foreground color.
+ * @IBUS_ATTR_TYPE_BACKGROUND: Background color.
+ *
+ * Type of IBusText attribute.
+ */
 typedef enum {
     IBUS_ATTR_TYPE_UNDERLINE    = 1,
     IBUS_ATTR_TYPE_FOREGROUND   = 2,
     IBUS_ATTR_TYPE_BACKGROUND   = 3,
 } IBusAttrType;
 
+/**
+ * IBusAttrUnderline:
+ * @IBUS_ATTR_UNDERLINE_NONE: No underline.
+ * @IBUS_ATTR_UNDERLINE_SINGLE: Single underline.
+ * @IBUS_ATTR_UNDERLINE_DOUBLE: Double underline.
+ * @IBUS_ATTR_UNDERLINE_LOW: Low underline ? %FIXME
+ *
+ * Type of IBusText attribute.
+ */
 typedef enum {
     IBUS_ATTR_UNDERLINE_NONE    = 0,
     IBUS_ATTR_UNDERLINE_SINGLE  = 1,
@@ -73,10 +98,21 @@ typedef struct _IBusAttributeClass IBusAttributeClass;
 typedef struct _IBusAttrList IBusAttrList;
 typedef struct _IBusAttrListClass IBusAttrListClass;
 
+
+/**
+ * IBusAttribute:
+ * @type: IBusAttributeType
+ * @value: Value for the type.
+ * @start_index: The starting index, inclusive.
+ * @end_index: The ending index, exclusive.
+ *
+ * Signify the type, value and scope of the attribute.
+ * The scope starts from @start_index till the @end_index-1.
+ */
 struct _IBusAttribute {
     IBusSerializable parent;
 
-    /* members */
+    /*< public >*/
     guint type;
     guint value;
     guint start_index;
@@ -87,10 +123,16 @@ struct _IBusAttributeClass {
     IBusSerializableClass parent;
 };
 
+/**
+ * IBusAttrList:
+ * @attributes: GArray that holds #IBusAttribute.
+ *
+ * Array of IBusAttribute.
+ */
 struct _IBusAttrList {
     IBusSerializable parent;
 
-    /* members */
+    /*< public >*/
     GArray *attributes;
 };
 
@@ -98,26 +140,99 @@ struct _IBusAttrListClass {
     IBusSerializableClass parent;
 };
 
+/**
+ * ibus_attribute_get_type:
+ * @returns: GType of IBusAttribute.
+ *
+ * Returns GType of IBusAttribute.
+ */
 GType                ibus_attribute_get_type    ();
+
+/**
+ * ibus_attribute_new:
+ * @type: Type of the attribute.
+ * @value: Value of the attribute.
+ * @start_index: Where attribute starts.
+ * @end_index: Where attribute ends.
+ * @returns: A newly allocated IBusAttribute.
+ *
+ * New an IBusAttribute.
+ */
 IBusAttribute       *ibus_attribute_new         (guint           type,
                                                  guint           value,
                                                  guint           start_index,
                                                  guint           end_index);
+/**
+ * ibus_attr_underline_new:
+ * @underline_type: Type of underline.
+ * @start_index: Where attribute starts.
+ * @end_index: Where attribute ends.
+ * @returns: A newly allocated IBusAttribute.
+ *
+ * New an underline IBusAttribute.
+ */
 IBusAttribute       *ibus_attr_underline_new    (guint           underline_type,
                                                  guint           start_index,
                                                  guint           end_index);
+/**
+ * ibus_attr_foreground_new:
+ * @color: Color in RGB.
+ * @start_index: Where attribute starts.
+ * @end_index: Where attribute ends.
+ * @returns: A newly allocated IBusAttribute.
+ *
+ * New an foreground IBusAttribute.
+ */
 IBusAttribute       *ibus_attr_foreground_new   (guint           color,
                                                  guint           start_index,
                                                  guint           end_index);
+/**
+ * ibus_attr_background_new:
+ * @color: Color in RGB.
+ * @start_index: Where attribute starts.
+ * @end_index: Where attribute ends.
+ * @returns: A newly allocated IBusAttribute.
+ *
+ * New an background IBusAttribute.
+ */
 IBusAttribute       *ibus_attr_background_new   (guint           color,
                                                  guint           start_index,
                                                  guint           end_index);
 
 
+/**
+ * ibus_attr_list_get_type:
+ * @returns: GType of IBusAttrList.
+ *
+ * Returns GType of IBusAttrList.
+ */
 GType                ibus_attr_list_get_type    ();
+
+/**
+ * ibus_attr_list_new:
+ * @returns: A newly allocated IBusAttrList.
+ *
+ * New an IBusAttrList.
+ */
 IBusAttrList        *ibus_attr_list_new         ();
+
+/**
+ * ibus_attr_list_append:
+ * @attr_list: An IBusAttrList instance.
+ * @attr: The IBusAttribute instance to be appended.
+ *
+ * Append an IBusAttribute to IBusAttrList.
+ */
 void                 ibus_attr_list_append      (IBusAttrList   *attr_list,
                                                  IBusAttribute  *attr);
+/**
+ * ibus_attr_list_get:
+ * @attr_list: An IBusAttrList instance.
+ * @index: Index of the @attr_list.
+ * @returns: IBusAttribute at given index, NULL if no such IBusAttribute.
+ *
+ * Returns IBusAttribute at given index.
+ */
 IBusAttribute       *ibus_attr_list_get         (IBusAttrList   *attr_list,
                                                  guint           index);
 
diff --git a/src/ibusconnection.h b/src/ibusconnection.h
index 5a8e099..7ebf6e6 100644
--- a/src/ibusconnection.h
+++ b/src/ibusconnection.h
@@ -17,6 +17,15 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+/**
+ * SECTION: ibusconnection
+ * @short_description: DBusConnection wrapper.
+ * @see_also: <ulink url="http://dbus.freedesktop.org/doc/api/html/structDBusConnection.html">DBusConnection</ulink>
+ *
+ * An IBusConnection provides DBusConnection wrapper.
+ * It can be used to connect to either dBus or iBus daemon.
+ */
+
 #ifndef __IBUS_CONNECTION_H_
 #define __IBUS_CONNECTION_H_
 
diff --git a/src/ibusengine.c b/src/ibusengine.c
index d924e25..13ec52e 100644
--- a/src/ibusengine.c
+++ b/src/ibusengine.c
@@ -190,6 +190,11 @@ ibus_engine_class_init (IBusEngineClass *klass)
 
 
     /* install properties */
+    /**
+     * IBusEngine:name:
+     *
+     * Name of this IBusEngine.
+     */
     g_object_class_install_property (gobject_class,
                     PROP_NAME,
                     g_param_spec_string ("name",
@@ -198,7 +203,11 @@ ibus_engine_class_init (IBusEngineClass *klass)
                         "noname",
                         G_PARAM_READWRITE |  G_PARAM_CONSTRUCT_ONLY));
 
-
+    /**
+     * IBusEngine:connection:
+     *
+     * Connection for this IBusEngine.
+     */
     g_object_class_install_property (gobject_class,
                     PROP_CONNECTION,
                     g_param_spec_object ("connection",
@@ -208,6 +217,15 @@ ibus_engine_class_init (IBusEngineClass *klass)
                         G_PARAM_READWRITE |  G_PARAM_CONSTRUCT_ONLY));
 
     /* install signals */
+    /**
+     * IBusEngine::process-key-event:
+     * @engine: An IBusEngine.
+     * @keyval: KeySym of the key press.
+     * @state: Key modifier flags
+     *
+     * This signal is emitted whenever a key event is received.
+     * Implement process_key_event() in extend class to receive this signal.
+     */
     engine_signals[PROCESS_KEY_EVENT] =
         g_signal_new (I_("process-key-event"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -220,6 +238,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_UINT,
             G_TYPE_UINT);
 
+    /**
+     * IBusEngine::focus-in:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the client application get the focus.
+     * Implement focus_in() in extend class to receive this signal.
+     */
     engine_signals[FOCUS_IN] =
         g_signal_new (I_("focus-in"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -230,6 +255,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::focus-out:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the client application  lost the focus.
+     * Implement focus_out() in extend class to receive this signal.
+     */
     engine_signals[FOCUS_OUT] =
         g_signal_new (I_("focus-out"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -240,6 +272,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::reset:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the IME is reset.
+     * Implement reset() in extend class to receive this signal.
+     */
     engine_signals[RESET] =
         g_signal_new (I_("reset"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -250,6 +289,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::enable:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the IME is enabled.
+     * Implement enable() in extend class to receive this signal.
+     */
     engine_signals[ENABLE] =
         g_signal_new (I_("enable"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -260,6 +306,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::disable:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the IME is disabled.
+     * Implement disable() in extend class to receive this signal.
+     */
     engine_signals[DISABLE] =
         g_signal_new (I_("disable"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -270,6 +323,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::set-cursor-location:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the location of IME is set.
+     * Implement set_cursor_location() in extend class to receive this signal.
+     */
     engine_signals[SET_CURSOR_LOCATION] =
         g_signal_new (I_("set-cursor-location"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -284,6 +344,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_INT,
             G_TYPE_INT);
 
+    /**
+     * IBusEngine::set-capabilities:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the client application capabilities is set.
+     * Implement set_cursor_location() in extend class to receive this signal.
+     */
     engine_signals[SET_CAPABILITIES] =
         g_signal_new (I_("set-capabilities"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -295,6 +362,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             1,
             G_TYPE_UINT);
 
+    /**
+     * IBusEngine::page-up:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the page-up key is pressed.
+     * Implement page_up() in extend class to receive this signal.
+     */
     engine_signals[PAGE_UP] =
         g_signal_new (I_("page-up"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -305,6 +379,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::page-down:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the page-down key is pressed.
+     * Implement page_down() in extend class to receive this signal.
+     */
     engine_signals[PAGE_DOWN] =
         g_signal_new (I_("page-down"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -315,6 +396,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::cursor-up:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the up cursor key is pressed.
+     * Implement cursor_up() in extend class to receive this signal.
+     */
     engine_signals[CURSOR_UP] =
         g_signal_new (I_("cursor-up"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -325,6 +413,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::cursor-down:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever the down cursor key is pressed.
+     * Implement cursor_down() in extend class to receive this signal.
+     */
     engine_signals[CURSOR_DOWN] =
         g_signal_new (I_("cursor-down"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -335,6 +430,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_NONE,
             0);
 
+    /**
+     * IBusEngine::property-activate:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever a property is activated or change changed.
+     * Implement property_activate() in extend class to receive this signal.
+     */
     engine_signals[PROPERTY_ACTIVATE] =
         g_signal_new (I_("property-activate"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -347,6 +449,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             G_TYPE_STRING,
             G_TYPE_UINT);
 
+    /**
+     * IBusEngine::property-show:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever a property is shown.
+     * Implement property_show() in extend class to receive this signal.
+     */
     engine_signals[PROPERTY_SHOW] =
         g_signal_new (I_("property-show"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -358,6 +467,13 @@ ibus_engine_class_init (IBusEngineClass *klass)
             1,
             G_TYPE_STRING);
 
+    /**
+     * IBusEngine::property-hide:
+     * @engine: An IBusEngine.
+     *
+     * This signal is emitted whenever a property is hidden.
+     * Implement property_hide() in extend class to receive this signal.
+     */
     engine_signals[PROPERTY_HIDE] =
         g_signal_new (I_("property-hide"),
             G_TYPE_FROM_CLASS (gobject_class),
@@ -915,9 +1031,10 @@ ibus_engine_hide_auxiliary_text (IBusEngine *engine)
                   G_TYPE_INVALID);
 }
 
-void ibus_engine_update_lookup_table (IBusEngine        *engine,
-                                      IBusLookupTable   *table,
-                                      gboolean           visible)
+void
+ibus_engine_update_lookup_table (IBusEngine        *engine,
+                                 IBusLookupTable   *table,
+                                 gboolean           visible)
 {
     _send_signal (engine,
                   "UpdateLookupTable",
@@ -926,6 +1043,35 @@ void ibus_engine_update_lookup_table (IBusEngine        *engine,
                   G_TYPE_INVALID);
 }
 
+void
+ibus_engine_update_lookup_table_fast (IBusEngine        *engine,
+                                      IBusLookupTable   *table,
+                                      gboolean           visible)
+{
+    IBusLookupTable *new_table;
+    gint page_begin;
+    gint i;
+
+    if (table->candidates->len < table->page_size << 2) {
+        ibus_engine_update_lookup_table (engine, table, visible);
+        return;
+    }
+
+    page_begin = (table->cursor_pos / table->page_size) * table->page_size;
+
+    new_table = ibus_lookup_table_new (table->page_size, 0, table->cursor_visible, table->round);
+
+    for (i = page_begin; i < page_begin + table->page_size && i < table->candidates->len; i++) {
+        ibus_lookup_table_append_candidate (new_table, ibus_lookup_table_get_candidate (table, i));
+    }
+
+    ibus_lookup_table_set_cursor_pos (new_table, ibus_lookup_table_get_cursor_in_page (table));
+
+    ibus_engine_update_lookup_table (engine, new_table, visible);
+
+    g_object_unref (new_table);
+}
+
 void ibus_engine_show_lookup_table (IBusEngine *engine)
 {
     _send_signal (engine,
@@ -942,13 +1088,11 @@ void ibus_engine_hide_lookup_table (IBusEngine *engine)
 
 void ibus_engine_forward_key_event (IBusEngine      *engine,
                                     guint            keyval,
-                                    gboolean         is_press,
                                     guint            state)
 {
     _send_signal (engine,
-                  "HideLookupTable",
+                  "ForwardKeyEvent",
                   G_TYPE_UINT, &keyval,
-                  G_TYPE_BOOLEAN, &is_press,
                   G_TYPE_UINT, &state,
                   G_TYPE_INVALID);
 }
diff --git a/src/ibusengine.h b/src/ibusengine.h
index 1a35c06..4fe12dc 100644
--- a/src/ibusengine.h
+++ b/src/ibusengine.h
@@ -129,6 +129,10 @@ void         ibus_engine_update_lookup_table
                                         (IBusEngine         *engine,
                                          IBusLookupTable    *lookup_table,
                                          gboolean            visible);
+void         ibus_engine_update_lookup_table_fast
+                                        (IBusEngine         *engine,
+                                         IBusLookupTable    *lookup_table,
+                                         gboolean            visible);
 void         ibus_engine_show_lookup_table
                                         (IBusEngine         *engine);
 void         ibus_engine_hide_lookup_table
@@ -137,7 +141,6 @@ void         ibus_engine_hide_lookup_table
 void         ibus_engine_forward_key_event
                                         (IBusEngine         *engine,
                                          guint               keyval,
-                                         gboolean            is_press,
                                          guint               state);
 
 void         ibus_engine_register_properties
diff --git a/src/ibusenginedesc.c b/src/ibusenginedesc.c
index 39062b3..f9173e7 100644
--- a/src/ibusenginedesc.c
+++ b/src/ibusenginedesc.c
@@ -264,7 +264,7 @@ ibus_engine_desc_output (IBusEngineDesc *desc,
     OUTPUT_ENTRY_1(icon);
     OUTPUT_ENTRY_1(layout);
     g_string_append_indent (output, indent + 1);
-    g_string_append_printf (output, "<rank>%u</rank>", desc->rank);
+    g_string_append_printf (output, "<rank>%u</rank>\n", desc->rank);
 #undef OUTPUT_ENTRY
 #undef OUTPUT_ENTRY_1
     g_string_append_indent (output, indent);
diff --git a/src/ibusenginedesc.h b/src/ibusenginedesc.h
index 1ba9153..ad83f1f 100644
--- a/src/ibusenginedesc.h
+++ b/src/ibusenginedesc.h
@@ -17,6 +17,22 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+/**
+ * SECTION: ibusenginedesc
+ * @short_description:  Input method engine description data.
+ * @stability: Stable
+ * @see_also: #IBusComponent, #IBusEngine
+ *
+ * An IBusEngineDesc stores description data of IBusEngine.
+ * The description data can either be passed to ibus_engine_desc_new(),
+ * or loaded from an XML node through ibus_engine_desc_new_from_xml_node()
+ * to construct IBusEngineDesc.
+ *
+ * However, the recommended way to load engine description data is
+ * using ibus_component_new_from_file() to load a component file,
+ * which also includes engine description data.
+ */
+
 #ifndef __ENGINE_DESC_H_
 #define __ENGINE_DESC_H_
 
@@ -47,10 +63,26 @@ typedef struct _IBusEngineDesc IBusEngineDesc;
 typedef struct _IBusEngineDescClass IBusEngineDescClass;
 typedef struct _BusComponent BusComponent;
 
+/**
+ * IBusEngineDesc:
+ * @name: Name of the engine.
+ * @longname: Long name of the input method engine.
+ * @description: Input method engine description.
+ * @language: Language (e.g. zh, jp) supported by this input method engine.
+ * @license: License of the input method engine.
+ * @author: Author of the input method engine.
+ * @icon: Icon file of this engine.
+ * @layout: Keyboard layout
+ * @rank: Preference rank among engines, the highest ranked IME will put in
+ * the front.
+ *
+ * Input method engine description data.
+ */
 struct _IBusEngineDesc {
     IBusSerializable parent;
     /* instance members */
 
+    /*< public >*/
     gchar *name;
     gchar *longname;
     gchar *description;
@@ -64,11 +96,25 @@ struct _IBusEngineDesc {
 
 struct _IBusEngineDescClass {
     IBusSerializableClass parent;
-
     /* class members */
 };
 
 GType            ibus_engine_desc_get_type      (void);
+
+/**
+ * ibus_engine_desc_new:
+ * @name: Name of the engine.
+ * @longname: Long name of the input method engine.
+ * @description: Input method engine description.
+ * @language: Language (e.g. zh, jp) supported by this input method engine.
+ * @license: License of the input method engine.
+ * @author: Author of the input method engine.
+ * @icon: Icon file of this engine.
+ * @layout: Keyboard layout
+ * @returns: A newly allocated IBusEngineDesc.
+ *
+ * New a IBusEngineDesc.
+ */
 IBusEngineDesc  *ibus_engine_desc_new           (const gchar    *name,
                                                  const gchar    *longname,
                                                  const gchar    *description,
@@ -77,8 +123,28 @@ IBusEngineDesc  *ibus_engine_desc_new           (const gchar    *name,
                                                  const gchar    *author,
                                                  const gchar    *icon,
                                                  const gchar    *layout);
+/**
+ * ibus_engine_desc_new_from_xml_node:
+ * @node: An XML node
+ * @returns: A newly allocated IBusEngineDesc that contains description from
+ * @node.
+ *
+ * New a IBusEngineDesc from an XML node.
+ * <note><para>This function is called by ibus_component_new_from_file(),
+ *  so developers normally do not need to call it directly.
+ * </para></note>
+ */
 IBusEngineDesc  *ibus_engine_desc_new_from_xml_node
                                                 (XMLNode        *node);
+/**
+ * ibus_engine_desc_output:
+ * @info: An IBusEngineDesc
+ * @output: XML-formatted Input method engine description.
+ * @indent: Number of indent (showed as 4 spaces).
+ *
+ * Output XML-formatted input method engine description.
+ * The result will be append to GString specified in @output.
+ */
 void             ibus_engine_desc_output        (IBusEngineDesc  *info,
                                                  GString        *output,
                                                  gint            indent);
diff --git a/src/ibusinputcontext.c b/src/ibusinputcontext.c
index 94de55a..95754cf 100644
--- a/src/ibusinputcontext.c
+++ b/src/ibusinputcontext.c
@@ -426,14 +426,12 @@ ibus_input_context_ibus_signal (IBusProxy           *proxy,
                                      IBUS_INTERFACE_INPUT_CONTEXT,
                                      "ForwardKeyEvent")) {
         guint32 keyval;
-        gboolean is_press;
         guint32 state;
         gboolean retval;
 
         retval = ibus_message_get_args (message,
                                         &error,
                                         G_TYPE_UINT, &keyval,
-                                        G_TYPE_BOOLEAN, &is_press,
                                         G_TYPE_UINT, &state,
                                         G_TYPE_INVALID);
 
diff --git a/src/ibuslookuptable.c b/src/ibuslookuptable.c
index 37342c5..5e1bc81 100644
--- a/src/ibuslookuptable.c
+++ b/src/ibuslookuptable.c
@@ -273,6 +273,8 @@ ibus_lookup_table_clear (IBusLookupTable *table)
     }
 
     g_array_set_size (table->candidates, 0);
+
+    table->cursor_pos = 0;
 }
 
 void
diff --git a/src/ibusobject.h b/src/ibusobject.h
index 67fb95b..a3adfe2 100644
--- a/src/ibusobject.h
+++ b/src/ibusobject.h
@@ -17,9 +17,24 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+/**
+ * SECTION: ibusobject
+ * @short_description: Base Object of iBus.
+ * @stability: Stable
+ *
+ * iBus Object is the base object for all objects in iBus.
+ */
 #ifndef __IBUS_OBJECT_H_
 #define __IBUS_OBJECT_H_
 
+/**
+ * SECTION: iBusObject
+ * @short_description: Base object of iBus.
+ *
+ *
+ * This module provides essential definition and functions for manipulating
+ * iBus base object.
+ */
 #include <glib-object.h>
 #include "ibusmarshalers.h"
 #include "ibustypes.h"
diff --git a/src/ibusproperty.h b/src/ibusproperty.h
index 19ff33c..d28d3a8 100644
--- a/src/ibusproperty.h
+++ b/src/ibusproperty.h
@@ -17,6 +17,19 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+/**
+ * SECTION: ibusproperty
+ * @short_description: UI component for input method engine property.
+ * @stability: Stable
+ * @see_also: #IBusEngine
+ *
+ * An IBusProperty is an UI component like a button or a menu item
+ * which shows the status of corresponding input method engine property.
+ * End user can operate and see the current status of IME through these components.
+ * For example, ibus-chewing users change the English/Chinese input mode by
+ * pressing ctrl-space or click on the Eng/Chi switch button.
+ * And the IBusProperty shows the change correspondingly.
+ */
 #ifndef __IBUS_PROPERTY_H_
 #define __IBUS_PROPERTY_H_
 
@@ -59,7 +72,17 @@ G_BEGIN_DECLS
 #define IBUS_PROP_LIST_GET_CLASS(obj)   \
     (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_PROP_LIST, IBusPropListClass))
 
-
+/**
+ * IBusPropType:
+ * @PROP_TYPE_NORMAL: Property is shown as normal text.
+ * @PROP_TYPE_TOGGLE: Property is shown as a toggle button.
+ * @PROP_TYPE_RADIO: Property is shown as a radio selection option.
+ * @PROP_TYPE_MENU: Property is shown as a menu, usually imply it has sub menu
+ * items.
+ * @PROP_TYPE_SEPARATOR: A separator for menu.
+ *
+ * Type of IBusProperty.
+ */
 typedef enum {
     PROP_TYPE_NORMAL = 0,
     PROP_TYPE_TOGGLE = 1,
@@ -68,6 +91,28 @@ typedef enum {
     PROP_TYPE_SEPARATOR = 4,
 } IBusPropType;
 
+/**
+ * IBusPropState:
+ * @PROP_STATE_UNCHECKED: Property option is unchecked.
+ * @PROP_STATE_CHECKED: Property option is checked.
+ * @PROP_STATE_INCONSISTENT: The state is inconsistent with the associated IME
+ * property.
+ *
+ * State of IBusProperty. The actual effect depends on #IBusPropType of the
+ * IBusProperty.
+ *
+ * <variablelist>
+ *     <varlistentry>
+ *         <term>PROP_TYPE_TOGGLE</term>
+ *         <listitem><para>Emphasized if PROP_STATE_CHECKED, normal otherwise.</para></listitem>
+ *     </varlistentry>
+ *     <varlistentry>
+ *         <term>PROP_TYPE_RADIO</term>
+ *         <listitem><para>Option checked if PROP_STATE_CHECKED, unchecked otherwise.</para></listitem>
+ *     </varlistentry>
+ * </variablelist>
+ * No effect on other types.
+ */
 typedef enum {
     PROP_STATE_UNCHECKED = 0,
     PROP_STATE_CHECKED = 1,
@@ -80,9 +125,25 @@ typedef struct _IBusPropertyClass IBusPropertyClass;
 typedef struct _IBusPropList IBusPropList;
 typedef struct _IBusPropListClass IBusPropListClass;
 
+/**
+ * IBusProperty:
+ * @key: Unique Identity for the IBusProperty.
+ * @icon: Icon file for the IBusProperty.
+ * @label: Text shown in UI.
+ * @tooltip: Message shown if mouse hovered the  IBusProperty.
+ * @sensitive: Whether the IBusProperty is sensitive to keyboard and mouse event.
+ * @visible: Whether the IBusProperty is visible.
+ * @type: IBusPropType of IBusProperty.
+ * @state: IBusPropState of IBusProperty.
+ * @sub_props: IBusPropList that contains sub IBusProperties. These IBusProperties are usually
+ * shown as sub menu item.
+ *
+ * UI component for input method engine property.
+ */
 struct _IBusProperty {
     IBusSerializable parent;
 
+    /*< public >*/
     gchar    *key;
     gchar    *icon;
     IBusText *label;
@@ -100,9 +161,16 @@ struct _IBusPropertyClass {
     IBusSerializableClass parent;
 };
 
+/**
+ * IBusPropList:
+ * @properties: GArray that holds IBusProperties.
+ *
+ * A GArray of IBusProperties.
+ */
 struct _IBusPropList {
     IBusSerializable parent;
 
+    /*< public >*/
     GArray *properties;
 };
 
@@ -111,6 +179,22 @@ struct _IBusPropListClass {
 };
 
 GType            ibus_property_get_type     ();
+
+/**
+ * ibus_property_new:
+ * @key: Unique Identity for the IBusProperty.
+ * @icon: Icon file for the IBusProperty.
+ * @label: Text shown in UI.
+ * @tooltip: Message shown if mouse hovered the  IBusProperty.
+ * @sensitive: Whether the IBusProperty is sensitive to keyboard and mouse event.
+ * @visible: Whether the IBusProperty is visible.
+ * @type: IBusPropType of IBusProperty.
+ * @state: IBusPropState of IBusProperty.
+ * @prop_list: IBusPropList that contains sub IBusProperties.
+ * @returns: A newly allocated IBusProperty.
+ *
+ * New a IBusProperty.
+ */
 IBusProperty    *ibus_property_new          (const gchar    *key,
                                              IBusPropType    type,
                                              IBusText       *label,
@@ -120,21 +204,90 @@ IBusProperty    *ibus_property_new          (const gchar    *key,
                                              gboolean        visible,
                                              IBusPropState   state,
                                              IBusPropList   *prop_list);
+
+/**
+ * ibus_property_set_label:
+ * @prop: An IBusProperty.
+ * @label: Text shown in UI.
+ *
+ * Set the label of IBusProperty.
+ */
 void             ibus_property_set_label    (IBusProperty   *prop,
                                              IBusText       *label);
+
+/**
+ * ibus_property_set_visible:
+ * @prop: An IBusProperty.
+ * @visible: Whether the IBusProperty is visible.
+ *
+ * Set whether the IBusProperty is visible.
+ */
 void             ibus_property_set_visible  (IBusProperty   *prop,
                                              gboolean        visible);
+
+/**
+ * ibus_property_set_sub_props:
+ * @prop: An IBusProperty.
+ * @prop_list: IBusPropList that contains sub IBusProperties.
+ *
+ * Set the sub IBusProperties.
+ */
 void             ibus_property_set_sub_props(IBusProperty   *prop,
                                              IBusPropList   *prop_list);
+
+/**
+ * ibus_property_update:
+ * @prop: An IBusProperty.
+ * @prop_update: IBusPropList that contains sub IBusProperties.
+ * @returns: TRUE for update suceeded; FALSE otherwise.
+ *
+ * Update the content of an IBusProperty.
+ * IBusProperty @prop_update can either be sub-property of @prop,
+ * or holds new values for @prop.
+ */
+
 gboolean         ibus_property_update       (IBusProperty   *prop,
                                              IBusProperty   *prop_update);
 
 GType            ibus_prop_list_get_type    ();
+
+/**
+ * ibus_prop_list_new:
+ * @returns: A newly allocated IBusPropList.
+ *
+ * New a IBusPropList.
+ */
 IBusPropList    *ibus_prop_list_new         ();
+
+/**
+ * ibus_prop_list_append:
+ * @prop_list: An IBusPropList.
+ * @prop: IBusProperty to be append to @prop_list.
+ *
+ * Append an IBusProperty to an IBusPropList.
+ */
 void             ibus_prop_list_append      (IBusPropList   *prop_list,
                                              IBusProperty   *prop);
+
+/**
+ * ibus_prop_list_get:
+ * @prop_list: An IBusPropList.
+ * @index: Index of an IBusPropList.
+ * @returns: IBusProperty at given index, NULL if no such IBusProperty.
+ *
+ * Returns IBusProperty at given index.
+ */
 IBusProperty    *ibus_prop_list_get         (IBusPropList   *prop_list,
                                              guint           index);
+
+/**
+ * ibus_prop_list_update_property:
+ * @prop_list: An IBusPropList.
+ * @prop: IBusProperty to be update.
+ * @returns: TRUE if succeeded, FALSE otherwise.
+ *
+ * Update an IBusProperty in IBusPropList.
+ */
 gboolean         ibus_prop_list_update_property
                                             (IBusPropList   *prop_list,
                                              IBusProperty   *prop);
diff --git a/src/ibustext.h b/src/ibustext.h
index 9696f80..1c48c1e 100644
--- a/src/ibustext.h
+++ b/src/ibustext.h
@@ -17,6 +17,17 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+/**
+ * SECTION: ibustext
+ * @short_description: Text with decorating information.
+ * @see_also: #IBusAttribute
+ *
+ * An IBusText is the main text object in IBus.
+ * The text is decorated according to associated IBusAttribute,
+ * e.g. the foreground/background color, underline, and
+ * applied scope.
+ */
+
 #ifndef __IBUS_TEXT_H_
 #define __IBUS_TEXT_H_
 
@@ -45,10 +56,19 @@ G_BEGIN_DECLS
 typedef struct _IBusText IBusText;
 typedef struct _IBusTextClass IBusTextClass;
 
+/**
+ * IBusText:
+ * @is_static: Whether @text is static, i.e., no need and will not be freed. Only TRUE if IBusText is newed from ibus_text_new_from_static_string().
+ * @text: The string content of IBusText in UTF-8.
+ * @attrs: Associated IBusAttributes.
+ *
+ * A text object in IBus.
+ */
 struct _IBusText {
     IBusSerializable parent;
 
     /* members */
+    /*< public >*/
     gboolean is_static;
     gchar  *text;
     IBusAttrList *attrs;
@@ -59,17 +79,79 @@ struct _IBusTextClass {
 };
 
 GType            ibus_text_get_type                 (void);
+
+/**
+ * ibus_text_new_from_string:
+ * @str: An text string to be set.
+ * @returns: A newly allocated IBusText.
+ *
+ * New an IBusText whose content is copied from a text string.
+ */
 IBusText        *ibus_text_new_from_string          (const gchar    *str);
+
+/**
+ * ibus_text_new_from_ucs4:
+ * @str: An text string to be set.
+ * @returns: A newly allocated IBusText.
+ *
+ * New an IBusText whose content is copied from a UCS4 encoded text string.
+ */
 IBusText        *ibus_text_new_from_ucs4            (const gunichar *str);
+
+/**
+ * ibus_text_new_from_static_string:
+ * @str: An text string to be set.
+ * @returns: A newly allocated IBusText.
+ *
+ * New an IBusText whose content is from a static string.
+ * Note that it is the developer's duty to ensure @str is static.
+ */
 IBusText        *ibus_text_new_from_static_string   (const gchar    *str);
+
+/**
+ * ibus_text_new_from_printf:
+ * @fmt: printf format string.
+ * @...: arguments for @fmt.
+ * @returns: A newly allocated IBusText.
+ *
+ * New an IBusText from a printf expression.
+ */
 IBusText        *ibus_text_new_from_printf          (const gchar    *fmt,
                                                      ...);
+
+/**
+ * ibus_text_new_from_unichar:
+ * @c: A single UCS4-encoded character.
+ * @returns: A newly allocated IBusText.
+ *
+ * New an IBusText from a single UCS4-encoded character.
+ */
 IBusText        *ibus_text_new_from_unichar         (gunichar        c);
+
+/**
+ * ibus_text_append_attribute:
+ * @text: an IBusText
+ * @type: IBusAttributeType for @text.
+ * @value: Value for the type.
+ * @start_index: The starting index, inclusive.
+ * @end_index: The ending index, exclusive.
+ *
+ * Append an IBusAttribute for IBusText.
+ */
 void             ibus_text_append_attribute         (IBusText       *text,
                                                      guint           type,
                                                      guint           value,
                                                      guint           start_index,
                                                      gint            end_index);
+/**
+ * ibus_text_get_length:
+ * @text: An IBusText.
+ * @returns: Number of character in @text, not counted by bytes.
+ *
+ * Return number of characters in an IBusText.
+ * This function is based on g_utf8_strlen(), so unlike strlen(),
+ * it does not count by bytes but characters instead.
+ */
 guint            ibus_text_get_length               (IBusText       *text);
 
 G_END_DECLS
diff --git a/src/ibustypes.h b/src/ibustypes.h
index a977db4..b2ea627 100644
--- a/src/ibustypes.h
+++ b/src/ibustypes.h
@@ -17,9 +17,41 @@
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+/**
+ * SECTION: ibustypes
+ * @short_description: Generic types for  iBus.
+ * @stability: Stable
+ *
+ * This session consists generic types for iBus, including shift/control key modifiers,
+ * and a rectangle structure.
+ */
 #ifndef __IBUS_TYPES_H_
 #define __IBUS_TYPES_H_
 
+/**
+ * IBusModifierType:
+ * @IBUS_SHIFT_MASK: Shift  is activated.
+ * @IBUS_LOCK_MASK: Cap Lock is locked.
+ * @IBUS_CONTROL_MASK: Control key is activated.
+ * @IBUS_MOD1_MASK: Modifier 1 (Usually Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)) activated.
+ * @IBUS_MOD2_MASK: Modifier 2 (Usually Num_Lock (0x4d)) activated.
+ * @IBUS_MOD3_MASK: Modifier 3 activated.
+ * @IBUS_MOD4_MASK: Modifier 4 (Usually Super_L (0xce),  Hyper_L (0xcf)) activated.
+ * @IBUS_MOD5_MASK: Modifier 5 (ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)) activated.
+ * @IBUS_BUTTON1_MASK: Mouse button 1 (left) is activated.
+ * @IBUS_BUTTON2_MASK: Mouse button 2 (middle) is activated.
+ * @IBUS_BUTTON3_MASK: Mouse button 3 (right) is activated.
+ * @IBUS_BUTTON4_MASK: Mouse button 4 (scroll up) is activated.
+ * @IBUS_BUTTON5_MASK: Mouse button 5 (scroll down) is activated.
+ * @IBUS_FORWARD_MASK: Forward mask.
+ * @IBUS_SUPER_MASK: Super (Usually Win) key is activated.
+ * @IBUS_HYPER_MASK: Hyper key is activated.
+ * @IBUS_RELEASE_MASK: Key is released.
+ * @IBUS_MODIFIER_MASK: Modifier mask for the all the masks above.
+ *
+ * Handles key modifier such as control, shift and alt and release event.
+ * Note that nits 15 - 25 are currently unused, while bit 29 is used internally.
+ */
 typedef enum
 {
     IBUS_SHIFT_MASK    = 1 << 0,
@@ -40,7 +72,7 @@ typedef enum
      * Bits 15 - 25 are currently unused. Bit 29 is used internally.
      */
 
-    /* forard mask */
+    /* forward mask */
     IBUS_FORWARD_MASK  = 1 << 25,
 
     IBUS_SUPER_MASK    = 1 << 26,
@@ -52,6 +84,16 @@ typedef enum
     IBUS_MODIFIER_MASK = 0x5c001fff
 } IBusModifierType;
 
+/**
+ * IBusCapabilite:
+ * @IBUS_CAP_PREEDIT_TEXT: UI is capable to show pre-edit text.
+ * @IBUS_CAP_AUXILIARY_TEXT: UI is capable to show auxiliary text.
+ * @IBUS_CAP_LOOKUP_TABLE: UI is capable to show the lookup table.
+ * @IBUS_CAP_FOCUS: UI is capable to get focus.
+ * @IBUS_CAP_PROPERTY: UI is capable to have property.
+ *
+ * Capability flags of UI.
+ */
 typedef enum {
     IBUS_CAP_PREEDIT_TEXT       = 1 << 0,
     IBUS_CAP_AUXILIARY_TEXT     = 1 << 1,
@@ -60,6 +102,15 @@ typedef enum {
     IBUS_CAP_PROPERTY           = 1 << 4,
 } IBusCapabilite;
 
+/**
+ * IBusRectangle:
+ * @x: x coordinate.
+ * @y: y coordinate.
+ * @width: width of the rectangle.
+ * @height: height of the renctangl.
+ *
+ * Rectangle definition.
+ */
 typedef struct _IBusRectangle IBusRectangle;
 struct _IBusRectangle {
     gint x;
@@ -68,7 +119,13 @@ struct _IBusRectangle {
     gint height;
 };
 
-typedef void (* IBusFreeFunc) (gpointer );
+/**
+ * IBusFreeFunc:
+ * @object: object to be freed.
+ *
+ * Free function prototype.
+ */
+typedef void (* IBusFreeFunc) (gpointer object);
 
 #endif
 
diff --git a/ui/gtk/candidatepanel.py b/ui/gtk/candidatepanel.py
index db02163..05c4e71 100644
--- a/ui/gtk/candidatepanel.py
+++ b/ui/gtk/candidatepanel.py
@@ -238,11 +238,11 @@ class CandidatePanel(gtk.VBox):
         else:
             # package all widgets in HORIZONTAL mode
             image = gtk.Image()
-            image.set_from_stock(gtk.STOCK_GO_BACK, gtk.ICON_SIZE_MENU)
+            image.set_from_stock(gtk.STOCK_GO_UP, gtk.ICON_SIZE_MENU)
             self.__prev_button.set_image(image)
 
             image = gtk.Image()
-            image.set_from_stock(gtk.STOCK_GO_FORWARD, gtk.ICON_SIZE_MENU)
+            image.set_from_stock(gtk.STOCK_GO_DOWN, gtk.ICON_SIZE_MENU)
             self.__next_button.set_image(image)
 
             vbox = gtk.VBox()