[ibus] Bumped to 1.4.99.20120317

Takao Fujiwara fujiwara at fedoraproject.org
Sun Mar 18 09:48:45 UTC 2012


commit 19c65a75428342fe4072e034363020a20489c878
Author: Takao Fujiwara <tfujiwar at redhat.com>
Date:   Sun Mar 18 18:41:41 2012 +0900

    Bumped to 1.4.99.20120317

 .gitignore                        |    2 +
 ibus-530711-preload-sys.patch     |  839 +++++++++++--------------------------
 ibus-541492-xkb.patch             |  141 ++++---
 ibus-HEAD.patch                   |  248 ++++++++---
 ibus-xx-no-use.diff               |  221 ++++++++++
 ibus-xx-setup-frequent-lang.patch |   24 +-
 ibus.spec                         |  136 +++----
 sources                           |    4 +-
 8 files changed, 806 insertions(+), 809 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 7602b8d..49654d9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,6 +17,7 @@ ibus-1.3.6.tar.gz
 /ibus-1.3.99.20110817.tar.gz
 /ibus-1.4.99.20120203.tar.gz
 /ibus-1.4.99.20120304.tar.gz
+/ibus-1.4.99.20120317.tar.gz
 /ibus-gjs-3.0.2.20110823.tar.gz
 /ibus-gjs-3.1.4.20110823.tar.gz
 /ibus-gjs-3.0.2.20110908.tar.gz
@@ -37,3 +38,4 @@ ibus-1.3.6.tar.gz
 /ibus-gjs-3.2.1.20111230.tar.gz
 /ibus-gjs-3.3.3.20120203.tar.gz
 /ibus-gjs-3.3.90.20120308.tar.gz
+/ibus-gjs-3.3.90.20120317.tar.gz
diff --git a/ibus-530711-preload-sys.patch b/ibus-530711-preload-sys.patch
index 941e7e9..1c6e2f7 100644
--- a/ibus-530711-preload-sys.patch
+++ b/ibus-530711-preload-sys.patch
@@ -1,6 +1,6 @@
-From 8f5bb828744532bcfded7e92f3a1db1f26e567e8 Mon Sep 17 00:00:00 2001
+From 38cfe0622ece31d4aff2827a7d67f7250f0e0d5e Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1 at gmail.com>
-Date: Fri, 30 Dec 2011 15:46:56 +0900
+Date: Fri, 16 Mar 2012 20:47:35 +0900
 Subject: [PATCH] Reload preload engines until users customize the list.
 
 The idea is, if users don't customize the preload_engines with ibus-setup,
@@ -17,507 +17,20 @@ on ibus-setup, ibus-setup sets 'preload_engine_mode' as
 IBUS_PRELOAD_ENGINE_MODE_USER and users can customize the value
 'preload_engines'.
 ---
- bus/ibusimpl.c       |  412 +++++++++++++++++++++++++++++++++++++++-----------
- data/ibus.schemas.in |   15 ++-
- ibus/common.py       |    6 +
- setup/main.py        |   73 ++++++++-
- setup/setup.ui       |   21 +++-
- src/ibustypes.h      |   10 ++
- 6 files changed, 440 insertions(+), 97 deletions(-)
+ data/ibus.schemas.in |   24 +++++++++
+ setup/main.py        |   61 +++++++++++++++++++++--
+ setup/setup.ui       |   21 +++++++-
+ src/ibustypes.h      |   10 ++++
+ ui/gtk3/panel.vala   |  136 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 5 files changed, 245 insertions(+), 7 deletions(-)
 
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 059d660..bba9353 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -142,6 +142,9 @@ static void     bus_ibus_impl_set_previous_engine
- static void     bus_ibus_impl_set_preload_engines
-                                                 (BusIBusImpl        *ibus,
-                                                  GVariant           *value);
-+static void     bus_ibus_impl_set_preload_engine_mode
-+                                                (BusIBusImpl        *ibus,
-+                                                 GVariant           *value);
- static void     bus_ibus_impl_set_use_sys_layout
-                                                 (BusIBusImpl        *ibus,
-                                                  GVariant           *value);
-@@ -283,6 +286,269 @@ _panel_destroy_cb (BusPanelProxy *panel,
- }
- 
- static void
-+_config_set_value_done (GObject      *object,
-+                        GAsyncResult *res,
-+                        gpointer      user_data)
-+{
-+    IBusConfig *config = (IBusConfig *) object;
-+    GVariant *value = (GVariant *) user_data;
-+    GError *error = NULL;
-+
-+    g_assert (IBUS_IS_CONFIG (config));
-+
-+    if (!ibus_config_set_value_async_finish (config, res, &error)) {
-+        if (error) {
-+            g_error_free (error);
-+        }
-+    }
-+    g_variant_unref (value);
-+}
-+
-+#ifndef OS_CHROMEOS
-+static gint
-+_engine_desc_cmp (IBusEngineDesc *desc1,
-+                  IBusEngineDesc *desc2)
-+{
-+    return - ((gint) ibus_engine_desc_get_rank (desc1)) +
-+              ((gint) ibus_engine_desc_get_rank (desc2));
-+}
-+#endif
-+
-+#ifndef OS_CHROMEOS
-+static gint
-+_get_config_preload_engine_mode (BusIBusImpl *ibus)
-+{
-+    GVariant *variant = NULL;
-+    gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_USER;
-+
-+    g_assert (BUS_IS_IBUS_IMPL (ibus));
-+
-+    if (ibus->config == NULL) {
-+        return preload_engine_mode;
-+    }
-+
-+    variant = ibus_config_get_value (ibus->config, "general",
-+                                     "preload_engines");
-+    if (variant != NULL && g_variant_classify (variant) == G_VARIANT_CLASS_ARRAY) {
-+        GVariantIter iter;
-+        const gchar *engine_name = NULL;
-+        g_variant_iter_init (&iter, variant);
-+        g_variant_iter_loop (&iter, "&s", &engine_name);
-+        if (g_strcmp0 (engine_name, "ibus_null_engine") == 0) {
-+            g_variant_unref (variant);
-+            variant = NULL;
-+        }
-+    }
-+    if (variant == NULL) {
-+        /* Set LANG_RELATIVE mode for the initial login */
-+        preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE;
-+        variant = g_variant_ref_sink (g_variant_new ("i", preload_engine_mode));
-+        ibus_config_set_value_async (ibus->config, "general",
-+                                     "preload_engine_mode", variant,
-+                                     -1,
-+                                     NULL,
-+                                     _config_set_value_done,
-+                                     variant);
-+        return preload_engine_mode;
-+    } else {
-+        g_variant_unref (variant);
-+    }
-+
-+    variant = ibus_config_get_value (ibus->config, "general",
-+                                     "preload_engine_mode");
-+    if (variant != NULL) {
-+        if (g_variant_classify (variant) == G_VARIANT_CLASS_INT32) {
-+            preload_engine_mode = g_variant_get_int32 (variant);
-+        }
-+        g_variant_unref (variant);
-+    }
-+
-+    return preload_engine_mode;
-+}
-+#endif
-+
-+static int
-+_compare_engine_list_value (GVariant *value_a, GVariant *value_b)
-+{
-+    GVariant *value;
-+    GVariantIter iter;
-+    const gchar *engine_name = NULL;
-+    gchar *concat_engine_names;
-+    gchar *concat_engine_names_a = NULL;
-+    gchar *concat_engine_names_b = NULL;
-+    int retval = 0;
-+
-+    value = value_a;
-+    concat_engine_names = NULL;
-+    if (value != NULL && g_variant_classify (value) == G_VARIANT_CLASS_ARRAY) {
-+        g_variant_iter_init (&iter, value);
-+        while (g_variant_iter_loop (&iter, "&s", &engine_name)) {
-+            gchar *tmp = g_strdup_printf ("%s::%s",
-+                                          concat_engine_names ? concat_engine_names : "",
-+                                          engine_name ? engine_name : "");
-+            g_free (concat_engine_names);
-+            concat_engine_names = tmp;
-+        }
-+    }
-+    concat_engine_names_a = concat_engine_names;
-+
-+    value = value_b;
-+    concat_engine_names = NULL;
-+    if (value != NULL && g_variant_classify (value) == G_VARIANT_CLASS_ARRAY) {
-+        g_variant_iter_init (&iter, value);
-+        while (g_variant_iter_loop (&iter, "&s", &engine_name)) {
-+            gchar *tmp = g_strdup_printf ("%s::%s",
-+                                          concat_engine_names ? concat_engine_names : "",
-+                                          engine_name ? engine_name : "");
-+            g_free (concat_engine_names);
-+            concat_engine_names = tmp;
-+        }
-+    }
-+    concat_engine_names_b = concat_engine_names;
-+
-+    retval = g_strcmp0 (concat_engine_names_a, concat_engine_names_b);
-+    g_free (concat_engine_names_a);
-+    g_free (concat_engine_names_b);
-+    return retval;
-+}
-+
-+static void
-+_preload_engines_config_get_value_done (GObject      *object,
-+                                        GAsyncResult *res,
-+                                        gpointer      user_data)
-+{
-+    IBusConfig *config = (IBusConfig *) object;
-+    GVariant *new_value = (GVariant *) user_data;
-+    GVariant *value = NULL;
-+    GError *error = NULL;
-+
-+    g_assert (IBUS_IS_CONFIG (config));
-+
-+    value = ibus_config_get_value_async_finish (config, res, &error);
-+    if (error) {
-+        g_error_free (error);
-+    }
-+    if (_compare_engine_list_value (value, new_value) != 0) {
-+        ibus_config_set_value_async (config, "general",
-+                                     "preload_engines", new_value,
-+                                     -1,
-+                                     NULL,
-+                                     _config_set_value_done,
-+                                     new_value);
-+    } else if (new_value) {
-+        g_variant_unref (new_value);
-+    }
-+    if (value) {
-+        g_variant_unref (value);
-+    }
-+}
-+
-+static void
-+_set_preload_engines (BusIBusImpl *ibus,
-+                      GVariant    *value)
-+{
-+    GList *engine_list = NULL;
-+
-+    g_assert (BUS_IS_IBUS_IMPL (ibus));
-+
-+    g_list_foreach (ibus->engine_list, (GFunc) g_object_unref, NULL);
-+    g_list_free (ibus->engine_list);
-+
-+    if (value != NULL && g_variant_classify (value) == G_VARIANT_CLASS_ARRAY) {
-+        GVariantIter iter;
-+        g_variant_iter_init (&iter, value);
-+        const gchar *engine_name = NULL;
-+        while (g_variant_iter_loop (&iter, "&s", &engine_name)) {
-+            IBusEngineDesc *engine = bus_registry_find_engine_by_name (ibus->registry, engine_name);
-+            if (engine == NULL || g_list_find (engine_list, engine) != NULL)
-+                continue;
-+            engine_list = g_list_append (engine_list, engine);
-+        }
-+
-+        if (engine_list != NULL &&
-+            ibus->config != NULL) {
-+            /* sync function will effects the startup performance.
-+             * We'd always like to save the value so that ibus-setup
-+             * get the updated engine list. */
-+            ibus_config_get_value_async (ibus->config, "general",
-+                                         "preload_engines",
-+                                         -1,
-+                                         NULL,
-+                                         _preload_engines_config_get_value_done,
-+                                         g_variant_ref_sink (value));
-+        } else {
-+            /* We don't update preload_engines with an empty string for safety.
-+             * Just unref the floating value. */
-+            g_variant_unref (value);
-+        }
-+    } else if (value != NULL) {
-+        g_variant_unref (value);
-+    }
-+
-+    g_list_foreach (engine_list, (GFunc) g_object_ref, NULL);
-+    ibus->engine_list = engine_list;
-+
-+    if (ibus->engine_list) {
-+        BusComponent *component = bus_component_from_engine_desc ((IBusEngineDesc *) ibus->engine_list->data);
-+        if (component && !bus_component_is_running (component)) {
-+            bus_component_start (component, g_verbose);
-+        }
-+    }
-+
-+    bus_ibus_impl_check_global_engine (ibus);
-+    bus_ibus_impl_update_engines_hotkey_profile (ibus);
-+}
-+
-+#ifndef OS_CHROMEOS
-+static void
-+_set_language_relative_preload_engines (BusIBusImpl *ibus)
-+{
-+    gchar *lang = NULL;
-+    gchar *p = NULL;
-+    GList *engines = NULL;
-+    GList *list;
-+    GVariantBuilder builder;
-+
-+    g_assert (BUS_IS_IBUS_IMPL (ibus));
-+
-+    /* The setlocale call first checks LC_ALL. If it's not available, checks
-+     * LC_CTYPE. If it's also not available, checks LANG. */
-+    lang = g_strdup (setlocale (LC_CTYPE, NULL));
-+    if (lang == NULL) {
-+        return;
-+    }
-+
-+    p = index (lang, '.');
-+    if (p) {
-+        *p = '\0';
-+    }
-+
-+    engines = bus_registry_get_engines_by_language (ibus->registry, lang);
-+    if (engines == NULL) {
-+        p = index (lang, '_');
-+        if (p) {
-+            *p = '\0';
-+            engines = bus_registry_get_engines_by_language (ibus->registry, lang);
-+        }
-+    }
-+    g_free (lang);
-+
-+    /* sort engines by rank */
-+    engines = g_list_sort (engines, (GCompareFunc) _engine_desc_cmp);
-+
-+    g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
-+    for (list = engines; list != NULL; list = list->next) {
-+        IBusEngineDesc *desc = (IBusEngineDesc *)list->data;
-+        /* ignore engines with rank <== 0 */
-+        if (ibus_engine_desc_get_rank (desc) > 0)
-+            g_variant_builder_add (&builder, "s", ibus_engine_desc_get_name (desc));
-+    }
-+    _set_preload_engines (ibus, g_variant_builder_end (&builder));
-+    g_list_free (engines);
-+}
-+#endif
-+
-+static void
- bus_ibus_impl_set_hotkey (BusIBusImpl *ibus,
-                           GQuark       hotkey,
-                           GVariant    *value)
-@@ -392,35 +658,50 @@ static void
- bus_ibus_impl_set_preload_engines (BusIBusImpl *ibus,
-                                    GVariant    *value)
- {
--    GList *engine_list = NULL;
--
--    g_list_foreach (ibus->engine_list, (GFunc) g_object_unref, NULL);
--    g_list_free (ibus->engine_list);
-+#ifndef OS_CHROMEOS
-+    gint preload_engine_mode = _get_config_preload_engine_mode (ibus);
- 
--    if (value != NULL && g_variant_classify (value) == G_VARIANT_CLASS_ARRAY) {
--        GVariantIter iter;
--        g_variant_iter_init (&iter, value);
--        const gchar *engine_name = NULL;
--        while (g_variant_iter_loop (&iter, "&s", &engine_name)) {
--            IBusEngineDesc *engine = bus_registry_find_engine_by_name (ibus->registry, engine_name);
--            if (engine == NULL || g_list_find (engine_list, engine) != NULL)
--                continue;
--            engine_list = g_list_append (engine_list, engine);
-+    if (preload_engine_mode == IBUS_PRELOAD_ENGINE_MODE_USER) {
-+        if (value == NULL) {
-+            _set_language_relative_preload_engines (ibus);
-+        } else {
-+            _set_preload_engines (ibus, value);
-         }
-     }
-+#else
-+    _set_preload_engines (ibus, value);
-+#endif
-+}
- 
--    g_list_foreach (engine_list, (GFunc) g_object_ref, NULL);
--    ibus->engine_list = engine_list;
-+/**
-+ * bus_ibus_impl_set_preload_engine_mode:
-+ *
-+ * A function to be called when "preload_engine_mode" config is updated.
-+ */
-+static void
-+bus_ibus_impl_set_preload_engine_mode (BusIBusImpl *ibus,
-+                                       GVariant    *value)
-+{
-+#ifndef OS_CHROMEOS
-+    gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_USER;
- 
--    if (ibus->engine_list) {
--        BusComponent *component = bus_component_from_engine_desc ((IBusEngineDesc *) ibus->engine_list->data);
--        if (component && !bus_component_is_running (component)) {
--            bus_component_start (component, g_verbose);
--        }
-+    /* bus_ibus_impl_reload_config() sets value = NULL.
-+     * bus_ibus_impl_reload_config() is always called when
-+     * RequestName signal is sent so it is good to get the gconf value
-+     * again when value == NULL.
-+     */
-+    if (value != NULL && g_variant_classify (value) == G_VARIANT_CLASS_INT32) {
-+        preload_engine_mode = g_variant_get_int32 (value);
-+    } else {
-+        preload_engine_mode = _get_config_preload_engine_mode (ibus);
-     }
- 
--    bus_ibus_impl_check_global_engine (ibus);
--    bus_ibus_impl_update_engines_hotkey_profile (ibus);
-+    if (preload_engine_mode == IBUS_PRELOAD_ENGINE_MODE_USER) {
-+        return;
-+    }
-+
-+    _set_language_relative_preload_engines (ibus);
-+#endif
- }
- 
- /**
-@@ -501,89 +782,47 @@ bus_ibus_impl_set_use_global_engine (BusIBusImpl *ibus,
-     }
- }
- 
--#ifndef OS_CHROMEOS
--static gint
--_engine_desc_cmp (IBusEngineDesc *desc1,
--                  IBusEngineDesc *desc2)
--{
--    return - ((gint) ibus_engine_desc_get_rank (desc1)) +
--              ((gint) ibus_engine_desc_get_rank (desc2));
--}
--#endif
--
- /**
-  * bus_ibus_impl_set_default_preload_engines:
-  *
-- * If the "preload_engines" config variable is not set yet, set the default value which is determined based on a current locale.
-+ * bus_ibus_impl_set_default_preload_engines handles the gconf value
-+ * /desktop/ibus/general/preload_engines and preload_engine_mode.
-+ * The idea is, if users don't customize the preload_engines with ibus-setup,
-+ * users would prefer to load the system default engines again by login.
-+ * The gconf value 'preload_engine_mode' is
-+ * IBUS_PRELOAD_ENGINE_MODE_USER by default but set
-+ * IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE for the initial login.
-+ * If preload_engine_mode is IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE,
-+ * ibus-daemon loads the system preload engines by langs.
-+ * If preload_engine_mode is IBUS_PRELOAD_ENGINE_MODE_USER,
-+ * ibus-daemon do not update the gconf value preload_engines.
-+ * On the other hand, if users enable the customized engine checkbutton
-+ * on ibus-setup, ibus-setup sets 'preload_engine_mode' as
-+ * IBUS_PRELOAD_ENGINE_MODE_USER and users can customize the value
-+ * 'preload_engines'.
-  */
- static void
- bus_ibus_impl_set_default_preload_engines (BusIBusImpl *ibus)
- {
- #ifndef OS_CHROMEOS
--    g_assert (BUS_IS_IBUS_IMPL (ibus));
--
-     static gboolean done = FALSE;
-+    gint preload_engine_mode = IBUS_PRELOAD_ENGINE_MODE_USER;
-+
-+    g_assert (BUS_IS_IBUS_IMPL (ibus));
- 
-     if (done || ibus->config == NULL) {
-         return;
-     }
- 
--    GVariant *variant = ibus_config_get_value (ibus->config, "general", "preload_engines");
--    if (variant != NULL) {
-+    preload_engine_mode = _get_config_preload_engine_mode (ibus);
-+
-+    if (preload_engine_mode == IBUS_PRELOAD_ENGINE_MODE_USER) {
-         done = TRUE;
--        g_variant_unref (variant);
-         return;
-     }
- 
-     done = TRUE;
--
--    /* The setlocale call first checks LC_ALL. If it's not available, checks
--     * LC_CTYPE. If it's also not available, checks LANG. */
--    gchar *lang = g_strdup (setlocale (LC_CTYPE, NULL));
--    if (lang == NULL) {
--        return;
--    }
--
--    gchar *p = index (lang, '.');
--    if (p) {
--        *p = '\0';
--    }
--
--    GList *engines = bus_registry_get_engines_by_language (ibus->registry, lang);
--    if (engines == NULL) {
--        p = index (lang, '_');
--        if (p) {
--            *p = '\0';
--            engines = bus_registry_get_engines_by_language (ibus->registry, lang);
--        }
--    }
--    g_free (lang);
--
--    /* sort engines by rank */
--    engines = g_list_sort (engines, (GCompareFunc) _engine_desc_cmp);
--
--    GVariantBuilder builder;
--    g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
--    GList *list;
--    for (list = engines; list != NULL; list = list->next) {
--        IBusEngineDesc *desc = (IBusEngineDesc *) list->data;
--        /* ignore engines with rank <= 0 */
--        if (ibus_engine_desc_get_rank (desc) > 0)
--            g_variant_builder_add (&builder, "s", ibus_engine_desc_get_name (desc));
--    }
--
--    GVariant *value = g_variant_builder_end (&builder);
--    if (value != NULL) {
--        if (g_variant_n_children (value) > 0) {
--            ibus_config_set_value (ibus->config,
--                                   "general", "preload_engines", value);
--        } else {
--            /* We don't update preload_engines with an empty string for safety.
--             * Just unref the floating value. */
--            g_variant_unref (value);
--        }
--    }
--    g_list_free (engines);
-+    _set_language_relative_preload_engines (ibus);
- #endif
- }
- 
-@@ -599,6 +838,7 @@ const static struct {
-     { "general/hotkey", "next_engine_in_menu",   bus_ibus_impl_set_next_engine_in_menu },
-     { "general/hotkey", "previous_engine",       bus_ibus_impl_set_previous_engine },
-     { "general", "preload_engines",              bus_ibus_impl_set_preload_engines },
-+    { "general", "preload_engine_mode",          bus_ibus_impl_set_preload_engine_mode },
-     { "general", "use_system_keyboard_layout",   bus_ibus_impl_set_use_sys_layout },
-     { "general", "use_global_engine",            bus_ibus_impl_set_use_global_engine },
-     { "general", "embed_preedit_text",           bus_ibus_impl_set_embed_preedit_text },
 diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in
-index e0a6a37..2418c95 100644
+index 05c0174..8ca33ac 100644
 --- a/data/ibus.schemas.in
 +++ b/data/ibus.schemas.in
-@@ -6,7 +6,7 @@
-       <applyto>/desktop/ibus/general/preload_engines</applyto>
-       <owner>ibus</owner>
-       <type>list</type>
--      <default>[]</default>
-+      <default>[ibus_null_engine]</default>
-       <list_type>string</list_type>
-       <locale name="C">
-         <short>Preload engines</short>
-@@ -14,6 +14,19 @@
-       </locale>
-     </schema>
+@@ -2,6 +2,30 @@
+ <gconfschemafile>
+   <schemalist>
      <schema>
 +      <key>/schemas/desktop/ibus/general/preload_engine_mode</key>
 +      <applyto>/desktop/ibus/general/preload_engine_mode</applyto>
@@ -526,125 +39,80 @@ index e0a6a37..2418c95 100644
 +      <default>0</default>
 +      <locale name="C">
 +        <short>Preload engine mode</short>
-+           <long>Preload engines are loaded with this mode.
-+                 0 = user customized engines.
-+                 1 = language related engines.</long>
++            <long>Preload engines are loaded with this mode.
++                  0 = user customized engines.
++                  1 = language related engines.</long>
 +      </locale>
 +    </schema>
 +    <schema>
-       <key>/schemas/desktop/ibus/general/hotkey/trigger</key>
-       <applyto>/desktop/ibus/general/hotkey/trigger</applyto>
++      <key>/schemas/desktop/ibus/general/preload_engines_inited</key>
++      <applyto>/desktop/ibus/general/preload_engines_inited</applyto>
++      <owner>ibus</owner>
++      <type>bool</type>
++      <default>false</default>
++      <locale name="C">
++        <short>The key preload_engines is initialized</short>
++            <long>The key preload_engines is initialized</long>
++      </locale>
++    </schema>
++    <schema>
+       <key>/schemas/desktop/ibus/general/preload_engines</key>
+       <applyto>/desktop/ibus/general/preload_engines</applyto>
        <owner>ibus</owner>
-diff --git a/ibus/common.py b/ibus/common.py
-index 6483aae..127ed93 100644
---- a/ibus/common.py
-+++ b/ibus/common.py
-@@ -40,6 +40,8 @@ __all__ = (
-         "BUS_REQUEST_NAME_REPLY_IN_QUEUE",
-         "BUS_REQUEST_NAME_REPLY_EXISTS",
-         "BUS_REQUEST_NAME_REPLY_ALREADY_OWNER",
-+        "PRELOAD_ENGINE_MODE_USER",
-+        "PRELOAD_ENGINE_MODE_LANG_RELATIVE",
-         "default_reply_handler",
-         "default_error_handler",
-         "DEFAULT_ASYNC_HANDLERS",
-@@ -150,6 +152,10 @@ BUS_REQUEST_NAME_REPLY_IN_QUEUE      = 2
- BUS_REQUEST_NAME_REPLY_EXISTS        = 3
- BUS_REQUEST_NAME_REPLY_ALREADY_OWNER = 4
- 
-+# define preload engine mode
-+PRELOAD_ENGINE_MODE_USER          = 0
-+PRELOAD_ENGINE_MODE_LANG_RELATIVE = 1
-+
- def default_reply_handler( *args):
-     pass
- 
 diff --git a/setup/main.py b/setup/main.py
-index 97e05a4..7d734ae 100644
+index 9638da0..132e9f4 100644
 --- a/setup/main.py
 +++ b/setup/main.py
-@@ -92,6 +92,7 @@ class Setup(object):
-         # keyboard shortcut
-         # trigger
-         self.__config = self.__bus.get_config()
-+        self.__config.connect("value-changed", self.__config_value_changed_cb)
-         shortcuts = self.__config.get_value(
-                         "general/hotkey", "trigger",
-                         ibus.CONFIG_GENERAL_SHORTCUT_TRIGGER_DEFAULT)
-@@ -213,15 +214,22 @@ class Setup(object):
-         self.__checkbutton_use_global_engine.connect("toggled", self.__checkbutton_use_global_engine_toggled_cb)
+@@ -181,6 +181,20 @@ class Setup(object):
+         self.__checkbutton_use_global_engine.connect("toggled",
+                 self.__checkbutton_use_global_engine_toggled_cb)
  
-         # init engine page
-+        preload_engine_mode = self.__config.get_value("general",
-+                                                      "preload_engine_mode",
-+                                                      ibus.common.PRELOAD_ENGINE_MODE_USER)
++        # set preload mode
++        preload_engine_mode = IBus.PreloadEngineMode.USER
++        variant = self.__config.get_value("general", "preload_engine_mode")
++        if variant != None:
++            preload_engine_mode = variant.get_int32()
 +        button = self.__builder.get_object("checkbutton_preload_engine_mode")
-+        if preload_engine_mode == ibus.common.PRELOAD_ENGINE_MODE_USER:
++        if preload_engine_mode == IBus.PreloadEngineMode.USER:
 +            button.set_active(True)
 +            self.__builder.get_object("hbox_customize_active_input_methods").set_sensitive(True)
 +        else:
 +            button.set_active(False)
 +            self.__builder.get_object("hbox_customize_active_input_methods").set_sensitive(False)
 +        button.connect("toggled", self.__checkbutton_preload_engine_mode_toggled_cb)
++
+         # init engine page
          self.__engines = self.__bus.list_engines()
-         self.__combobox = self.__builder.get_object("combobox_engines")
-         self.__combobox.set_engines(self.__engines)
+         value = self.__config.get_value("general", "load_xkb_layouts")
+@@ -245,6 +259,7 @@ class Setup(object):
+                 self.__checkbutton_auto_start_toggled_cb)
  
--        tmp_dict = {}
--        for e in self.__engines:
--            tmp_dict[e.name] = e
--        engine_names = self.__config.get_value("general", "preload_engines", [])
--        engines = [tmp_dict[name] for name in engine_names if name in tmp_dict]
-+        engines = self.__bus.list_active_engines()
+         self.__config = self.__bus.get_config()
++        self.__config.connect("value-changed", self.__config_value_changed_cb)
  
-         self.__treeview = self.__builder.get_object("treeview_engines")
-         self.__treeview.set_engines(engines)
-@@ -251,7 +259,8 @@ class Setup(object):
+         self.__init_hotkey()
+         self.__init_panel()
+@@ -253,8 +268,8 @@ class Setup(object):
      def __combobox_notify_active_engine_cb(self, combobox, property):
          engine = self.__combobox.get_active_engine()
          button = self.__builder.get_object("button_engine_add")
--        button.set_sensitive(engine != None and engine not in self.__treeview.get_engines())
+-        button.set_sensitive(
+-                engine != None and engine not in self.__treeview.get_engines())
 +        button.set_sensitive(engine != None and \
-+                engine.name not in map(lambda e: e.name, self.__treeview.get_engines()))
++                engine.get_name() not in map(lambda e: e.get_name(), self.__treeview.get_engines()))
  
      def __get_engine_setup_exec_args(self, engine):
          args = []
-@@ -293,6 +302,26 @@ class Setup(object):
-             engine_names = map(lambda e: e.name, engines)
-             self.__config.set_list("general", "preload_engines", engine_names, "s")
- 
-+    def __get_engine_descs_from_names(self, engine_names):
-+        tmp_dict = {}
-+        for e in self.__engines:
-+            tmp_dict[e.name] = e
-+        engines = [tmp_dict[name] for name in engine_names if name in tmp_dict]
-+        return engines
-+
-+    def __compare_descs(self, engines_a, engines_b):
-+        engines = engines_a
-+        concat_engine_names = ""
-+        for engine in engines:
-+            concat_engine_names = "%s::%s" % (concat_engine_names, engine.name)
-+        concat_engine_names_a = concat_engine_names
-+        engines = engines_b
-+        concat_engine_names = ""
-+        for engine in engines:
-+            concat_engine_names = "%s::%s" % (concat_engine_names, engine.name)
-+        concat_engine_names_b = concat_engine_names
-+        return concat_engine_names_a == concat_engine_names_b
-+
-     def __button_engine_add_cb(self, button):
-         engine = self.__combobox.get_active_engine()
-         self.__treeview.append_engine(engine)
-@@ -322,6 +351,32 @@ class Setup(object):
+@@ -333,6 +348,34 @@ class Setup(object):
              del self.__engine_setup_exec_list[name]
          self.__engine_setup_exec_list[name] = os.spawnl(os.P_NOWAIT, *args)
  
 +    def __checkbutton_preload_engine_mode_toggled_cb(self, button):
 +        if button.get_active():
++            variant = GLib.Variant.new_int32(IBus.PreloadEngineMode.USER)
 +            self.__config.set_value("general",
 +                                    "preload_engine_mode",
-+                                    ibus.common.PRELOAD_ENGINE_MODE_USER)
++                                    variant)
 +            self.__builder.get_object("hbox_customize_active_input_methods").set_sensitive(True)
 +            self.__treeview.notify("engines")
 +        else:
@@ -652,41 +120,50 @@ index 97e05a4..7d734ae 100644
 +                        "cleared immediately and the list will be " \
 +                        "configured by the login language every time. " \
 +                        "Do you agree with this?")
-+            dlg = gtk.MessageDialog(type = gtk.MESSAGE_QUESTION,
-+                    buttons = gtk.BUTTONS_YES_NO,
++            dlg = Gtk.MessageDialog(type = Gtk.MessageType.QUESTION,
++                    buttons = Gtk.ButtonsType.YES_NO,
 +                    message_format = message)
 +            id = dlg.run()
 +            dlg.destroy()
 +            self.__flush_gtk_events()
-+            if id != gtk.RESPONSE_YES:
++            if id != Gtk.ResponseType.YES:
 +                button.set_active(True)
 +                return
++            variant = GLib.Variant.new_int32(IBus.PreloadEngineMode.LANG_RELATIVE)
 +            self.__config.set_value("general",
 +                                    "preload_engine_mode",
-+                                    ibus.common.PRELOAD_ENGINE_MODE_LANG_RELATIVE)
++                                    variant)
 +            self.__builder.get_object("hbox_customize_active_input_methods").set_sensitive(False)
 +
      def __init_bus(self):
-         try:
-             self.__bus = ibus.Bus()
-@@ -512,7 +567,11 @@ class Setup(object):
+         self.__bus = IBus.Bus()
+         if self.__bus.is_connected():
+@@ -543,8 +586,18 @@ class Setup(object):
+         value = GLib.Variant.new_boolean(value)
          self.__config.set_value("general", "use_global_engine", value)
  
-     def __config_value_changed_cb(self, bus, section, name, value):
+-    def __config_value_changed_cb(self, bus, section, name, value):
 -        pass
++    def __config_value_changed_cb(self, bus, section, name, variant):
 +        if section == 'general' and name == 'preload_engines':
++            value = []
++            if variant != None:
++                value = variant.dup_strv()[0]
 +            engines = self.__get_engine_descs_from_names(value)
 +            current_engines = self.__treeview.get_engines()
-+            if self.__compare_descs(engines, current_engines) == False:
++            engines_csv = str.join(',', map(lambda e: e.get_name(), engines))
++            current_engines_csv = \
++                    str.join(',', map(lambda e: e.get_name(), current_engines))
++            if engines_csv != current_engines_csv:
 +                self.__treeview.set_engines(engines)
  
      def __config_reloaded_cb(self, bus):
          pass
 diff --git a/setup/setup.ui b/setup/setup.ui
-index 57cb597..b2ceef2 100644
+index e37cb32..fec1646 100644
 --- a/setup/setup.ui
 +++ b/setup/setup.ui
-@@ -582,7 +582,22 @@
+@@ -585,7 +585,22 @@
                      <property name="visible">True</property>
                      <property name="orientation">vertical</property>
                      <child>
@@ -710,7 +187,7 @@ index 57cb597..b2ceef2 100644
                          <property name="visible">True</property>
                          <child>
                            <object class="GtkAlignment" id="alignment6">
-@@ -749,7 +764,7 @@
+@@ -752,7 +767,7 @@
                          </child>
                        </object>
                        <packing>
@@ -719,7 +196,7 @@ index 57cb597..b2ceef2 100644
                        </packing>
                      </child>
                      <child>
-@@ -788,7 +803,7 @@ You may use up/down buttons to change it.&lt;/i&gt;&lt;/small&gt;</property>
+@@ -791,7 +806,7 @@ You may use up/down buttons to change it.&lt;/i&gt;&lt;/small&gt;</property>
                        </object>
                        <packing>
                          <property name="expand">False</property>
@@ -749,6 +226,168 @@ index d916265..422eb84 100644
   * IBusRectangle:
   * @x: x coordinate.
   * @y: y coordinate.
+diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
+index f8805e0..7bd0d93 100644
+--- a/ui/gtk3/panel.vala
++++ b/ui/gtk3/panel.vala
+@@ -187,6 +187,8 @@ class Panel : IBus.PanelService {
+         if (m_config != null) {
+             m_config.value_changed.connect(config_value_changed_cb);
+             m_config.watch("general", "preload_engines");
++            m_config.watch("general", "preload_engines_inited");
++            m_config.watch("general", "preload_engine_mode");
+             m_config.watch("general", "engines_order");
+             m_config.watch("panel", "custom_font");
+             m_config.watch("panel", "use_custom_font");
+@@ -246,7 +248,136 @@ class Panel : IBus.PanelService {
+             init_gkbd();
+         }
+ 
++        GLib.Variant var_engines = 
++                m_config.get_value("general", "preload_engines");
++        string[] preload_engines = {};
++
++        if (var_engines != null) {
++            preload_engines = var_engines.dup_strv();
++        }
++
++        bool preload_engines_inited = false;
++        GLib.Variant var_preload_engines_inited =
++                m_config.get_value("general", "preload_engines_inited");
++
++        if (var_preload_engines_inited != null) {
++            preload_engines_inited = var_preload_engines_inited.get_boolean();
++        }
++
++        // Set preload_engines_inited = true for back compatibility
++        if (preload_engines.length != 0 && !preload_engines_inited) {
++                preload_engines_inited = true;
++                m_config.set_value("general",
++                                   "preload_engines_inited",
++                                   new GLib.Variant.boolean(true));
++        }
++
+         update_xkb_engines();
++
++        // Before update preload_engine_mode, update_xkb_engines() is called
++        // because config_value_changed_cb() calls update_im_engines().
++        if (!preload_engines_inited) {
++            GLib.Variant variant = new GLib.Variant.int32(
++                    IBus.PreloadEngineMode.LANG_RELATIVE);
++            m_config.set_value("general",
++                               "preload_engine_mode",
++                               variant);
++        }
++
++        update_im_engines();
++
++        if (!preload_engines_inited) {
++            m_config.set_value("general",
++                               "preload_engines_inited",
++                               new GLib.Variant.boolean(true));
++        }
++    }
++
++    private bool set_lang_relative_preload_engines() {
++        string locale = Intl.setlocale(LocaleCategory.CTYPE, null);
++
++        if (locale == null) {
++            locale = "C";
++        }
++
++        string lang = locale.split(".")[0];
++        GLib.List<IBus.EngineDesc> engines = m_bus.list_engines();
++        string[] im_engines = {};
++
++        for (unowned GLib.List<IBus.EngineDesc> p = engines;
++             p != null;
++             p = p.next) {
++            unowned IBus.EngineDesc engine = p.data;
++            if (engine.get_language() == lang &&
++                engine.get_rank() > 0) {
++                im_engines += engine.get_name();
++            }
++        }
++
++        lang = lang.split("_")[0];
++        if (im_engines.length == 0) {
++            for (unowned GLib.List<IBus.EngineDesc> p = engines;
++                 p != null;
++                 p = p.next) {
++                unowned IBus.EngineDesc engine = p.data;
++                if (engine.get_language() == lang &&
++                    engine.get_rank() > 0) {
++                    im_engines += engine.get_name();
++                }
++            }
++        }
++
++        if (im_engines.length == 0) {
++            return false;
++        }
++
++        GLib.Variant var_engines = 
++                m_config.get_value("general", "preload_engines");
++        string[] orig_preload_engines = {};
++        string[] preload_engines = {};
++
++        if (var_engines != null) {
++            orig_preload_engines = var_engines.dup_strv();
++        }
++
++        // clear input method engines
++        foreach (string name in orig_preload_engines) {
++            if (name.ascii_ncasecmp("xkb:", 4) != 0) {
++                continue;
++            }
++            preload_engines += name;
++        }
++
++        foreach (string name in im_engines) {
++            if (!(name in preload_engines)) {
++                preload_engines += name;
++            }
++        }
++
++        if ("".joinv(",", orig_preload_engines) !=
++            "".joinv(",", preload_engines)) {
++            m_config.set_value("general",
++                               "preload_engines",
++                               new GLib.Variant.strv(preload_engines));
++        }
++
++        return true;
++    }
++
++    private void update_im_engines() {
++        int preload_engine_mode = IBus.PreloadEngineMode.USER;
++        GLib.Variant var_preload_engine_mode =
++                m_config.get_value("general", "preload_engine_mode");
++
++        if (var_preload_engine_mode != null) {
++            preload_engine_mode = var_preload_engine_mode.get_int32();
++        }
++
++        if (preload_engine_mode == IBus.PreloadEngineMode.USER) {
++            return;
++        }
++
++        set_lang_relative_preload_engines();
+     }
+ 
+     private void update_xkb_engines() {
+@@ -421,6 +552,11 @@ class Panel : IBus.PanelService {
+                                          string section,
+                                          string name,
+                                          Variant variant) {
++        if (section == "general" && name == "preload_engine_mode") {
++            update_im_engines();
++            return;
++        }
++
+         if (section == "general" && name == "preload_engines") {
+             update_engines(variant, null);
+             return;
 -- 
-1.7.7.4
+1.7.9.1
 
diff --git a/ibus-541492-xkb.patch b/ibus-541492-xkb.patch
index 4d135f5..352ce4e 100644
--- a/ibus-541492-xkb.patch
+++ b/ibus-541492-xkb.patch
@@ -1,11 +1,11 @@
-From 571e4ab3e28acb90466ac58e3fe9f4efc4b8ba0e Mon Sep 17 00:00:00 2001
+From c58730dd0d9c161a7824105d320f60af769e1f05 Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1 at gmail.com>
-Date: Sun, 4 Mar 2012 22:16:01 +0900
+Date: Fri, 16 Mar 2012 20:45:03 +0900
 Subject: [PATCH] Add ibus-xkb and libgnomekbd.
 
 ---
  configure.ac                  |   59 +++++
- data/ibus.schemas.in          |   58 +++++
+ data/ibus.schemas.in          |   60 +++++-
  engine/Makefile.am            |   22 ++
  engine/ibus-xkb-main.c        |  111 +++++++++
  engine/main.vala              |   86 +++++++
@@ -14,30 +14,32 @@ Subject: [PATCH] Add ibus-xkb and libgnomekbd.
  engine/xkblib.h               |   41 ++++
  ibus-1.0.pc.in                |    4 +
  setup/enginecombobox.py       |    6 +-
- setup/main.py                 |   17 ++-
+ setup/main.py                 |   28 ++-
  src/Makefile.am               |    5 +
  src/ibus.h                    |    1 +
  src/ibusxkbxml.c              |  466 ++++++++++++++++++++++++++++++++++++
  src/ibusxkbxml.h              |  187 +++++++++++++++
  ui/gtk3/Gkbd-3.0.metadata     |    1 +
- ui/gtk3/Makefile.am           |   45 ++++
+ ui/gtk3/Makefile.am           |   48 ++++
+ ui/gtk3/Xkl-1.0.metadata      |    3 +
  ui/gtk3/gkbdlayout.vala.false |   63 +++++
  ui/gtk3/gkbdlayout.vala.true  |  111 +++++++++
  ui/gtk3/panel.vala            |  275 ++++++++++++++++++++--
  ui/gtk3/xkblayout.vala        |  466 ++++++++++++++++++++++++++++++++++++
- 21 files changed, 2331 insertions(+), 551 deletions(-)
+ 22 files changed, 2346 insertions(+), 555 deletions(-)
  create mode 100644 engine/ibus-xkb-main.c
  create mode 100644 engine/xkblib.c
  create mode 100644 engine/xkblib.h
  create mode 100644 src/ibusxkbxml.c
  create mode 100644 src/ibusxkbxml.h
  create mode 100644 ui/gtk3/Gkbd-3.0.metadata
+ create mode 100644 ui/gtk3/Xkl-1.0.metadata
  create mode 100644 ui/gtk3/gkbdlayout.vala.false
  create mode 100644 ui/gtk3/gkbdlayout.vala.true
  create mode 100644 ui/gtk3/xkblayout.vala
 
 diff --git a/configure.ac b/configure.ac
-index aeb22b4..a516c94 100644
+index 1c4b283..596b30e 100644
 --- a/configure.ac
 +++ b/configure.ac
 @@ -249,6 +249,63 @@ else
@@ -113,28 +115,30 @@ index aeb22b4..a516c94 100644
  ])
  
 diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in
-index 53ba05c..3ca0fbc 100644
+index 53ba05c..05c0174 100644
 --- a/data/ibus.schemas.in
 +++ b/data/ibus.schemas.in
-@@ -38,6 +38,18 @@
-       </locale>
-     </schema>
-     <schema>
-+      <key>/schemas/desktop/ibus/general/hotkey/trigger-accel</key>
-+      <applyto>/desktop/ibus/general/hotkey/trigger-accel</applyto>
+@@ -34,7 +34,19 @@
+       <default>[Control+space,Zenkaku_Hankaku,Alt+Kanji,Alt+grave,Hangul,Alt+Release+Alt_R]</default>
+       <locale name="C">
+         <short>Trigger shortcut keys</short>
+-	    <long>The shortcut keys for turning input method on or off</long>
++            <long>The shortcut keys for turning input method on or off</long>
++      </locale>
++    </schema>
++    <schema>
++      <key>/schemas/desktop/ibus/general/hotkey/trigger_accel</key>
++      <applyto>/desktop/ibus/general/hotkey/trigger_accel</applyto>
 +      <owner>ibus</owner>
 +      <type>list</type>
 +      <list_type>string</list_type>
 +      <default>[&lt;Control&gt;space]</default>
 +      <locale name="C">
 +        <short>Trigger shortcut keys for gtk_accelerator_parse</short>
-+	    <long>The shortcut keys for turning input method on or off</long>
-+      </locale>
-+    </schema>
-+    <schema>
-       <key>/schemas/desktop/ibus/general/hotkey/enable_unconditional</key>
-       <applyto>/desktop/ibus/general/hotkey/enable_unconditional</applyto>
-       <owner>ibus</owner>
++            <long>The shortcut keys for turning input method on or off</long>
+       </locale>
+     </schema>
+     <schema>
 @@ -203,6 +215,52 @@
        </locale>
      </schema>
@@ -1405,42 +1409,59 @@ index 8d1424b..0ac7368 100644
          if current_lang in keys:
              keys.remove(current_lang)
 diff --git a/setup/main.py b/setup/main.py
-index 274b25a..e3027a5 100644
+index fdfb33a..9638da0 100644
 --- a/setup/main.py
 +++ b/setup/main.py
-@@ -182,12 +182,25 @@ class Setup(object):
-                 self.__checkbutton_use_global_engine_toggled_cb)
+@@ -183,14 +183,25 @@ class Setup(object):
  
          # init engine page
--        self.__engines = self.__bus.list_engines()
-+        self.__engines = []
+         self.__engines = self.__bus.list_engines()
 +        value = self.__config.get_value("general", "load_xkb_layouts")
 +        load_layouts = []
 +        if value != None:
-+            load_layouts = map(lambda l: str(l), list(value))
++            load_layouts = value.dup_strv()[0]
 +        if len(load_layouts) == 0:
-+            self.__engines = self.__bus.list_engines()
++            engines = self.__engines
 +        else:
-+            for engine in self.__bus.list_engines():
-+                if not engine.props.name.startswith('xkb:'):
-+                    self.__engines.append(engine)
-+                elif engine.props.layout in load_layouts:
-+                    self.__engines.append(engine)
++            engines = []
++            for engine in self.__engines:
++                if not engine.get_name().startswith('xkb:'):
++                    engines.append(engine)
++                elif engine.get_layout() in load_layouts:
++                    engines.append(engine)
 +
          self.__combobox = self.__builder.get_object("combobox_engines")
-         self.__combobox.set_engines(self.__engines)
+-        self.__combobox.set_engines(self.__engines)
++        self.__combobox.set_engines(engines)
  
-         tmp_dict = {}
+-        tmp_dict = {}
 -        for e in self.__engines:
-+        for e in self.__bus.list_engines():
-             tmp_dict[e.get_name()] = e
+-            tmp_dict[e.get_name()] = e
          engine_names = values.get("preload_engines", [])
-         engines = [tmp_dict[name] for name in engine_names if name in tmp_dict]
+-        engines = [tmp_dict[name] for name in engine_names if name in tmp_dict]
++        engines = self.__get_engine_descs_from_names(engine_names)
+ 
+         self.__treeview = self.__builder.get_object("treeview_engines")
+         self.__treeview.set_engines(engines)
+@@ -263,6 +274,13 @@ class Setup(object):
+             args.append(path.basename(setup_path))
+         return args
+ 
++    def __get_engine_descs_from_names(self, engine_names):
++        tmp_dict = {}
++        for e in self.__engines:
++            tmp_dict[e.get_name()] = e
++        engines = [tmp_dict[name] for name in engine_names if name in tmp_dict]
++        return engines
++
+     def __treeview_notify_cb(self, treeview, prop):
+         if prop.name not in ("active-engine", "engines"):
+             return
 diff --git a/src/Makefile.am b/src/Makefile.am
-index b4d0dcf..1631cae 100644
+index b1d1766..29f0d58 100644
 --- a/src/Makefile.am
 +++ b/src/Makefile.am
-@@ -190,6 +190,11 @@ typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
+@@ -194,6 +194,11 @@ typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
  CLEANFILES += $(dist_gir_DATA) $(typelibs_DATA)
  endif
  
@@ -2137,7 +2158,7 @@ index 0000000..661e6fd
 @@ -0,0 +1 @@
 +Configuration cheader_filename="libgnomekbd/gkbd-configuration.h"
 diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am
-index 0fb9d3c..33aaaa3 100644
+index 0fb9d3c..5ccf8b0 100644
 --- a/ui/gtk3/Makefile.am
 +++ b/ui/gtk3/Makefile.am
 @@ -42,6 +42,9 @@ INCLUDES = \
@@ -2161,7 +2182,7 @@ index 0fb9d3c..33aaaa3 100644
  	-Wno-unused-variable \
  	-Wno-unused-but-set-variable \
  	-Wno-unused-function \
-@@ -86,6 +93,7 @@ ibus_ui_gtk3_valas = \
+@@ -86,6 +93,7 @@ ibus_ui_gtk3_SOURCES = \
  	application.vala \
  	candidatearea.vala \
  	candidatepanel.vala \
@@ -2169,15 +2190,15 @@ index 0fb9d3c..33aaaa3 100644
  	handle.vala \
  	iconwidget.vala \
  	keybindingmanager.vala \
-@@ -94,6 +102,7 @@ ibus_ui_gtk3_valas = \
+@@ -94,6 +102,7 @@ ibus_ui_gtk3_SOURCES = \
  	property.vala \
  	separator.vala \
  	switcher.vala \
 +	xkblayout.vala \
+ 	grabkeycode.c \
  	$(NULL)
- ibus_ui_gtk3_vala_cfiles = $(ibus_ui_gtk3_valas:.vala=.c)
  
-@@ -106,12 +115,48 @@ ibus_ui_gtk3_LDADD = \
+@@ -101,12 +110,51 @@ ibus_ui_gtk3_LDADD = \
  	$(AM_LDADD) \
  	$(NULL)
  
@@ -2194,9 +2215,11 @@ index 0fb9d3c..33aaaa3 100644
 +
 +AM_VALAFLAGS += \
 +	--vapidir=. \
++	--metadatadir=. \
 +	--pkg=glib-2.0 \
 +	--pkg=gmodule-2.0 \
 +	--pkg=gkbd \
++	--pkg=Xkl-1.0 \
 +	$(NULL)
 +
 +$(srcdir)/gkbd.vapi:
@@ -2216,7 +2239,6 @@ index 0fb9d3c..33aaaa3 100644
 +	gkbd.vapi \
 +	gkbdlayout.vala \
  	gtkpanel.xml \
- 	$(ibus_ui_gtk3_vala_cfiles) \
  	$(NULL)
  
  EXTRA_DIST = \
@@ -2224,8 +2246,19 @@ index 0fb9d3c..33aaaa3 100644
 +	gkbdlayout.vala.false \
 +	gkbdlayout.vala.true \
  	gtkpanel.xml.in.in \
++	Xkl-1.0.metadata \
  	$(NULL)
  
+ 
+diff --git a/ui/gtk3/Xkl-1.0.metadata b/ui/gtk3/Xkl-1.0.metadata
+new file mode 100644
+index 0000000..4961d0c
+--- /dev/null
++++ b/ui/gtk3/Xkl-1.0.metadata
+@@ -0,0 +1,3 @@
++Xkl cheader_filename="libxklavier/xklavier.h"
++Engine
++    .filter_events.evt ref type="X.Event"
 diff --git a/ui/gtk3/gkbdlayout.vala.false b/ui/gtk3/gkbdlayout.vala.false
 new file mode 100644
 index 0000000..a387de9
@@ -2413,7 +2446,7 @@ index 0000000..adacd81
 +    */
 +}
 diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
-index b83d7e3..2a386a0 100644
+index d927491..f8805e0 100644
 --- a/ui/gtk3/panel.vala
 +++ b/ui/gtk3/panel.vala
 @@ -40,8 +40,16 @@ class Panel : IBus.PanelService {
@@ -2515,20 +2548,24 @@ index b83d7e3..2a386a0 100644
 +        }
      }
  
-     public void set_config(IBus.Config config) {
-@@ -93,8 +152,10 @@ class Panel : IBus.PanelService {
+     private void set_custom_font() {
+@@ -124,12 +183,14 @@ class Panel : IBus.PanelService {
          }
  
          m_config = config;
 +        set_keybinding();
          if (m_config != null) {
              m_config.value_changed.connect(config_value_changed_cb);
+             m_config.watch("general", "preload_engines");
+             m_config.watch("general", "engines_order");
+             m_config.watch("panel", "custom_font");
+             m_config.watch("panel", "use_custom_font");
 +            init_engines_order();
              update_engines(m_config.get_value("general", "preload_engines"),
                             m_config.get_value("general", "engines_order"));
          } else {
-@@ -102,6 +163,192 @@ class Panel : IBus.PanelService {
-         }
+@@ -139,6 +200,192 @@ class Panel : IBus.PanelService {
+         set_custom_font();
      }
  
 +    private void gkbdlayout_changed_cb() {
@@ -2720,7 +2757,7 @@ index b83d7e3..2a386a0 100644
      private void switch_engine(int i, bool force = false) {
          GLib.assert(i >= 0 && i < m_engines.length);
  
-@@ -121,15 +368,7 @@ class Panel : IBus.PanelService {
+@@ -158,15 +405,7 @@ class Panel : IBus.PanelService {
              return;
          }
          // set xkb layout
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
index c73cc01..7dc170e 100644
--- a/ibus-HEAD.patch
+++ b/ibus-HEAD.patch
@@ -1,91 +1,201 @@
-From 35f6353b89726878fa99de2588fb6be5aef8686c Mon Sep 17 00:00:00 2001
+From fe1ec8a1b6f56ceda1f3f4bbb931cce29d946ed9 Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1 at gmail.com>
-Date: Mon, 5 Mar 2012 11:16:23 +0900
-Subject: [PATCH] Fix python library to load libibus.so.Y
+Date: Fri, 16 Mar 2012 21:00:28 +0900
+Subject: [PATCH] Set the custom font in ui.gtk3.CandidatePanel.
 
 ---
- ibus/_config.py.in |    2 ++
- ibus/common.py     |    3 ++-
- 2 files changed, 4 insertions(+), 1 deletions(-)
+ ui/gtk3/candidatearea.vala  |   23 +++++++++++++++++++++++
+ ui/gtk3/candidatepanel.vala |   19 +++++++++++++++++++
+ ui/gtk3/panel.vala          |   41 +++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 83 insertions(+), 0 deletions(-)
 
-diff --git a/ibus/_config.py.in b/ibus/_config.py.in
-index 098d805..c9d11bb 100644
---- a/ibus/_config.py.in
-+++ b/ibus/_config.py.in
-@@ -25,6 +25,7 @@ __all__ = (
-     "get_copyright",
-     "get_license",
-     "get_ICON_KEYBOARD",
-+    "LIBIBUS_SONAME",
-     "ISOCODES_PREFIX",
-     "_"
- )
-@@ -55,4 +56,5 @@ def get_ICON_KEYBOARD():
-         return fallback_icon
-     return icon
+diff --git a/ui/gtk3/candidatearea.vala b/ui/gtk3/candidatearea.vala
+index 85a830d..5d0e8f7 100644
+--- a/ui/gtk3/candidatearea.vala
++++ b/ui/gtk3/candidatearea.vala
+@@ -33,6 +33,7 @@ class CandidateArea : Gtk.Box {
+     private IBus.Text[] m_ibus_candidates;
+     private uint m_focus_candidate;
+     private bool m_show_cursor;
++    private Pango.FontDescription m_font_desc;
  
-+LIBIBUS_SONAME='libibus- at IBUS_API_VERSION@.so. at LT_CURRENT_MINUS_AGE@'
- ISOCODES_PREFIX='@ISOCODES_PREFIX@'
-diff --git a/ibus/common.py b/ibus/common.py
-index 6483aae..fb39d56 100644
---- a/ibus/common.py
-+++ b/ibus/common.py
-@@ -59,6 +59,7 @@ import os
- import sys
- from xdg import BaseDirectory
- import ctypes
-+import _config
+     private const string LABELS[] = {
+         "1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.",
+@@ -240,6 +241,28 @@ class CandidateArea : Gtk.Box {
+             hbox.pack_start(prev_button, false, false, 0);
+             hbox.pack_start(next_button, false, false, 0);
+         }
++
++        udpate_label_font ();
++    }
++
++    private void udpate_label_font () {
++        for (int i = 0; i < m_labels.length; i++) {
++            m_labels[i].override_font(m_font_desc);
++        }
++
++        for (int i = 0; i < m_candidates.length; i++) {
++            m_candidates[i].override_font(m_font_desc);
++        }
++    }
++
++    public void set_custom_font(string? font_name) {
++        if (font_name == null) {
++            m_font_desc = null;
++        } else {
++            m_font_desc = Pango.FontDescription.from_string (font_name);
++        }
++
++        udpate_label_font ();
+     }
+ }
+ 
+diff --git a/ui/gtk3/candidatepanel.vala b/ui/gtk3/candidatepanel.vala
+index a029e8f..721db18 100644
+--- a/ui/gtk3/candidatepanel.vala
++++ b/ui/gtk3/candidatepanel.vala
+@@ -32,6 +32,7 @@ public class CandidatePanel : Gtk.HBox{
+     private Gtk.Label m_aux_label;
+     private CandidateArea m_candidate_area;
+     private HSeparator m_hseparator;
++    private Pango.FontDescription m_font_desc;
+ 
+     private Gdk.Rectangle m_cursor_location;
+ 
+@@ -268,4 +269,22 @@ public class CandidatePanel : Gtk.HBox{
+ 
+         move(x, y);
+     }
++
++    public void set_custom_font(string? font_name) {
++        if (font_name == null) {
++            m_font_desc = null;
++        } else {
++            m_font_desc = Pango.FontDescription.from_string (font_name);
++        }
++
++        if (m_preedit_label != null) {
++            m_preedit_label.override_font(m_font_desc);
++        }
++
++        if (m_aux_label != null) {
++            m_aux_label.override_font(m_font_desc);
++        }
++
++        m_candidate_area.set_custom_font(font_name);
++    }
+ }
+diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
+index 53789d2..d927491 100644
+--- a/ui/gtk3/panel.vala
++++ b/ui/gtk3/panel.vala
+@@ -86,6 +86,36 @@ class Panel : IBus.PanelService {
+         keybinding_manager.unbind(ACCELERATOR_SWITCH_IME_BACKWARD);
+     }
  
- # __display = os.environ["DISPLAY"]
- # __hostname, __display_screen = __display.split(":", 1)
-@@ -104,7 +105,7 @@ import ctypes
- #         return None
- #     return address
++    private void set_custom_font() {
++        bool use_custom_font = false;
++        GLib.Variant var_use_custom_font = m_config.get_value("panel",
++                                                              "use_custom_font");
++
++        if (var_use_custom_font != null) {
++            use_custom_font = var_use_custom_font.get_boolean();
++        }
++
++        if (use_custom_font == false) {
++            m_candidate_panel.set_custom_font(null);
++            return;
++        }
++
++        string font_name = null;
++        GLib.Variant var_custom_font = m_config.get_value("panel",
++                                                          "custom_font");
++        if (var_custom_font != null) {
++            font_name = var_custom_font.dup_string();
++        }
++
++        if (font_name == null) {
++            GLib.Value value = GLib.Value(typeof(string));
++            Gtk.Settings.get_default().get_property("gtk-font-name", ref value);
++            font_name = value.dup_string();
++        }
++
++        m_candidate_panel.set_custom_font(font_name);
++    }
++
+     public void set_config(IBus.Config config) {
+         if (m_config != null) {
+             m_config.value_changed.disconnect(config_value_changed_cb);
+@@ -98,11 +128,15 @@ class Panel : IBus.PanelService {
+             m_config.value_changed.connect(config_value_changed_cb);
+             m_config.watch("general", "preload_engines");
+             m_config.watch("general", "engines_order");
++            m_config.watch("panel", "custom_font");
++            m_config.watch("panel", "use_custom_font");
+             update_engines(m_config.get_value("general", "preload_engines"),
+                            m_config.get_value("general", "engines_order"));
+         } else {
+             update_engines(null, null);
+         }
++
++        set_custom_font();
+     }
  
--libibus = ctypes.CDLL("libibus-1.0.so.0")
-+libibus = ctypes.CDLL(_config.LIBIBUS_SONAME)
- get_address = libibus.ibus_get_address
- get_address.restype=ctypes.c_char_p
+     private void switch_engine(int i, bool force = false) {
+@@ -150,6 +184,13 @@ class Panel : IBus.PanelService {
+                                          Variant variant) {
+         if (section == "general" && name == "preload_engines") {
+             update_engines(variant, null);
++            return;
++        }
++
++        if (section == "panel" && (name == "custom_font" ||
++                                   name == "use_custom_font")) {
++            set_custom_font();
++            return;
+         }
+     }
  
 -- 
 1.7.9.1
 
-From 401f881314abce57a0979aa4ef08fc5462dfe3ca Mon Sep 17 00:00:00 2001
+From 2ce9e82bd492d6addbd629955f9c0399753e8fa2 Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1 at gmail.com>
-Date: Sat, 10 Mar 2012 09:45:07 +0900
-Subject: [PATCH] Fix to ungrab ui/gtk3/switcher for GTK 3.3.18 and GLib
- 2.31.20
+Date: Sun, 18 Mar 2012 18:14:06 +0900
+Subject: [PATCH] Show language id on ibus-ui-gtk3.switcher window.
 
 ---
- ui/gtk3/switcher.vala |    8 ++++++++
- 1 files changed, 8 insertions(+), 0 deletions(-)
+ ui/gtk3/switcher.vala |   15 ++++++++++++++-
+ 1 files changed, 14 insertions(+), 1 deletions(-)
 
 diff --git a/ui/gtk3/switcher.vala b/ui/gtk3/switcher.vala
-index 76c67ec..131cad5 100644
+index 131cad5..73b58d2 100644
 --- a/ui/gtk3/switcher.vala
 +++ b/ui/gtk3/switcher.vala
-@@ -127,6 +127,9 @@ class Switcher : Gtk.Window {
-         m_loop.run();
-         m_loop = null;
- 
-+        keyboard.ungrab(Gdk.CURRENT_TIME);
-+        pointer.ungrab(Gdk.CURRENT_TIME);
-+
-         hide();
-         // Make sure the switcher is hidden before returning from this function.
-         while (Gtk.events_pending())
-@@ -239,6 +242,11 @@ class Switcher : Gtk.Window {
-             return true;
-         }
- 
-+        // if e.type == Gdk.EventType.KEY_RELEASE, m_loop is already null.
-+        if (m_loop == null) {
-+            return false;
-+        }
+@@ -155,9 +155,22 @@ class Switcher : Gtk.Window {
+         for (int i = 0; i < m_engines.length; i++) {
+             var index = i;
+             var engine = m_engines[i];
+-            var button = new Gtk.Button.with_label(engine.get_longname());
++            var longname = engine.get_longname();
++            var language = engine.get_language();
++            var symbol = engine.get_symbol();
++            var id = language;
 +
-         m_loop.quit();
-         m_result = (int)m_selected_engine;
-         return true;
++            if (id.length > 2) {
++                id = id[0:2];
++            }
++            if (symbol.length != 0) {
++                id = symbol;
++            }
++            var label = "%-15s %s".printf(longname, id);
++            var button = new Gtk.Button.with_label(label);
+             button.set_image(new IconWidget(engine.get_icon(), width));
+             button.set_relief(Gtk.ReliefStyle.NONE);
++            button.set_alignment(1.0f, 0.0f);
+             button.show();
+ 
+             button.enter_notify_event.connect((e) => {
 -- 
 1.7.9.1
 
diff --git a/ibus-xx-no-use.diff b/ibus-xx-no-use.diff
new file mode 100644
index 0000000..2220490
--- /dev/null
+++ b/ibus-xx-no-use.diff
@@ -0,0 +1,221 @@
+--- ibus-1.4.99.20120317/setup/main.py.orig	2012-03-16 14:58:17.228279261 +0900
++++ ibus-1.4.99.20120317/setup/main.py	2012-03-16 14:58:50.316202253 +0900
+@@ -75,22 +75,30 @@ class Setup(object):
+         self.__init_ui()
+ 
+     def __init_hotkey(self):
++        '''
+         default_values = {
+             "trigger" : (N_("trigger"), ["Control+space"]),
+             "enable_unconditional" : (N_("enable"), []),
+             "disable_unconditional" : (N_("disable"), [])
+         }
++        '''
++        default_values = {
++            'trigger_accel' : ('trigger', ['<Control>space']),
++        }
+ 
+         values = dict(self.__config.get_values("general/hotkey"))
+ 
+-        for name, (label, shortcuts) in default_values.items():
++        for name, (id, shortcuts) in default_values.items():
+             shortcuts = values.get(name, shortcuts)
+-            button = self.__builder.get_object("button_%s" % name)
+-            entry = self.__builder.get_object("entry_%s" % name)
++            button = self.__builder.get_object("button_%s" % id)
++            entry = self.__builder.get_object("entry_%s" % id)
+             entry.set_text("; ".join(shortcuts))
+-            entry.set_tooltip_text("\n".join(shortcuts))
+-            button.connect("clicked", self.__shortcut_button_clicked_cb,
+-                    label, "general/hotkey", name, entry)
++            text = '\n'.join(shortcuts)
++            text = "Use ';' separated values\n" + text
++            entry.set_tooltip_text(text)
++            button.connect("clicked", self.__shortcut_button_clicked_cb2,
++                    name, "general/hotkey", id, entry)
++            button.set_tooltip_text("Save the left entry string")
+ 
+     def __init_panel(self):
+         values = dict(self.__config.get_values("panel"))
+@@ -446,6 +454,37 @@ class Setup(object):
+         entry.set_text(text)
+         entry.set_tooltip_text(text)
+ 
++    def __shortcut_button_clicked_cb2(self, button, name, section, id, entry):
++        text = entry.get_text()
++        if text:
++            text = text.replace(' ', '')
++            shortcuts = text.split(';')
++        else:
++            shortcuts = []
++        orig_list =['<Control>space']
++        variant = self.__config.get_value(section, name)
++        if variant != None:
++            orig_list = variant.dup_strv()[0]
++        orig_text = ';'.join(orig_list)
++        if text == orig_text:
++            return
++        is_valid = True
++        for shortcut in shortcuts:
++            (key, mods) = Gtk.accelerator_parse(shortcut)
++            if not Gtk.accelerator_valid(key, mods):
++                is_valid = False
++                dlg = Gtk.MessageDialog(type = Gtk.MessageType.ERROR,
++                        buttons = Gtk.ButtonsType.CLOSE,
++                        message_format = "Invalid key %s" % shortcut)
++                dlg.run()
++                dlg.destroy()
++                break
++        if not is_valid:
++            return
++        self.__config.set_value(section, name, GLib.Variant.new_strv(shortcuts))
++        text = '\n'.join(shortcuts)
++        text = "Use ';' separated values\n" + text
++        entry.set_tooltip_text(text)
+ 
+     def __item_started_column_toggled_cb(self, cell, path_str, model):
+ 
+--- ibus-1.4.99.20120317/setup/setup.ui.orig	2012-03-16 14:58:23.948466373 +0900
++++ ibus-1.4.99.20120317/setup/setup.ui	2012-03-16 14:59:22.242094469 +0900
+@@ -102,7 +102,7 @@
+                                 <property name="row_spacing">6</property>
+                                 <child>
+                                   <object class="GtkLabel" id="label8">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="tooltip_text" translatable="yes">The shortcut keys for switching to next input method in the list</property>
+                                     <property name="xalign">0</property>
+                                     <property name="label" translatable="yes">Next input method:</property>
+@@ -116,7 +116,7 @@
+                                 </child>
+                                 <child>
+                                   <object class="GtkLabel" id="label9">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="sensitive">False</property>
+                                     <property name="tooltip_text" translatable="yes">The shortcut keys for switching to previous input method in the list</property>
+                                     <property name="xalign">0</property>
+@@ -137,7 +137,7 @@
+                                       <object class="GtkEntry" id="entry_trigger">
+                                         <property name="visible">True</property>
+                                         <property name="can_focus">True</property>
+-                                        <property name="editable">False</property>
++                                        <!-- property name="editable">False</property -->
+                                       </object>
+                                       <packing>
+                                         <property name="position">0</property>
+@@ -145,7 +145,9 @@
+                                     </child>
+                                     <child>
+                                       <object class="GtkButton" id="button_trigger">
+-                                        <property name="label" translatable="yes">...</property>
++                                        <!-- property name="label" translatable="yes">...</property -->
++                                        <property name="label">gtk-apply</property>
++                                        <property name="use_stock">True</property>
+                                         <property name="visible">True</property>
+                                         <property name="can_focus">True</property>
+                                         <property name="receives_default">False</property>
+@@ -160,11 +162,12 @@
+                                   <packing>
+                                     <property name="left_attach">1</property>
+                                     <property name="right_attach">2</property>
++                                    <property name="y_options">GTK_FILL</property>
+                                   </packing>
+                                 </child>
+                                 <child>
+                                   <object class="GtkHBox" id="hbox5">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="spacing">6</property>
+                                     <child>
+                                       <object class="GtkEntry" id="entry_next_engine">
+@@ -199,7 +202,7 @@
+                                 </child>
+                                 <child>
+                                   <object class="GtkHBox" id="hbox6">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="spacing">6</property>
+                                     <child>
+                                       <object class="GtkEntry" id="entry_prev_engine">
+@@ -248,7 +251,7 @@
+                                 </child>
+                                 <child>
+                                   <object class="GtkLabel" id="label18">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="xalign">0</property>
+                                     <property name="label" translatable="yes">Enable:</property>
+                                   </object>
+@@ -261,7 +264,7 @@
+                                 </child>
+                                 <child>
+                                   <object class="GtkHBox" id="hbox2">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="spacing">6</property>
+                                     <child>
+                                       <object class="GtkEntry" id="entry_enable_unconditional">
+@@ -296,7 +299,7 @@
+                                 </child>
+                                 <child>
+                                   <object class="GtkLabel" id="label19">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="xalign">0</property>
+                                     <property name="label" translatable="yes">Disable:</property>
+                                   </object>
+@@ -309,7 +312,7 @@
+                                 </child>
+                                 <child>
+                                   <object class="GtkHBox" id="hbox3">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="spacing">6</property>
+                                     <child>
+                                       <object class="GtkEntry" id="entry_disable_unconditional">
+@@ -406,7 +409,7 @@
+                                 </child>
+                                 <child>
+                                   <object class="GtkLabel" id="label10">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="tooltip_text" translatable="yes">Set the behavior of ibus how to show or hide language bar</property>
+                                     <property name="xalign">0</property>
+                                     <property name="label" translatable="yes">Show language panel:</property>
+@@ -433,7 +436,7 @@
+                                 </child>
+                                 <child>
+                                   <object class="GtkComboBox" id="combobox_panel_show">
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="model">model_panel_show_mode</property>
+                                     <child>
+                                       <object class="GtkCellRendererText" id="renderer2"/>
+@@ -470,7 +473,7 @@
+                                 <child>
+                                   <object class="GtkCheckButton" id="checkbutton_show_icon_on_systray">
+                                     <property name="label" translatable="yes">Show icon on system tray</property>
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="receives_default">False</property>
+                                     <property name="tooltip_text" translatable="yes">Show icon on system tray</property>
+@@ -486,7 +489,7 @@
+                                 <child>
+                                   <object class="GtkCheckButton" id="checkbutton_show_im_name">
+                                     <property name="label" translatable="yes">Show input method name on language bar</property>
+-                                    <property name="visible">True</property>
++                                    <property name="no_show_all">True</property>
+                                     <property name="can_focus">True</property>
+                                     <property name="receives_default">False</property>
+                                     <property name="tooltip_text" translatable="yes">Show input method's name on language bar when check the checkbox</property>
+@@ -893,7 +896,7 @@ You may use up/down buttons to change it
+                     </child>
+                     <child>
+                       <object class="GtkFrame" id="frame5">
+-                        <property name="visible">True</property>
++                        <property name="no_show_all">True</property>
+                         <property name="label_xalign">0</property>
+                         <property name="shadow_type">none</property>
+                         <child>
diff --git a/ibus-xx-setup-frequent-lang.patch b/ibus-xx-setup-frequent-lang.patch
index d487c37..341ea66 100644
--- a/ibus-xx-setup-frequent-lang.patch
+++ b/ibus-xx-setup-frequent-lang.patch
@@ -1,6 +1,6 @@
-From fc525080c668267339baef480f53bdb8256f3239 Mon Sep 17 00:00:00 2001
+From cad2c8af84966ab88822c834bd5547067307b35d Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1 at gmail.com>
-Date: Sun, 4 Mar 2012 20:18:30 +0900
+Date: Fri, 16 Mar 2012 20:48:10 +0900
 Subject: [PATCH] Enable ibus-setup to show the frequently used languages
  only in IME list.
 
@@ -11,10 +11,10 @@ Subject: [PATCH] Enable ibus-setup to show the frequently used languages
  3 files changed, 300 insertions(+), 25 deletions(-)
 
 diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in
-index 3ca0fbc..a3a9a5f 100644
+index 8ca33ac..7420a35 100644
 --- a/data/ibus.schemas.in
 +++ b/data/ibus.schemas.in
-@@ -272,6 +272,174 @@ se,si,sk,sy,sy(ku),th,tj,tr,ua,uz,vn
+@@ -296,6 +296,174 @@ se,si,sk,sy,sy(ku),th,tj,tr,ua,uz,vn
        </locale>
      </schema>
      <schema>
@@ -190,7 +190,7 @@ index 3ca0fbc..a3a9a5f 100644
        <applyto>/desktop/ibus/panel/custom_font</applyto>
        <owner>ibus</owner>
 diff --git a/setup/enginecombobox.py b/setup/enginecombobox.py
-index 0ac7368..9af2651 100644
+index 0ac7368..578098c 100644
 --- a/setup/enginecombobox.py
 +++ b/setup/enginecombobox.py
 @@ -45,6 +45,9 @@ class EngineComboBox(Gtk.ComboBox):
@@ -347,9 +347,9 @@ index 0ac7368..9af2651 100644
 +                renderer.set_property("pixbuf", None)
 +            elif engine < 0:
 +                if not self.__show_sub_lang:
-+                    pixbuf = load_icon("list-add", Gtk.IconSize.LARGE_TOOLBAR)
++                    pixbuf = load_icon("go-bottom", Gtk.IconSize.LARGE_TOOLBAR)
 +                else:
-+                    pixbuf = load_icon("list-remove", Gtk.IconSize.LARGE_TOOLBAR)
++                    pixbuf = load_icon("go-up", Gtk.IconSize.LARGE_TOOLBAR)
 +                if pixbuf == None:
 +                    pixbuf = load_icon(Gtk.STOCK_MISSING_IMAGE,
 +                                       Gtk.IconSize.LARGE_TOOLBAR)
@@ -412,17 +412,17 @@ index 0ac7368..9af2651 100644
          return self.get_property("active-engine")
  
 diff --git a/setup/main.py b/setup/main.py
-index e3027a5..614737f 100644
+index 132e9f4..367cea8 100644
 --- a/setup/main.py
 +++ b/setup/main.py
-@@ -197,6 +197,7 @@ class Setup(object):
-                     self.__engines.append(engine)
+@@ -212,6 +212,7 @@ class Setup(object):
+                     engines.append(engine)
  
          self.__combobox = self.__builder.get_object("combobox_engines")
 +        self.__combobox.set_config(self.__config)
-         self.__combobox.set_engines(self.__engines)
+         self.__combobox.set_engines(engines)
  
-         tmp_dict = {}
+         engine_names = values.get("preload_engines", [])
 -- 
 1.7.9.1
 
diff --git a/ibus.spec b/ibus.spec
index 96562f9..c3ec443 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -2,21 +2,19 @@
 %{!?gtk2_binary_version: %define gtk2_binary_version %(pkg-config  --variable=gtk_binary_version gtk+-2.0)}
 %{!?gtk3_binary_version: %define gtk3_binary_version %(pkg-config  --variable=gtk_binary_version gtk+-3.0)}
 
-%define have_libxkbfile 1
-%define have_dconf 1
-%define have_pygobject2 1
-%define have_pygobject3 1
-
-%define vala_build_failure 1
+%define with_xkbfile 1
+%define with_dconf 1
+%define with_pygobject2 1
+%define with_pygobject3 1
 
 %ifarch ppc ppc64 s390 s390x
-%define have_gjsfile 0
+%define with_gjs 0
 %else
-%define have_gjsfile 1
+%define with_gjs 1
 %endif
 
 %if 0%{?fedora} > 16
-%define ibus_gjs_version 3.3.90.20120308
+%define ibus_gjs_version 3.3.90.20120317
 %define ibus_gjs_build_failure 1
 %else
 %define ibus_gjs_version 3.2.1.20111230
@@ -31,8 +29,8 @@
 %define gnome_icon_theme_legacy_version 2.91.6
 
 Name:       ibus
-Version:    1.4.99.20120304
-Release:    3%{?dist}
+Version:    1.4.99.20120317
+Release:    1%{?dist}
 Summary:    Intelligent Input Bus for Linux OS
 License:    LGPLv2+
 Group:      System Environment/Libraries
@@ -40,26 +38,18 @@ URL:        http://code.google.com/p/ibus/
 # Source0:    http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz
 Source0:    http://fujiwara.fedorapeople.org/ibus/gnome-shell/%{name}-%{version}.tar.gz
 Source1:    xinput-ibus
-%if %have_gjsfile
 Source2:    http://fujiwara.fedorapeople.org/ibus/gnome-shell/ibus-gjs-%{ibus_gjs_version}.tar.gz
-%endif
 Patch0:     ibus-HEAD.patch
 Patch1:     ibus-541492-xkb.patch
-Patch2:     ibus-xx-setup-frequent-lang.patch
-# Patch3:     ibus-530711-preload-sys.patch
+Patch2:     ibus-530711-preload-sys.patch
+Patch3:     ibus-xx-setup-frequent-lang.patch
 
-# Workaround gnome-shell build failure
-# http://koji.fedoraproject.org/koji/getfile?taskID=3317917&name=root.log
-# Patch91:    ibus-gjs-xx-gnome-shell-3.1.4-build-failure.patch
 # Workaround to disable preedit on gnome-shell until bug 658420 is fixed.
 # https://bugzilla.gnome.org/show_bug.cgi?id=658420
 Patch92:    ibus-xx-g-s-disable-preedit.patch
 Patch93:    ibus-771115-property-compatible.patch
-%if %vala_build_failure
-# Xkl-1.0.gir cannot be converted to vapi.
-# https://bugs.freedesktop.org/show_bug.cgi?id=47141
-Patch94:    ibus-xx-vapi-build-failure.diff
-%endif
+# Hide no nused properties in f17.
+Patch94:    ibus-xx-no-use.diff
 
 BuildRoot:  %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
@@ -74,7 +64,7 @@ BuildRequires:  dbus-glib-devel
 BuildRequires:  dbus-python-devel >= %{dbus_python_version}
 BuildRequires:  desktop-file-utils
 BuildRequires:  gtk-doc
-%if %have_dconf
+%if %with_dconf
 BuildRequires:  dconf-devel
 BuildRequires:  dbus-x11
 BuildRequires:  vala
@@ -82,12 +72,12 @@ BuildRequires:  vala-tools
 %endif
 # for AM_GCONF_SOURCE_2 in configure.ac
 BuildRequires:  GConf2-devel
-%if %have_pygobject3
+%if %with_pygobject3
 BuildRequires:  gobject-introspection-devel
 %endif
 BuildRequires:  intltool
 BuildRequires:  iso-codes-devel
-%if %have_libxkbfile
+%if %with_xkbfile
 BuildRequires:  libxkbfile-devel
 BuildRequires:  libgnomekbd-devel
 %endif
@@ -103,10 +93,10 @@ Requires:   %{name}-gtk2 = %{version}-%{release}
 Requires:   %{name}-gtk3 = %{version}-%{release}
 %endif
 
-%if %have_pygobject2
+%if %with_pygobject2
 Requires:   pygtk2
 %endif
-%if %have_pygobject3
+%if %with_pygobject3
 Requires:   pygobject3
 %endif
 Requires:   pyxdg
@@ -114,7 +104,7 @@ Requires:   iso-codes
 Requires:   dbus-python >= %{dbus_python_version}
 Requires:   dbus-x11
 Requires:   im-chooser
-%if %have_dconf
+%if %with_dconf
 Requires:   dconf
 %else
 Requires:   GConf2
@@ -174,7 +164,7 @@ Requires(post): glib2 >= %{glib_ver}
 %description gtk3
 This package contains ibus im module for gtk3
 
-%if %have_gjsfile
+%if %with_gjs
 %package gnome3
 Summary:    IBus gnome-shell-extension for GNOME3
 Group:      System Environment/Libraries
@@ -211,35 +201,28 @@ The ibus-devel-docs package contains developer documentation for ibus
 
 %prep
 %setup -q
-%if %have_gjsfile
+%if %with_gjs
 zcat %SOURCE2 | tar xf -
-%if %ibus_gjs_build_failure
-d=`basename %SOURCE2 .tar.gz`
-cd $d
-#%patch91 -p1 -b .fail-g-s
-cd ..
-%endif
 %endif
 
 %patch0 -p1
 %patch92 -p1 -b .g-s-preedit
 cp client/gtk2/ibusimcontext.c client/gtk3/ibusimcontext.c ||
-%if %have_libxkbfile
+%if %with_xkbfile
 %patch1 -p1 -b .xkb
-%if %vala_build_failure
-%patch94 -p1 -b .vala-fail
-%endif
 rm -f bindings/vala/ibus-1.0.vapi
 %endif
-%patch2 -p1 -b .setup-frequent-lang
-# %patch3 -p1 -b .preload-sys
+%patch2 -p1 -b .preload-sys
+%patch3 -p1 -b .setup-frequent-lang
 
 %if 0%{?fedora} <= 16
 %patch93 -p1 -b .compat
 %endif
 
+%patch94 -p1 -b .no-used
+
 %build
-%if %have_libxkbfile
+%if %with_xkbfile
 XKB_PRELOAD_LAYOUTS=\
 "us,us(chr),us(dvorak),ad,al,am,ara,az,ba,bd,be,bg,br,bt,by,"\
 "de,dk,ca,ch,cn(tib),cz,ee,epo,es,et,fi,fo,fr,"\
@@ -261,41 +244,33 @@ autoreconf -f -i
     --enable-gtk-doc \
     --with-no-snooper-apps='gnome-do,Do.*,firefox.*,.*chrome.*,.*chromium.*' \
     --enable-surrounding-text \
-%if %have_libxkbfile
+%if %with_xkbfile
     --with-xkb-preload-layouts=$XKB_PRELOAD_LAYOUTS \
     --enable-xkb \
     --enable-libgnomekbd \
 %endif
-%if %have_dconf
+%if %with_dconf
     --enable-dconf \
     --disable-gconf \
 %endif
-%if %have_pygobject2
+%if %with_pygobject2
     --enable-python-library \
 %endif
     --enable-introspection
 
-%if %vala_build_failure
-touch ui/gtk3/ibus_ui_gtk3_vala.stamp
-touch ui/gtk3/*.c
-cp ui/gtk3/gkbdlayout.c.true ui/gtk3/gkbdlayout.c
+%if %with_xkbfile
+make -C ui/gtk3 maintainer-clean-generic
 %endif
-
 # make -C po update-gmo
-make %{?_smp_mflags} \
-  AM_DEFAULT_VERBOSITY=1 \
-  PKG_CONFIG_PATH=..:/usr/lib64/pkgconfig:/usr/lib/pkgconfig
+make %{?_smp_mflags}
 
-%if %have_gjsfile
+%if %with_gjs
 d=`basename %SOURCE2 .tar.gz`
 cd $d
-%if %ibus_gjs_build_failure
-autoreconf
-%endif
 export PKG_CONFIG_PATH=..:/usr/lib64/pkgconfig:/usr/lib/pkgconfig
 %configure \
-  --with-gnome-shell-version="3.3.90,3.3.5,3.3.4,3.3.3,3.2" \
-  --with-gjs-version="1.31.20,1.31.10,1.31.6,1.31.11,1.30"
+  --with-gnome-shell-version="3.4,3.3.90,3.3.5,3.3.4,3.3.3,3.2" \
+  --with-gjs-version="1.32,1.31.20,1.31.10,1.31.6,1.31.11,1.30"
 make %{?_smp_mflags}
 cd ..
 %endif
@@ -329,7 +304,7 @@ desktop-file-install --delete-original          \
   --dir $RPM_BUILD_ROOT%{_datadir}/applications \
   $RPM_BUILD_ROOT%{_datadir}/applications/*
 
-%if %have_gjsfile
+%if %with_gjs
 # https://bugzilla.redhat.com/show_bug.cgi?id=657165
 d=`basename %SOURCE2 .tar.gz`
 cd $d
@@ -352,13 +327,13 @@ touch --no-create %{_datadir}/icons/hicolor || :
 
 %{_sbindir}/alternatives --install %{_sysconfdir}/X11/xinit/xinputrc xinputrc %{_xinputconf} 83 || :
 
-%if !%have_dconf
+%if !%with_dconf
 export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
 gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/ibus.schemas > /dev/null 2>&1 || :
 %endif
 
 %pre
-%if !%have_dconf
+%if !%with_dconf
 if [ "$1" -gt 1 ]; then
     export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
     gconftool-2 --makefile-uninstall-rule %{_sysconfdir}/gconf/schemas/ibus.schemas > /dev/null 2>&1 || :
@@ -366,7 +341,7 @@ fi
 %endif
 
 %preun
-%if !%have_dconf
+%if !%with_dconf
 if [ "$1" -eq 0 ]; then
     export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source`
     gconftool-2 --makefile-uninstall-rule %{_sysconfdir}/gconf/schemas/ibus.schemas > /dev/null 2>&1 || :
@@ -384,14 +359,14 @@ if [ "$1" = "0" ]; then
   # if alternative was set to manual, reset to auto
   [ -L %{_sysconfdir}/alternatives/xinputrc -a "`readlink %{_sysconfdir}/alternatives/xinputrc`" = "%{_xinputconf}" ] && %{_sbindir}/alternatives --auto xinputrc || :
 fi
-%if %have_dconf
+%if %with_dconf
 if [ $1 -eq 0 ]; then
   glib-compile-schemas %{_datadir}/glib-2.0/schemas
 fi
 %endif
 
 %posttrans
-%if %have_dconf
+%if %with_dconf
 if [ $1 -eq 0 ]; then
   glib-compile-schemas %{_datadir}/glib-2.0/schemas
 fi
@@ -417,7 +392,7 @@ fi
 %files -f %{name}10.lang
 %defattr(-,root,root,-)
 %doc AUTHORS COPYING README
-%if %have_pygobject2
+%if %with_pygobject2
 %dir %{python_sitelib}/ibus
 %{python_sitelib}/ibus/*
 %endif
@@ -425,12 +400,12 @@ fi
 %{_bindir}/ibus
 %{_bindir}/ibus-daemon
 %{_bindir}/ibus-setup
-%if %have_pygobject3
+%if %with_pygobject3
 %{_datadir}/ibus/*
 %endif
 %{_datadir}/applications/*
 %{_datadir}/icons/hicolor/*/apps/*
-%if %have_dconf
+%if %with_dconf
 %{_datadir}/GConf/gsettings/*
 %{_datadir}/glib-2.0/schemas/*.xml
 %{_libexecdir}/ibus-engine-simple
@@ -442,21 +417,21 @@ fi
 %{_libexecdir}/ibus-x11
 # %{_sysconfdir}/xdg/autostart/ibus.desktop
 %{_sysconfdir}/bash_completion.d/ibus.bash
-%if %have_dconf
+%if %with_dconf
 %{_sysconfdir}/dconf/db/ibus
 %{_sysconfdir}/dconf/profile/ibus
 %else
 %{_sysconfdir}/gconf/schemas/ibus.schemas
 %endif
 %config %{_xinputconf}
-%if %have_libxkbfile
+%if %with_xkbfile
 %{_libexecdir}/ibus-xkb
 %endif
 
 %files libs
 %defattr(-,root,root,-)
 %{_libdir}/libibus-%{ibus_api_version}.so.*
-%if %have_pygobject3
+%if %with_pygobject3
 %{_libdir}/girepository-1.0/IBus-1.0.typelib
 %endif
 
@@ -468,7 +443,7 @@ fi
 %defattr(-,root,root,-)
 %{_libdir}/gtk-3.0/%{gtk3_binary_version}/immodules/im-ibus.so
 
-%if %have_gjsfile
+%if %with_gjs
 %files gnome3
 %defattr(-,root,root,-)
 %{_datadir}/gnome-shell/js/ui/status/ibus
@@ -489,6 +464,19 @@ fi
 %{_datadir}/gtk-doc/html/*
 
 %changelog
+* Sat Mar 17 2012 Takao Fujiwara <tfujiwar at redhat.com> - 1.4.99.20120317-1
+- Bumped to 1.4.99.20120317
+  Fixed Bug 718668 - focus move is slow with ibus-gnome3
+  Fixed Bug 749497 - Enhance IME descriptions in status icon active menu
+- Bumped to ibus-gjs 3.3.90.20120317
+- Added ibus-xx-no-use.diff
+  Fixed Bug 803260 - Disable non-global input method mode
+- Updated ibus-HEAD.patch
+  Fixed Bug 803250 - ibus lookup window font customization
+  Fixed Bug 803177 - language id on ibus-ui-gtk3 switcher
+- Update ibus-530711-preload-sys.patch
+  Fixed Bug 797023 - port preload engines
+
 * Thu Mar 08 2012 Takao Fujiwara <tfujiwar at redhat.com> - 1.4.99.20120303-3
 - Bumped to ibus-gjs 3.3.90.20120308 to work with gnome-shell 3.3.90
 - Fixed Bug 786906 - Added ifnarch ppc ppc64 s390 s390x
diff --git a/sources b/sources
index 147eb6b..ec6d57d 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
-28c77ed889dbe25525fde12e58f1402b  ibus-1.4.99.20120304.tar.gz
-11274193093c9d729187bdcea6e85442  ibus-gjs-3.3.90.20120308.tar.gz
+3517bf2fff8a1d9bfb55e10674d79859  ibus-1.4.99.20120317.tar.gz
+9810fabca2c4c1080da91f82a2ec7684  ibus-gjs-3.3.90.20120317.tar.gz
 2d2ad58e3e41429dbd883ba7e501c9b2  ibus-gjs-3.2.1.20111230.tar.gz


More information about the scm-commits mailing list