[ibus/f15] Fixed compatible issues with gnome-shell 3.1.4

Takao Fujiwara fujiwara at fedoraproject.org
Sun Aug 14 00:11:37 UTC 2011


commit 0318d1b391a0f4f926ee6075cbff24a6c9819aaa
Author: Takao Fujiwara <tfujiwar at redhat.com>
Date:   Sun Aug 14 09:10:20 2011 +0900

    Fixed compatible issues with gnome-shell 3.1.4

 .gitignore                   |    3 +-
 ibus-541492-xkb.patch        |   49 ++-
 ibus-xx-bridge-hotkey.patch  |  821 ++++++++++++++++++------------------------
 ibus-xx-factory-signal.patch |  171 ++++++----
 ibus.spec                    |   27 +-
 sources                      |    2 +-
 6 files changed, 513 insertions(+), 560 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index d735925..16a805a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,5 +12,4 @@ ibus-1.3.6.tar.gz
 /ibus-1.3.99.20110408.tar.gz
 /ibus-1.3.99.20110419.tar.gz
 /ibus_master_da.po
-/ibus-gjs-1.3.99.20110720.tar.gz
-/ibus-gjs-1.3.99.20110806.tar.gz
+/ibus-gjs-1.3.99.20110814.tar.gz
diff --git a/ibus-541492-xkb.patch b/ibus-541492-xkb.patch
index 6a64b82..003baf4 100644
--- a/ibus-541492-xkb.patch
+++ b/ibus-541492-xkb.patch
@@ -1,6 +1,6 @@
-From a253acde0935efae4bbc8aa59ca47ab273b9907b Mon Sep 17 00:00:00 2001
+From 2d0081ff5f19101a0348461b914274fc8bd63a19 Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1 at gmail.com>
-Date: Fri, 5 Aug 2011 20:22:42 +0900
+Date: Thu, 11 Aug 2011 19:07:38 +0900
 Subject: [PATCH] Add XKB layouts
 
 ---
@@ -13,7 +13,7 @@ Subject: [PATCH] Add XKB layouts
  ibus/bus.py                |    3 +
  ibus/interface/iibus.py    |    3 +
  ibus/xkblayout.py.in       |  230 +++++++++++++++++
- ibus/xkbxml.py.in          |  416 ++++++++++++++++++++++++++++++
+ ibus/xkbxml.py.in          |  419 ++++++++++++++++++++++++++++++
  setup/Makefile.am          |    1 +
  setup/enginecombobox.py    |    7 +-
  setup/main.py              |    3 +
@@ -32,9 +32,9 @@ Subject: [PATCH] Add XKB layouts
  xkb/xkblayoutconfig.xml.in |    6 +
  xkb/xkblib.c               |  327 ++++++++++++++++++++++++
  xkb/xkblib.h               |   41 +++
- xkb/xkbxml.c               |  339 ++++++++++++++++++++++++
+ xkb/xkbxml.c               |  345 +++++++++++++++++++++++++
  xkb/xkbxml.h               |  113 ++++++++
- 30 files changed, 4027 insertions(+), 4 deletions(-)
+ 30 files changed, 4036 insertions(+), 4 deletions(-)
  create mode 100644 ibus/xkblayout.py.in
  create mode 100644 ibus/xkbxml.py.in
  create mode 100644 setup/xkbsetup.py
@@ -537,10 +537,10 @@ index 0000000..11fce12
 +        self.__default_option = self.get_option()
 diff --git a/ibus/xkbxml.py.in b/ibus/xkbxml.py.in
 new file mode 100644
-index 0000000..16f47df
+index 0000000..9407c13
 --- /dev/null
 +++ b/ibus/xkbxml.py.in
-@@ -0,0 +1,416 @@
+@@ -0,0 +1,419 @@
 +# vim:set et sts=4 sw=4:
 +#
 +# ibus - The Input Bus
@@ -836,7 +836,7 @@ index 0000000..16f47df
 +                        layout_desc=None,
 +                        variant=None,
 +                        variant_desc=None,
-+                        name_prefix='xkb:layout:'):
++                        name=None):
 +        if variant_desc != None:
 +            longname = variant_desc
 +        elif layout != None and variant != None:
@@ -845,12 +845,15 @@ index 0000000..16f47df
 +            longname = layout_desc
 +        else:
 +            longname = layout
++        name_prefix='xkb:layout:'
 +        if variant != None:
-+            name = name_prefix + layout + ':' + variant
++            if name == None:
++                name = name_prefix + layout + ':' + variant
 +            desc = 'XKB ' + layout + '(' + variant + ') keyboard layout'
 +            engine_layout = layout + '(' + variant + ')'
 +        else:
-+            name = name_prefix + layout
++            if name == None:
++                name = name_prefix + layout
 +            desc = 'XKB ' + layout + ' keyboard layout'
 +            engine_layout = layout
 +
@@ -2991,7 +2994,7 @@ index 0000000..ad9cdd9
 +endif
 diff --git a/xkb/ibus-engine-xkb-main.c b/xkb/ibus-engine-xkb-main.c
 new file mode 100644
-index 0000000..a2f131c
+index 0000000..0fb0f0c
 --- /dev/null
 +++ b/xkb/ibus-engine-xkb-main.c
 @@ -0,0 +1,413 @@
@@ -3324,7 +3327,7 @@ index 0000000..a2f131c
 +                                                   NULL,
 +                                                   NULL,
 +                                                   NULL);
-+            ibus_component_add_engine (component, engine);
++                ibus_component_add_engine (component, engine);
 +            }
 +        }
 +        variants = (GList *) g_hash_table_lookup (layout_list, keys->data);
@@ -3994,10 +3997,10 @@ index 0000000..15e5d18
 +#endif
 diff --git a/xkb/xkbxml.c b/xkb/xkbxml.c
 new file mode 100644
-index 0000000..ad10c28
+index 0000000..d59a929
 --- /dev/null
 +++ b/xkb/xkbxml.c
-@@ -0,0 +1,339 @@
+@@ -0,0 +1,345 @@
 +/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */
 +/* vim:set et sts=4: */
 +/* bus - The Input Bus
@@ -4267,19 +4270,17 @@ index 0000000..ad10c28
 +                          const gchar *layout_desc,
 +                          const gchar *variant,
 +                          const gchar *variant_desc,
-+                          const gchar *name_prefix)
++                          const gchar *alt_name)
 +{
 +    IBusEngineDesc *engine;
 +    gchar *name = NULL;
 +    gchar *longname = NULL;
 +    gchar *desc = NULL;
 +    gchar *engine_layout = NULL;
++    const gchar *name_prefix = "xkb:layout:";
 +
 +    g_return_val_if_fail (lang != NULL && layout != NULL, NULL);
 +
-+    if (name_prefix == NULL) {
-+        name_prefix = "xkb:layout:";
-+    }
 +    if (variant_desc) {
 +        longname = g_strdup (variant_desc);
 +    } else if (layout && variant) {
@@ -4290,11 +4291,19 @@ index 0000000..ad10c28
 +        longname = g_strdup (layout);
 +    }
 +    if (variant) {
-+        name = g_strdup_printf ("%s%s:%s", name_prefix, layout, variant);
++        if (alt_name) {
++            name = g_strdup (alt_name);
++        } else {
++            name = g_strdup_printf ("%s%s:%s", name_prefix, layout, variant);
++        }
 +        desc = g_strdup_printf ("XKB %s(%s) keyboard layout", layout, variant);
 +        engine_layout = g_strdup_printf ("%s(%s)", layout, variant);
 +    } else {
-+        name = g_strdup_printf ("%s%s", name_prefix, layout);
++        if (alt_name) {
++            name = g_strdup (alt_name);
++        } else {
++            name = g_strdup_printf ("%s%s", name_prefix, layout);
++        }
 +        desc = g_strdup_printf ("XKB %s keyboard layout", layout);
 +        engine_layout = g_strdup (layout);
 +    }
diff --git a/ibus-xx-bridge-hotkey.patch b/ibus-xx-bridge-hotkey.patch
index 0b59020..5a325d8 100644
--- a/ibus-xx-bridge-hotkey.patch
+++ b/ibus-xx-bridge-hotkey.patch
@@ -1,43 +1,40 @@
-From 9d5387ea430adbce81899a1a2bece6c8520848b1 Mon Sep 17 00:00:00 2001
+From 5136e4136e38271da195da76e1377308dbc2ed64 Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1 at gmail.com>
-Date: Fri, 5 Aug 2011 20:54:37 +0900
+Date: Fri, 12 Aug 2011 16:42:52 +0900
 Subject: [PATCH] Add a bridge hotkey which use prev-next engines instead
  of on-off.
 
 ---
  bus/Makefile.am                 |   20 +-
- bus/ibusimpl.c                  |  425 +++++++++++++++++++++++++++++++++------
- bus/inputcontext.c              |   39 ++++
+ bus/ibusimpl.c                  |  501 ++++++++++++++++++++++++++++++++++-----
+ bus/inputcontext.c              |   39 +++
  bus/inputcontext.h              |   22 ++
- bus/registry.c                  |   36 ++++
+ bus/registry.c                  |   61 +++++
+ bus/registry.h                  |   10 +
  configure.ac                    |   31 +++
  data/Makefile.am                |    6 +-
- data/ibus.schemas.in            |  287 --------------------------
- data/ibus.schemas.in.in         |  300 +++++++++++++++++++++++++++
+ data/ibus.schemas.in            |  287 ----------------------
+ data/ibus.schemas.in.in         |  300 +++++++++++++++++++++++
  ibus/_config.py.in              |    6 +
- ibus/inputcontext.py            |   14 ++-
+ ibus/inputcontext.py            |   14 +-
  ibus/interface/iinputcontext.py |    4 +-
  ibus/xkbxml.py.in               |    4 +
  setup/enginecombobox.py         |    3 +
- setup/enginetreeview.py         |   16 ++-
- setup/main.py                   |   24 +++
+ setup/enginetreeview.py         |    8 +-
+ setup/main.py                   |   24 ++
  setup/setup.ui                  |   55 +++++-
  src/Makefile.am                 |   18 +-
  src/ibushotkey.c                |   11 +
  src/ibushotkey.h                |   11 +
  src/ibusutil.c                  |   12 +
- src/ibusutil.h                  |   14 ++
- ui/gtk/Makefile.am              |    2 +
- ui/gtk/panel.py                 |  288 ++++++++++++++++++++++++--
- ui/gtk/xkbengine.py             |   93 +++++++++
- ui/gtk/xkbfactory.py            |  117 +++++++++++
+ src/ibusutil.h                  |   14 +
+ ui/gtk/panel.py                 |  271 ++++++++++++++++++++--
  xkb/Makefile.am                 |    2 +
+ xkb/ibus-engine-xkb-main.c      |   19 ++
  xkb/xkbxml.c                    |   10 +-
- 28 files changed, 1480 insertions(+), 390 deletions(-)
+ 28 files changed, 1374 insertions(+), 391 deletions(-)
  delete mode 100644 data/ibus.schemas.in
  create mode 100644 data/ibus.schemas.in.in
- create mode 100644 ui/gtk/xkbengine.py
- create mode 100644 ui/gtk/xkbfactory.py
 
 diff --git a/bus/Makefile.am b/bus/Makefile.am
 index 074b456..0efaa1b 100644
@@ -71,7 +68,7 @@ index 074b456..0efaa1b 100644
  AM_LDADD =                  \
  	@GOBJECT2_LIBS@         \
 diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index f13d8e0..44fe954 100644
+index 853465c..00864ac 100644
 --- a/bus/ibusimpl.c
 +++ b/bus/ibusimpl.c
 @@ -20,12 +20,17 @@
@@ -112,38 +109,120 @@ index f13d8e0..44fe954 100644
  /* functions prototype */
  static void      bus_ibus_impl_destroy           (BusIBusImpl        *ibus);
  static void      bus_ibus_impl_service_method_call
-@@ -285,6 +296,30 @@ _panel_destroy_cb (BusPanelProxy *panel,
+@@ -285,6 +296,112 @@ _panel_destroy_cb (BusPanelProxy *panel,
      g_object_unref (panel);
  }
  
-+static IBusEngineDesc *
-+_find_engine_desc_by_name (BusIBusImpl *ibus,
-+                           const gchar *engine_name)
++/**
++ * _foreach_remove_engine_hotkey:
++ *
++ * Remove the engine-specific hot key of the engine, and update ibus->engines_hotkey_profile.
++ */
++gboolean
++_foreach_remove_engine_hotkey (gpointer        key,
++                               gpointer        value,
++                               gpointer        data)
 +{
-+    IBusEngineDesc *desc = NULL;
-+    GList *p;
++    GQuark event = GPOINTER_TO_UINT (value);
++    struct _impl_and_desc {
++        BusIBusImpl    *ibus;
++        IBusEngineDesc *desc;
++    } *id = (struct _impl_and_desc *) data;
++    BusIBusImpl *ibus = id->ibus;
++    IBusEngineDesc *desc = id->desc;
++    GList *engine_list;
 +
-+    /* find engine in registered engine list */
-+    for (p = ibus->register_engine_list; p != NULL; p = p->next) {
-+        desc = (IBusEngineDesc *) p->data;
-+        if (g_strcmp0 (ibus_engine_desc_get_name (desc), engine_name) == 0)
-+            return desc;
++    g_assert (ibus != NULL);
++    g_assert (desc != NULL);
++
++    if (event == 0) {
++        return FALSE;
 +    }
 +
-+    /* find engine in preload engine list */
-+    for (p = ibus->engine_list; p != NULL; p = p->next) {
-+        desc = (IBusEngineDesc *) p->data;
-+        if (g_strcmp0 (ibus_engine_desc_get_name (desc), engine_name) == 0)
-+            return desc;
++    engine_list = g_hash_table_lookup (ibus->hotkey_to_engines_map,
++                                       GUINT_TO_POINTER (event));
++
++    /* As we will rebuild the engines hotkey map whenever an engine was
++     * added or removed, we don't need to hold a reference of the engine
++     * here. */
++    if (engine_list && g_list_find (engine_list, desc) != NULL) {
++        engine_list = g_list_remove (engine_list, desc);
 +    }
 +
-+    return NULL;
++    /* We need to steal the value before adding it back, otherwise it will
++     * be destroyed. */
++    g_hash_table_steal (ibus->hotkey_to_engines_map, GUINT_TO_POINTER (event));
++
++    if (engine_list != NULL) {
++        g_hash_table_insert (ibus->hotkey_to_engines_map,
++                             GUINT_TO_POINTER (event), engine_list);
++    }
++
++    return FALSE;
++}
++
++/**
++ * _add_engine_hotkey_with_hotkeys:
++ *
++ * Check the engine-specific hot key of the engine, and update ibus->engines_hotkey_profile.
++ */
++static void
++_add_engine_hotkey_with_hotkeys (IBusEngineDesc *engine,
++                                 BusIBusImpl    *ibus,
++                                 const gchar    *hotkeys)
++{
++    gchar **hotkey_list;
++    gchar **p;
++    gchar *hotkey;
++    GList *engine_list;
++
++    GQuark event;
++    guint keyval;
++    guint modifiers;
++
++    g_assert (engine != NULL);
++    g_assert (hotkeys && *hotkeys);
++
++    hotkey_list = g_strsplit_set (hotkeys, ";,", 0);
++
++    for (p = hotkey_list; p && *p; ++p) {
++        hotkey = g_strstrip (*p);
++        if (!*hotkey || !ibus_key_event_from_string (hotkey, &keyval, &modifiers)) {
++            continue;
++        }
++
++        /* If the hotkey already exists, we won't need to add it again. */
++        event = ibus_hotkey_profile_lookup_hotkey (ibus->engines_hotkey_profile,
++                                                   keyval, modifiers);
++        if (event == 0) {
++            event = g_quark_from_string (hotkey);
++            ibus_hotkey_profile_add_hotkey (ibus->engines_hotkey_profile,
++                                            keyval, modifiers, event);
++        }
++
++        engine_list = g_hash_table_lookup (ibus->hotkey_to_engines_map,
++                                           GUINT_TO_POINTER (event));
++
++        /* As we will rebuild the engines hotkey map whenever an engine was
++         * added or removed, we don't need to hold a reference of the engine
++         * here. */
++        engine_list = g_list_append (engine_list, engine);
++
++        /* We need to steal the value before adding it back, otherwise it will
++         * be destroyed. */
++        g_hash_table_steal (ibus->hotkey_to_engines_map, GUINT_TO_POINTER (event));
++
++        g_hash_table_insert (ibus->hotkey_to_engines_map,
++                             GUINT_TO_POINTER (event), engine_list);
++    }
++
++    g_strfreev (hotkey_list);
 +}
 +
  static void
  _config_set_value_done (GObject      *object,
                          GAsyncResult *res,
-@@ -562,6 +597,67 @@ bus_ibus_impl_set_hotkey (BusIBusImpl *i
+@@ -562,6 +679,67 @@ bus_ibus_impl_set_hotkey (BusIBusImpl *i
  
  }
  
@@ -211,7 +290,7 @@ index f13d8e0..44fe954 100644
  /**
   * bus_ibus_impl_set_trigger:
   *
-@@ -573,7 +669,15 @@ bus_ibus_impl_set_trigger (BusIBusImpl *
+@@ -573,7 +751,15 @@ bus_ibus_impl_set_trigger (BusIBusImpl *
  {
      GQuark hotkey = g_quark_from_static_string ("trigger");
      if (value != NULL) {
@@ -227,135 +306,90 @@ index f13d8e0..44fe954 100644
      }
  #ifndef OS_CHROMEOS
      else {
-@@ -1182,28 +1286,110 @@ _ibus_get_address (BusIBusImpl          
-                                            g_variant_new ("(s)", bus_server_get_address ()));
+@@ -639,6 +825,72 @@ bus_ibus_impl_set_previous_engine (BusIB
+     bus_ibus_impl_set_hotkey (ibus, hotkey, value);
  }
  
--static IBusEngineDesc *
--_find_engine_desc_by_name (BusIBusImpl *ibus,
--                           const gchar *engine_name)
--{
--    IBusEngineDesc *desc = NULL;
--    GList *p;
-+/**
-+ * _foreach_remove_engine_hotkey:
-+ *
-+ * Remove the engine-specific hot key of the engine, and update ibus->engines_hotkey_profile.
-+ */
-+gboolean
-+_foreach_remove_engine_hotkey (gpointer        key,
-+                               gpointer        value,
-+                               gpointer        data)
++#if USE_BRIDGE_HOTKEY
++static gint
++_engine_desc_name_cmp (IBusEngineDesc *desc1,
++                       IBusEngineDesc *desc2)
 +{
-+    GQuark event = GPOINTER_TO_UINT (value);
-+    struct _impl_and_desc {
-+        BusIBusImpl    *ibus;
-+        IBusEngineDesc *desc;
-+    } *id = (struct _impl_and_desc *) data;
-+    BusIBusImpl *ibus = id->ibus;
-+    IBusEngineDesc *desc = id->desc;
-+    GList *engine_list;
- 
--    /* find engine in registered engine list */
--    for (p = ibus->register_engine_list; p != NULL; p = p->next) {
--        desc = (IBusEngineDesc *) p->data;
--        if (g_strcmp0 (ibus_engine_desc_get_name (desc), engine_name) == 0)
--            return desc;
-+    g_assert (ibus != NULL);
-+    g_assert (desc != NULL);
-+
-+    if (event == 0) {
-+        return FALSE;
-     }
- 
--    /* find engine in preload engine list */
--    for (p = ibus->engine_list; p != NULL; p = p->next) {
--        desc = (IBusEngineDesc *) p->data;
--        if (g_strcmp0 (ibus_engine_desc_get_name (desc), engine_name) == 0)
--            return desc;
-+    engine_list = g_hash_table_lookup (ibus->hotkey_to_engines_map,
-+                                       GUINT_TO_POINTER (event));
-+
-+    /* As we will rebuild the engines hotkey map whenever an engine was
-+     * added or removed, we don't need to hold a reference of the engine
-+     * here. */
-+    if (engine_list && g_list_find (engine_list, desc) != NULL) {
-+        engine_list = g_list_remove (engine_list, desc);
-     }
- 
--    return NULL;
-+    /* We need to steal the value before adding it back, otherwise it will
-+     * be destroyed. */
-+    g_hash_table_steal (ibus->hotkey_to_engines_map, GUINT_TO_POINTER (event));
-+
-+    if (engine_list != NULL) {
-+        g_hash_table_insert (ibus->hotkey_to_engines_map,
-+                             GUINT_TO_POINTER (event), engine_list);
-+    }
-+
-+    return FALSE;
++    return g_strcmp0 (ibus_engine_desc_get_name (desc1),
++                      ibus_engine_desc_get_name (desc2));
 +}
 +
-+/**
-+ * _add_engine_hotkey_with_hotkeys:
-+ *
-+ * Check the engine-specific hot key of the engine, and update ibus->engines_hotkey_profile.
-+ */
 +static void
-+_add_engine_hotkey_with_hotkeys (IBusEngineDesc *engine,
-+                                 BusIBusImpl    *ibus,
-+                                 const gchar    *hotkeys)
++_set_register_engines (BusIBusImpl *ibus,
++                       GVariant    *value)
 +{
-+    gchar **hotkey_list;
-+    gchar **p;
-+    gchar *hotkey;
-+    GList *engine_list;
++    GList *engine_list = NULL;
 +
-+    GQuark event;
-+    guint keyval;
-+    guint modifiers;
-+
-+    g_assert (engine != NULL);
-+    g_assert (hotkeys && *hotkeys);
-+
-+    hotkey_list = g_strsplit_set (hotkeys, ";,", 0);
++    g_assert (BUS_IS_IBUS_IMPL (ibus));
 +
-+    for (p = hotkey_list; p && *p; ++p) {
-+        hotkey = g_strstrip (*p);
-+        if (!*hotkey || !ibus_key_event_from_string (hotkey, &keyval, &modifiers)) {
-+            continue;
++    engine_list = ibus->register_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, g_object_ref (engine));
 +        }
++    } else if (value != NULL) {
++        g_variant_unref (value);
++    }
 +
-+        /* If the hotkey already exists, we won't need to add it again. */
-+        event = ibus_hotkey_profile_lookup_hotkey (ibus->engines_hotkey_profile,
-+                                                   keyval, modifiers);
-+        if (event == 0) {
-+            event = g_quark_from_string (hotkey);
-+            ibus_hotkey_profile_add_hotkey (ibus->engines_hotkey_profile,
-+                                            keyval, modifiers, event);
++    ibus->register_engine_list = engine_list;
++
++    if (engine_list) {
++        BusComponent *component = bus_component_from_engine_desc ((IBusEngineDesc *) engine_list->data);
++        if (component && !bus_component_is_running (component)) {
++            bus_component_start (component, g_verbose);
 +        }
++    }
++}
 +
-+        engine_list = g_hash_table_lookup (ibus->hotkey_to_engines_map,
-+                                           GUINT_TO_POINTER (event));
++static void
++_set_default_keyboard_layout_engines (BusIBusImpl *ibus)
++{
++    GList *engines = NULL;
++    GList *list;
++    GVariantBuilder builder;
 +
-+        /* As we will rebuild the engines hotkey map whenever an engine was
-+         * added or removed, we don't need to hold a reference of the engine
-+         * here. */
-+        engine_list = g_list_append (engine_list, engine);
++    g_assert (BUS_IS_IBUS_IMPL (ibus));
 +
-+        /* We need to steal the value before adding it back, otherwise it will
-+         * be destroyed. */
-+        g_hash_table_steal (ibus->hotkey_to_engines_map, GUINT_TO_POINTER (event));
++    engines = bus_registry_get_engines_by_name_prefix (ibus->registry,
++                                                       DEFAULT_BRIDGE_ENGINE_NAME);
++    /* sort engines by rank */
++    engines = g_list_sort (engines, (GCompareFunc) _engine_desc_name_cmp);
 +
-+        g_hash_table_insert (ibus->hotkey_to_engines_map,
-+                             GUINT_TO_POINTER (event), engine_list);
++    g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
++    for (list = engines; list != NULL; list = list->next) {
++        IBusEngineDesc *desc = (IBusEngineDesc *)list->data;
++        g_variant_builder_add (&builder, "s", ibus_engine_desc_get_name (desc));
 +    }
++    _set_register_engines (ibus, g_variant_builder_end (&builder));
++    g_list_free (engines);
++}
++#endif
 +
-+    g_strfreev (hotkey_list);
- }
- 
  /**
-@@ -1216,7 +1402,71 @@ _context_request_engine_cb (BusInputCont
+  * bus_ibus_impl_set_preload_engines:
+  *
+@@ -658,6 +910,9 @@ bus_ibus_impl_set_preload_engines (BusIB
+             _set_preload_engines (ibus, value);
+         }
+     }
++#if USE_BRIDGE_HOTKEY
++    _set_default_keyboard_layout_engines (ibus);
++#endif
+ #else
+     _set_preload_engines (ibus, value);
+ #endif
+@@ -1216,7 +1471,71 @@ _context_request_engine_cb (BusInputCont
                              const gchar     *engine_name,
                              BusIBusImpl     *ibus)
  {
@@ -428,7 +462,22 @@ index f13d8e0..44fe954 100644
  }
  
  /**
-@@ -2270,6 +2520,9 @@ bus_ibus_impl_filter_keyboard_shortcuts 
+@@ -1255,8 +1574,13 @@ bus_ibus_impl_get_engine_desc (BusIBusIm
+         if (!desc) {
+             if (ibus->register_engine_list) {
+                 desc = (IBusEngineDesc *) ibus->register_engine_list->data;
++#if USE_BRIDGE_HOTKEY
++                if (engine_name == NULL) {
++                    desc = NULL;
++                }
++#endif
+             }
+-            else if (ibus->engine_list) {
++            if (!desc && ibus->engine_list) {
+                 desc = (IBusEngineDesc *) ibus->engine_list->data;
+             }
+         }
+@@ -2267,6 +2591,9 @@ bus_ibus_impl_filter_keyboard_shortcuts 
  
      GQuark event;
      GList *engine_list;
@@ -438,7 +487,7 @@ index f13d8e0..44fe954 100644
  
      if (trigger == 0) {
          trigger = g_quark_from_static_string ("trigger");
-@@ -2334,6 +2587,12 @@ bus_ibus_impl_filter_keyboard_shortcuts 
+@@ -2331,6 +2658,12 @@ bus_ibus_impl_filter_keyboard_shortcuts 
          return FALSE;
      }
  
@@ -451,7 +500,7 @@ index f13d8e0..44fe954 100644
      /* Then try engines hotkeys. */
      event = ibus_hotkey_profile_filter_key_event (ibus->engines_hotkey_profile,
                                                    keyval,
-@@ -2355,6 +2614,24 @@ bus_ibus_impl_filter_keyboard_shortcuts 
+@@ -2352,6 +2685,24 @@ bus_ibus_impl_filter_keyboard_shortcuts 
  
          g_assert (new_engine_desc);
  
@@ -476,7 +525,7 @@ index f13d8e0..44fe954 100644
          /* Find out what engine we should switch to. If the current engine has
           * the same hotkey, then we should switch to the next engine with the
           * same hotkey in the list. Otherwise, we just switch to the first
-@@ -2366,8 +2643,47 @@ bus_ibus_impl_filter_keyboard_shortcuts 
+@@ -2363,8 +2714,47 @@ bus_ibus_impl_filter_keyboard_shortcuts 
                  break;
              }
          }
@@ -486,7 +535,7 @@ index f13d8e0..44fe954 100644
 +        if (context == NULL) {
 +            return FALSE;
 +        }
-+
+ 
 +        /* This means RequestEngine signal might be done but SetEngine signal
 +         * has not been done yet by ibus status icon. */
 +        if (current_engine_desc == NULL &&
@@ -501,7 +550,7 @@ index f13d8e0..44fe954 100644
 +                                                              current_engine_desc);
 +                }
 +            }
- 
++
 +            /* If the previous engine is not included in engine_list and
 +             * the current engine is the defualt bridge engine,
 +             * the current engine is also not included in engine_list.
@@ -524,7 +573,7 @@ index f13d8e0..44fe954 100644
              bus_ibus_impl_set_context_engine_from_desc (ibus, context, new_engine_desc);
          }
  
-@@ -2472,59 +2788,54 @@ static void
+@@ -2468,59 +2858,54 @@ static void
  _add_engine_hotkey (IBusEngineDesc *engine, BusIBusImpl *ibus)
  {
      const gchar *hotkeys;
@@ -719,7 +768,7 @@ index bc4e096..c79e033 100644
  G_END_DECLS
  #endif
 diff --git a/bus/registry.c b/bus/registry.c
-index 7b74781..07e9148 100644
+index 7b74781..28e2abf 100644
 --- a/bus/registry.c
 +++ b/bus/registry.c
 @@ -19,6 +19,11 @@
@@ -785,6 +834,59 @@ index 7b74781..07e9148 100644
  }
  
  static void
+@@ -516,6 +552,31 @@ bus_registry_get_engines_by_language (BusRegistry *registry,
+     return engines;
+ }
+ 
++GList *
++bus_registry_get_engines_by_name_prefix (BusRegistry *registry,
++                                         const gchar *name_prefix)
++{
++    GList *p1, *p2;
++    GList *engines = NULL;
++
++    g_assert (BUS_IS_REGISTRY (registry));
++    g_assert (name_prefix);
++
++    p1 = bus_registry_get_engines (registry);
++
++    for (p2 = p1; p2 != NULL; p2 = p2->next) {
++        IBusEngineDesc *desc = (IBusEngineDesc *) p2->data;
++        if (g_ascii_strncasecmp (ibus_engine_desc_get_name (desc),
++                                 name_prefix,
++                                 strlen (name_prefix)) == 0) {
++            engines = g_list_append (engines, desc);
++        }
++    }
++
++    g_list_free (p1);
++    return engines;
++}
++
+ IBusEngineDesc *
+ bus_registry_find_engine_by_name (BusRegistry *registry,
+                                   const gchar *name)
+diff --git a/bus/registry.h b/bus/registry.h
+index cdabec0..721187c 100644
+--- a/bus/registry.h
++++ b/bus/registry.h
+@@ -73,6 +73,16 @@ GList           *bus_registry_get_engines_by_language
+                                                  const gchar    *language);
+ 
+ /**
++ * bus_registry_get_engines_by_name_prefix:
++ * @name_prefix: a prefix in the name of IBusEngineDesc. 
++ * @returns: a list of IBusEngineDesc objects which has the name prefix.
++ *           The caller has to call g_list_free for the returned list.
++ */
++GList           *bus_registry_get_engines_by_name_prefix
++                                                (BusRegistry    *registry,
++                                                 const gchar    *name_prefix);
++
++/**
+  * bus_registry_stop_all_components:
+  *
+  * Terminate all component processes.
 diff --git a/configure.ac b/configure.ac
 index 4c20ae7..21d35c3 100644
 --- a/configure.ac
@@ -844,7 +946,7 @@ diff --git a/data/Makefile.am b/data/Makefile.am
 index 99be41c..824da76 100644
 --- a/data/Makefile.am
 +++ b/data/Makefile.am
-@@ -30,7 +30,8 @@ SUBDIRS = \
+@@ -26,7 +26,8 @@ SUBDIRS = \
  	$(NULL)
  
  schemasdir = $(GCONF_SCHEMA_FILE_DIR)
@@ -854,7 +956,7 @@ index 99be41c..824da76 100644
  schemas_DATA = $(schemas_in_files:.schemas.in=.schemas)
  @INTLTOOL_SCHEMAS_RULE@
  
-@@ -45,11 +46,12 @@ if GCONF_SCHEMAS_INSTALL
+@@ -41,11 +42,12 @@ if GCONF_SCHEMAS_INSTALL
  endif
  
  EXTRA_DIST = \
@@ -869,7 +971,7 @@ index 99be41c..824da76 100644
  
  -include $(top_srcdir)/git.mk
 diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in.in
-index 7ca4899..42d9297
+index 8979515..2a2b459
 --- a/data/ibus.schemas.in
 +++ b/data/ibus.schemas.in.in
 @@ -31,7 +31,7 @@
@@ -952,7 +1054,7 @@ index 1d3cd2a..58d75e5 100644
      @method()
      def Destroy(self): pass
 diff --git a/ibus/xkbxml.py.in b/ibus/xkbxml.py.in
-index 16f47df..85d0651 100644
+index 9407c13..bf61810 100644
 --- a/ibus/xkbxml.py.in
 +++ b/ibus/xkbxml.py.in
 @@ -33,6 +33,8 @@ import enginedesc
@@ -964,11 +1066,11 @@ index 16f47df..85d0651 100644
  
  try:
      from glib import get_user_config_dir
-@@ -312,6 +314,8 @@ class XKBConfigRegistry():
+@@ -315,6 +317,8 @@ class XKBConfigRegistry():
              engine_layout = layout
  
          icon = 'ibus-engine'
-+        if name_prefix == DEFAULT_BRIDGE_ENGINE_NAME:
++        if name.startswith(DEFAULT_BRIDGE_ENGINE_NAME):
 +            icon = get_ICON_KEYBOARD()
  
          engine = enginedesc.EngineDesc(name, longname, desc, lang,
@@ -988,25 +1090,10 @@ index 7383177..d35757d 100644
              if l not in lang:
                  lang[l] = []
 diff --git a/setup/enginetreeview.py b/setup/enginetreeview.py
-index f620361..20cde3b 100644
+index f620361..664dc99 100644
 --- a/setup/enginetreeview.py
 +++ b/setup/enginetreeview.py
-@@ -162,6 +162,14 @@ class EngineTreeView(gtk.TreeView):
-             return row[0]
-         elif property.name == "engines":
-             engines = [ r[0] for r in self.__model if r[0] != None]
-+            for i, e in enumerate(self.__engines):
-+                if ibus.use_bridge_hotkey() and \
-+                   e.name.startswith(ibus.DEFAULT_BRIDGE_ENGINE_NAME):
-+                    if i < len(engines):
-+                        engines.insert(i, e)
-+                    else:
-+                        engines.append(e)
-+                    break
-             return engines
-         else:
-             raise AttributeError, 'unknown property %s' % property.name
-@@ -172,8 +180,12 @@ class EngineTreeView(gtk.TreeView):
+@@ -172,8 +172,12 @@ class EngineTreeView(gtk.TreeView):
          for e in engines:
              if e in self.__engines:
                  continue
@@ -1248,24 +1335,19 @@ index 7cf1995..a19d16e 100644
 +const gchar *    ibus_get_default_bridge_engine_name (void);
 +
  #endif
-diff --git a/ui/gtk/Makefile.am b/ui/gtk/Makefile.am
-index 1f19748..1702613 100644
---- a/ui/gtk/Makefile.am
-+++ b/ui/gtk/Makefile.am
-@@ -33,6 +33,8 @@ ui_gtk_PYTHON = \
- 	propitem.py \
- 	toolitem.py \
- 	engineabout.py \
-+	xkbengine.py \
-+	xkbfactory.py \
- 	$(NULL)
- ui_gtkdir = $(pkgdatadir)/ui/gtk
- 
 diff --git a/ui/gtk/panel.py b/ui/gtk/panel.py
-index 8804634..d87c1d2 100644
+index 8804634..f7b3e50 100644
 --- a/ui/gtk/panel.py
 +++ b/ui/gtk/panel.py
-@@ -133,6 +133,15 @@ class Panel(ibus.PanelBase):
+@@ -67,6 +67,7 @@ class Panel(ibus.PanelBase):
+         self.__data_dir = path.join(self.__prefix, "share", "ibus")
+         # self.__icons_dir = path.join(self.__data_dir, "icons")
+         self.__setup_cmd = path.join(self.__prefix, "bin", "ibus-setup")
++        self.__show = 0
+ 
+         # connect bus signal
+         self.__config.connect("value-changed", self.__config_value_changed_cb)
+@@ -133,6 +134,14 @@ class Panel(ibus.PanelBase):
          # self.__bus.request_name(ibus.panel.IBUS_SERVICE_PANEL, 0)
  
          # init xkb
@@ -1276,7 +1358,6 @@ index 8804634..d87c1d2 100644
 +        self.__disabled_engines_id = -1
 +        self.__disabled_engines_prev_id = -1
 +        self.__disabled_engines_swapped = 0
-+        self.__show = 0
 +
          self.__xkblayout = ibus.XKBLayout(self.__config)
          use_xkb = self.__config.get_value("general", "use_system_keyboard_layout", False)
@@ -1300,7 +1381,7 @@ index 8804634..d87c1d2 100644
  
      def set_cursor_location(self, x, y, w, h):
          self.__candidate_panel.set_cursor_location(x, y, w, h)
-@@ -233,12 +249,113 @@ class Panel(ibus.PanelBase):
+@@ -233,12 +249,91 @@ class Panel(ibus.PanelBase):
      def __set_im_name(self, name):
          self.__language_bar.set_im_name(name)
  
@@ -1343,37 +1424,15 @@ index 8804634..d87c1d2 100644
 +                model_desc = _("Default Layout")
 +                if model != None:
 +                    model_desc = model_desc + " (" + model + ")"
++                name = ibus.DEFAULT_BRIDGE_ENGINE_NAME + "#" + str(i)
 +                engine = registry.engine_desc_new(lang,
 +                                                  layout,
 +                                                  _("Default Layout"),
 +                                                  model,
 +                                                  model_desc,
-+                                                  ibus.DEFAULT_BRIDGE_ENGINE_NAME)
++                                                  name)
 +                self.__disabled_engines.append(engine)
 +            self.__disabled_engines_id = self.__xkblayout.get_group()
-+            if not use_bridge_hotkey:
-+                return
-+            if self.__disabled_engines != None and self.__disabled_engines != []:
-+                component = ibus.Component("org.freedesktop.IBus.XKB",
-+                                           _("XKB Component"),
-+                                           "1.0",
-+                                           "GPL",
-+                                           "Takao Fujiwara",
-+                                           "https://github.com/fujiwarat/ibus/tree/gjs")
-+                for engine in self.__disabled_engines:
-+                    component.add_engine(engine.name,
-+                                         engine.longname,
-+                                         engine.description,
-+                                         engine.language,
-+                                         engine.license,
-+                                         engine.author,
-+                                         engine.icon,
-+                                         engine.layout,
-+                                         engine.hotkeys)
-+                                       
-+                import xkbfactory
-+                self.__factory = xkbfactory.EngineFactory(self.__bus)
-+                self.__bus.register_component(component)
 +        if not use_bridge_hotkey:
 +            return
 +        if self.__disabled_engines != None and self.__disabled_engines != []:
@@ -1415,7 +1474,7 @@ index 8804634..d87c1d2 100644
          if not enabled:
              self.__set_im_icon(ICON_KEYBOARD)
              self.__set_im_name(None)
-@@ -250,7 +367,7 @@ class Panel(ibus.PanelBase):
+@@ -250,7 +345,7 @@ class Panel(ibus.PanelBase):
                  self.__set_im_icon(engine.icon)
                  self.__set_im_name(engine.longname)
                  if self.__bus.get_use_sys_layout():
@@ -1424,7 +1483,7 @@ index 8804634..d87c1d2 100644
              else:
                  self.__set_im_icon(ICON_KEYBOARD)
                  self.__set_im_name(None)
-@@ -260,6 +377,8 @@ class Panel(ibus.PanelBase):
+@@ -260,6 +355,8 @@ class Panel(ibus.PanelBase):
  
      def focus_out(self, ic):
          self.reset()
@@ -1433,7 +1492,7 @@ index 8804634..d87c1d2 100644
          self.__focus_ic = None
          self.__language_bar.set_enabled(False)
          self.__language_bar.focus_out()
-@@ -273,7 +392,21 @@ class Panel(ibus.PanelBase):
+@@ -273,7 +370,21 @@ class Panel(ibus.PanelBase):
              return
  
          enabled = self.__focus_ic.is_enabled()
@@ -1456,7 +1515,7 @@ index 8804634..d87c1d2 100644
  
          if enabled == False:
              self.reset()
-@@ -287,7 +420,7 @@ class Panel(ibus.PanelBase):
+@@ -287,7 +398,7 @@ class Panel(ibus.PanelBase):
                  self.__set_im_icon(engine.icon)
                  self.__set_im_name(engine.longname)
                  if self.__bus.get_use_sys_layout():
@@ -1465,7 +1524,7 @@ index 8804634..d87c1d2 100644
              else:
                  self.__set_im_icon(ICON_KEYBOARD)
                  self.__set_im_name(None)
-@@ -315,6 +448,7 @@ class Panel(ibus.PanelBase):
+@@ -315,6 +426,7 @@ class Panel(ibus.PanelBase):
  
      def __config_load_show(self):
          show = self.__config.get_value("panel", "show", 0)
@@ -1473,7 +1532,7 @@ index 8804634..d87c1d2 100644
          self.__language_bar.set_show(show)
  
      def __config_load_position(self):
-@@ -443,6 +577,21 @@ class Panel(ibus.PanelBase):
+@@ -443,6 +555,21 @@ class Panel(ibus.PanelBase):
      #     menu.set_take_focus(False)
      #     return menu
  
@@ -1495,7 +1554,7 @@ index 8804634..d87c1d2 100644
      def __create_im_menu(self):
          engines = self.__bus.list_active_engines()
          current_engine = \
-@@ -453,25 +602,34 @@ class Panel(ibus.PanelBase):
+@@ -453,25 +580,39 @@ class Panel(ibus.PanelBase):
          size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU)
          menu = gtk.Menu()
          for i, engine in enumerate(engines):
@@ -1511,19 +1570,24 @@ index 8804634..d87c1d2 100644
 -                item.set_image(_icon.IconWidget(ICON_ENGINE, size[0]))
 -            item.connect("activate", self.__im_menu_item_activate_cb, engine)
 -            menu.add(item)
-+            if self.__use_bridge_hotkey() and \
-+                engine.name.startswith(ibus.DEFAULT_BRIDGE_ENGINE_NAME) and \
-+                self.__disabled_engines != None:
-+                engine.is_bridge = True
-+                engine.disabled_engines_id = 0
++            if engine.name.startswith(ibus.DEFAULT_BRIDGE_ENGINE_NAME):
++                if not self.__use_bridge_hotkey():
++                    continue
++                if self.__disabled_engines == None:
++                    continue
++                engine.disabled_engines_id = -1
 +                for j, kb_engine in enumerate(self.__disabled_engines):
 +                    if engine.name == kb_engine.name:
 +                        engine.disabled_engines_id = j
 +                        break
++                if engine.disabled_engines_id == -1:
++                    continue
++                kb_engine = self.__disabled_engines[engine.disabled_engines_id]
++                kb_engine.is_bridge = True
++                kb_engine.disabled_engines_id = engine.disabled_engines_id
 +                is_bold = True if (current_engine != None and \
-+                                   current_engine.name == engine.name and \
-+                                   j == self.__disabled_engines_id) else False
-+                self.__add_engine_in_menu(menu, engine,
++                        current_engine.name == kb_engine.name) else False
++                self.__add_engine_in_menu(menu, kb_engine,
 +                                          is_bold,
 +                                          size)
 +                continue
@@ -1543,7 +1607,7 @@ index 8804634..d87c1d2 100644
  
          menu.show_all()
          menu.set_take_focus(False)
-@@ -523,8 +681,25 @@ class Panel(ibus.PanelBase):
+@@ -523,8 +664,25 @@ class Panel(ibus.PanelBase):
          if not self.__focus_ic:
              return
          if engine:
@@ -1570,7 +1634,7 @@ index 8804634..d87c1d2 100644
              self.__focus_ic.disable()
  
      def __sys_menu_item_activate_cb(self, item, command):
-@@ -573,12 +748,85 @@ class Panel(ibus.PanelBase):
+@@ -573,12 +731,85 @@ class Panel(ibus.PanelBase):
          self.__setup_pid = pid
          glib.child_watch_add(self.__setup_pid, self.__child_watch_cb)
  
@@ -1658,228 +1722,6 @@ index 8804634..d87c1d2 100644
          elif engine.layout != None and engine.layout.startswith("default"):
              return engine.layout
          else:
-diff --git a/ui/gtk/xkbengine.py b/ui/gtk/xkbengine.py
-new file mode 100644
-index 0000000..12c07cf
---- /dev/null
-+++ b/ui/gtk/xkbengine.py
-@@ -0,0 +1,93 @@
-+# vim:set et sts=4 sw=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright(c) 2011 Peng Huang <shawn.p.huang at gmail.com>
-+# Copyright(c) 2011 Takao Fujiwara <takao.fujiwara1 at gmail.com>
-+# Copyright(c) 2011 Red Hat, Inc.
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2 of the License, or(at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this program; if not, write to the
-+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+# Boston, MA  02111-1307  USA
-+
-+import ibus
-+
-+class Engine(ibus.EngineBase):
-+    def __init__(self, bus, object_path):
-+        super(Engine, self).__init__(bus, object_path)
-+
-+    def update_aux_string(self, string, attrs, visible):
-+        self.update_auxiliary_text(ibus.Text(string, attrs), visible)
-+
-+    def page_up(self):
-+        return True
-+
-+    def page_down(self):
-+        return True
-+
-+    def cursor_up(self):
-+        return True
-+
-+    def cursor_down(self):
-+        return True
-+
-+    def candidate_clicked(self, index, button, state):
-+        pass
-+
-+    if ibus.get_version() >= '1.2.0':
-+        def process_key_event(self, keyval, keycode, state):
-+            try:
-+                return self.process_key_event_internal2(keyval, keycode, state)
-+            except:
-+                import traceback
-+                traceback.print_exc()
-+                return False
-+    else:
-+        def process_key_event(self, keyval, state):
-+            try:
-+                return self.process_key_event_internal2(keyval, 0, state)
-+            except:
-+                import traceback
-+                traceback.print_exc()
-+                return False
-+
-+    def property_activate(self, prop_name, state):
-+        pass
-+
-+    def focus_in(self):
-+        pass
-+
-+    def focus_out(self):
-+        pass
-+
-+    def disable(self):
-+        pass
-+
-+    def reset(self):
-+        pass
-+
-+    def do_destroy(self):
-+        super(Engine,self).do_destroy()
-+
-+#=======================================================================
-+    @classmethod
-+    def CONFIG_RELOADED(cls, bus):
-+        print 'RELOADED'
-+
-+    @classmethod
-+    def CONFIG_VALUE_CHANGED(cls, bus, section, name, value):
-+        print 'VALUE_CHAMGED =', section, name, value
-+
-+    def process_key_event_internal2(self, keyval, keycode, state):
-+        return False
-diff --git a/ui/gtk/xkbfactory.py b/ui/gtk/xkbfactory.py
-new file mode 100644
-index 0000000..014e20b
---- /dev/null
-+++ b/ui/gtk/xkbfactory.py
-@@ -0,0 +1,117 @@
-+# vim:set et sts=4 sw=4:
-+#
-+# ibus - The Input Bus
-+#
-+# Copyright(c) 2011 Peng Huang <shawn.p.huang at gmail.com>
-+# Copyright(c) 2011 Takao Fujiwara <takao.fujiwara1 at gmail.com>
-+# Copyright(c) 2011 Red Hat, Inc.
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2 of the License, or(at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this program; if not, write to the
-+# Free Software Foundation, Inc., 59 Temple Place, Suite 330,
-+# Boston, MA  02111-1307  USA
-+
-+import ibus
-+import xkbengine
-+
-+from gettext import dgettext
-+_  = lambda a : dgettext("ibus", a)
-+N_ = lambda a : a
-+
-+
-+class EngineFactory(ibus.EngineFactoryBase):
-+    FACTORY_PATH = "/com/redhat/IBus/engines/XKB/Factory"
-+    ENGINE_PATH = "/com/redhat/IBus/engines/XKB/Engine"
-+    NAME = "XKBFactory"
-+    LANG = "en"
-+    ICON = "ibus-engine"
-+    AUTHORS = "Takao Fujiwara <takao.fujiwara1 at gmail.com>"
-+    CREDITS = "GPLv2"
-+
-+    def __init__(self, bus):
-+        self.__bus = bus
-+        super(EngineFactory, self).__init__(bus)
-+
-+        self.__id = 0
-+
-+    def create_engine(self, engine_name):
-+        if engine_name and \
-+           engine_name.startswith(ibus.DEFAULT_BRIDGE_ENGINE_NAME):
-+
-+            self.__id += 1
-+            return xkbengine.Engine(self.__bus, "%s/%d" % (self.ENGINE_PATH, self.__id))
-+        return super(EngineFactory, self).create_engine(engine_name)
-+
-+
-+def test():
-+    import gtk
-+    component = ibus.Component("org.freedesktop.IBus.XKB",
-+                               _("XKB Component"),
-+                               "1.0",
-+                               "GPL",
-+                               "Takao Fujiwara",
-+                               "https://github.com/fujiwara")
-+    engines = []
-+    engine = ibus.EngineDesc("xkb:layout:default:jp,us",
-+                             "Default Layout",
-+                             "XKB jp,us keyboard layout",
-+                             "jpn",
-+                             "LGPL2.1",
-+                             "fujiwara",
-+                             "ibus-engine",
-+                             "jp,us")
-+    engines.append(engine)
-+    engine = ibus.EngineDesc("xkb:layout:default:us",
-+                             "Default Layout",
-+                             "XKB us keyboard layout",
-+                             "eng",
-+                             "LGPL2.1",
-+                             "fujiwara",
-+                             "ibus-engine",
-+                             "us")
-+    engines.append(engine)
-+    for engine in engines:
-+        component.add_engine(engine.name,
-+                             engine.longname,
-+                             engine.description,
-+                             engine.language,
-+                             engine.license,
-+                             engine.author,
-+                             engine.icon,
-+                             engine.layout,
-+                             engine.hotkeys)
-+
-+    class TestWindow(gtk.Window):
-+        def __init__(self):
-+            super(TestWindow, self).__init__()
-+            self.__bus = ibus.Bus()
-+            self.__bus.connect("disconnected", gtk.main_quit)
-+            path = self.__bus.create_input_context("Test")
-+            self.__ic = ibus.InputContext(self.__bus, path)
-+            self.__ic.set_capabilities(9)
-+            factory = EngineFactory(self.__bus)
-+            self.__bus.register_component(component)
-+            #self.__bus.request_name("org.freedesktop.IBus.XKB", 0)
-+            self.connect("focus-in-event", self.__focus_in)
-+
-+        def __focus_in(self, widget, event):
-+            print "focused in"
-+            self.__ic.focus_in()
-+            self.__ic.set_engine(engines[0])
-+
-+    window = TestWindow()
-+    window.show_all()
-+    gtk.main()
-+
-+if __name__ == "__main__":
-+    test()
 diff --git a/xkb/Makefile.am b/xkb/Makefile.am
 index ad9cdd9..c4d5afb 100644
 --- a/xkb/Makefile.am
@@ -1893,8 +1735,59 @@ index ad9cdd9..c4d5afb 100644
          $(NULL)
  
  noinst_PROGRAMS = $(TESTS)
+diff --git a/xkb/ibus-engine-xkb-main.c b/xkb/ibus-engine-xkb-main.c
+index 0fb0f0c..4787bf2 100644
+--- a/xkb/ibus-engine-xkb-main.c
++++ b/xkb/ibus-engine-xkb-main.c
+@@ -25,6 +25,7 @@
+ #endif
+ 
+ #include <ibus.h>
++#include <glib/gi18n-lib.h>
+ #include <stdlib.h>
+ 
+ #ifdef ENABLE_NLS
+@@ -290,6 +291,9 @@ print_component ()
+     const gchar *desc;
+     gchar *output;
+     GString *str;
++#if USE_BRIDGE_HOTKEY
++    int i;
++#endif
+ 
+ #ifdef XKBLAYOUTCONFIG_FILE
+     layout_config = ibus_xkb_layout_config_new (XKBLAYOUTCONFIG_FILE);
+@@ -302,6 +306,19 @@ print_component ()
+     layout_desc = (GHashTable *) ibus_xkb_config_registry_get_layout_desc (config_registry);
+     variant_desc = (GHashTable *) ibus_xkb_config_registry_get_variant_desc (config_registry);
+     component = ibus_xkb_component_new ();
++#if USE_BRIDGE_HOTKEY
++    for (i = 0; i < 4; i++) {
++        gchar *name = g_strdup_printf ("%s#%d", DEFAULT_BRIDGE_ENGINE_NAME, i);
++        engine = ibus_xkb_engine_desc_new ("eng",
++                                           "us",
++                                           _("Default Layout"),
++                                           NULL,
++                                           NULL,
++                                           name);
++        g_free (name);
++        ibus_component_add_engine (component, engine);
++    }
++#endif
+     for (keys = g_hash_table_get_keys (layout_list); keys; keys = keys->next) {
+         if (keys->data == NULL) {
+             continue;
+@@ -390,6 +407,8 @@ main (int argc, char **argv)
+ 
+ #ifdef ENABLE_NLS
+     setlocale (LC_ALL, "");
++    bindtextdomain (GETTEXT_PACKAGE, IBUS_LOCALEDIR);
++    bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ #endif
+ 
+     g_type_init ();
 diff --git a/xkb/xkbxml.c b/xkb/xkbxml.c
-index ad10c28..968fb86 100644
+index d59a929..86bcf8f 100644
 --- a/xkb/xkbxml.c
 +++ b/xkb/xkbxml.c
 @@ -25,6 +25,7 @@
@@ -1905,15 +1798,15 @@ index ad10c28..968fb86 100644
  
  #include "xkbxml.h"
  #include "ibus.h"
-@@ -274,6 +275,7 @@ ibus_xkb_engine_desc_new (const gchar *lang,
-     gchar *longname = NULL;
+@@ -275,6 +276,7 @@ ibus_xkb_engine_desc_new (const gchar *l
      gchar *desc = NULL;
      gchar *engine_layout = NULL;
+     const gchar *name_prefix = "xkb:layout:";
 +    const gchar *icon = "ibus-engine";
  
      g_return_val_if_fail (lang != NULL && layout != NULL, NULL);
  
-@@ -298,6 +300,12 @@ ibus_xkb_engine_desc_new (const gchar *lang,
+@@ -304,6 +306,12 @@ ibus_xkb_engine_desc_new (const gchar *l
          desc = g_strdup_printf ("XKB %s keyboard layout", layout);
          engine_layout = g_strdup (layout);
      }
@@ -1926,7 +1819,7 @@ index ad10c28..968fb86 100644
  
      engine = ibus_engine_desc_new (name,
                                     longname,
-@@ -305,7 +313,7 @@ ibus_xkb_engine_desc_new (const gchar *lang,
+@@ -311,7 +319,7 @@ ibus_xkb_engine_desc_new (const gchar *l
                                     lang,
                                     "LGPL2.1",
                                     "Takao Fujiwara <takao.fujiwara1 at gmail.com>",
diff --git a/ibus-xx-factory-signal.patch b/ibus-xx-factory-signal.patch
index 04492b6..01b62c6 100644
--- a/ibus-xx-factory-signal.patch
+++ b/ibus-xx-factory-signal.patch
@@ -1,35 +1,17 @@
-From ff5db39a4651f4ecd3c2ba19dd315ed7b83662f4 Mon Sep 17 00:00:00 2001
+From 85d6a6d5d7e5673ac3bbc285589da18c48b562ae Mon Sep 17 00:00:00 2001
 From: fujiwarat <takao.fujiwara1 at gmail.com>
-Date: Fri, 5 Aug 2011 20:21:14 +0900
+Date: Sun, 14 Aug 2011 08:44:35 +0900
 Subject: [PATCH] Add create-engine signal in IBusFactory for non-C
  applications.
 
 ---
- bus/ibusimpl.c          |    6 +++-
- bus/inputcontext.c      |    5 ++++
- src/ibusfactory.c       |   54 ++++++++++++++++++++++++++++++++++++++++-------
- src/ibusfactory.h       |    7 +++++-
+ bus/inputcontext.c      |    5 ++
+ src/ibusfactory.c       |  107 ++++++++++++++++++++++++++++++++++++++++-------
+ src/ibusfactory.h       |    7 +++-
  src/ibusmarshalers.list |    1 +
- src/ibusservice.h       |    5 +--
- 6 files changed, 64 insertions(+), 14 deletions(-)
+ src/ibusservice.h       |    5 +-
+ 5 files changed, 105 insertions(+), 20 deletions(-)
 
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 853465c..f13d8e0 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -1604,8 +1604,10 @@ _ibus_register_component (BusIBusImpl           *ibus,
-                                                 g_object_ref_sink (buscomp));
-     GList *engines = bus_component_get_engines (buscomp);
-     g_list_foreach (engines, (GFunc) g_object_ref, NULL);
--    ibus->register_engine_list = g_list_concat (ibus->register_engine_list,
--                                               engines);
-+    /* We always override the register_engine_list or need to prepare
-+     * unregister_component() method so that both ibus gtk and gnome-shell
-+     * can call register_component. */
-+    ibus->register_engine_list = engines;
- 
-     g_signal_connect (buscomp, "destroy", G_CALLBACK (_component_destroy_cb), ibus);
- 
 diff --git a/bus/inputcontext.c b/bus/inputcontext.c
 index 47ac9d5..4e8cdc5 100644
 --- a/bus/inputcontext.c
@@ -47,7 +29,7 @@ index 47ac9d5..4e8cdc5 100644
              g_object_unref (engine);
              bus_input_context_enable (data->context);
 diff --git a/src/ibusfactory.c b/src/ibusfactory.c
-index 11d9a6d..f72f51e 100644
+index 11d9a6d..f28f074 100644
 --- a/src/ibusfactory.c
 +++ b/src/ibusfactory.c
 @@ -21,6 +21,7 @@
@@ -75,17 +57,82 @@ index 11d9a6d..f72f51e 100644
  /* functions prototype */
  static void      ibus_factory_destroy        (IBusFactory        *factory);
  static void      ibus_factory_set_property   (IBusFactory        *engine,
-@@ -113,6 +117,17 @@ ibus_factory_class_init (IBusFactoryClass *class)
+@@ -95,6 +99,47 @@ static const gchar introspection_xml[] =
+     "  </interface>"
+     "</node>";
+ 
++static IBusEngine *
++_ibus_factory_create_engine (IBusFactory    *factory,
++                             const gchar    *engine_name)
++{
++    GType engine_type;
++    gchar *object_path = NULL;
++    IBusEngine *engine = NULL;
++
++    engine_type = (GType) g_hash_table_lookup (factory->priv->engine_table,
++                                               engine_name);
++
++    g_return_val_if_fail (engine_type != G_TYPE_INVALID, NULL);
++
++    object_path = g_strdup_printf ("/org/freedesktop/IBus/Engine/%d",
++                                   ++factory->priv->id);
++    engine = ibus_engine_new_type (engine_type,
++                                   engine_name,
++                                   object_path,
++                                   ibus_service_get_connection ((IBusService *)factory));
++    g_free (object_path);
++
++    return engine;
++}
++
++static gboolean
++_ibus_factory_create_engine_accumulator (GSignalInvocationHint *ihint,
++                                         GValue                *return_accu,
++                                         const GValue          *handler_return,
++                                         gpointer               dummy)
++{
++    gboolean retval = TRUE;
++    GObject *object = g_value_get_object (handler_return);
++
++    if (object != NULL) {
++        g_value_copy (handler_return, return_accu);
++        retval = FALSE;
++    }
++
++    return retval;
++}
++
+ static void
+ ibus_factory_class_init (IBusFactoryClass *class)
+ {
+@@ -109,10 +154,34 @@ ibus_factory_class_init (IBusFactoryClass *class)
+     IBUS_SERVICE_CLASS (class)->service_method_call  = ibus_factory_service_method_call;
+     IBUS_SERVICE_CLASS (class)->service_get_property = ibus_factory_service_get_property;
+     IBUS_SERVICE_CLASS (class)->service_set_property = ibus_factory_service_set_property;
++    class->create_engine = _ibus_factory_create_engine;
+ 
      ibus_service_class_add_interfaces (IBUS_SERVICE_CLASS (class), introspection_xml);
  
      g_type_class_add_private (class, sizeof (IBusFactoryPrivate));
 +
++    /**
++     * IBusFactory::create-engine:
++     * @factory: the factory which received the signal
++     * @engine_name: the engine_name which received the signal
++     * @returns: (transfer none): An IBusEngine
++     *
++     * The ::create-engine signal is a signal to create IBusEngine
++     * with @engine_name, which gets emitted when IBusFactory
++     * received CreateEngine dbus method. The callback functions
++     * will be called until a callback returns a non-null object
++     * of IBusEngine. */
 +    factory_signals[CREATE_ENGINE] =
 +        g_signal_new (I_("create-engine"),
 +            G_TYPE_FROM_CLASS (gobject_class),
 +            G_SIGNAL_RUN_LAST,
 +            G_STRUCT_OFFSET (IBusFactoryClass, create_engine),
-+            NULL, NULL,
++            _ibus_factory_create_engine_accumulator,
++            NULL,
 +            _ibus_marshal_OBJECT__STRING,
 +            IBUS_TYPE_ENGINE,
 +            1,
@@ -93,32 +140,34 @@ index 11d9a6d..f72f51e 100644
  }
  
  static void
-@@ -190,8 +205,20 @@ ibus_factory_service_method_call (IBusService           *service,
+@@ -190,25 +259,23 @@ ibus_factory_service_method_call (IBusService           *service,
  
      if (g_strcmp0 (method_name, "CreateEngine") == 0) {
          gchar *engine_name = NULL;
-+        GType engine_type;
 +        IBusEngine *engine = NULL;
 +
          g_variant_get (parameters, "(&s)", &engine_name);
 -        GType engine_type = (GType )g_hash_table_lookup (factory->priv->engine_table, engine_name);
-+        engine_type = (GType) g_hash_table_lookup (factory->priv->engine_table, engine_name);
++        g_signal_emit (factory, factory_signals[CREATE_ENGINE],
++                       0, engine_name, &engine);
 +
-+        if (engine_type == G_TYPE_INVALID) {
-+            g_signal_emit (factory, factory_signals[CREATE_ENGINE],
-+                           0, engine_name, &engine);
++        if (engine != NULL) {
++            gchar *object_path = NULL;
++            GValue value = { 0, };
 +
-+            if (engine != NULL && IBUS_IS_ENGINE (engine)) {
-+                engine_type = G_OBJECT_TYPE (engine);
-+            }
-+        }
++            g_value_init (&value, G_TYPE_STRING);
++            g_object_get_property (G_OBJECT (engine), "object-path", &value);
++            object_path = g_value_dup_string (&value);
++            g_value_unset (&value);
  
-         if (engine_type == G_TYPE_INVALID) {
-             gchar *error_message = g_strdup_printf ("Can not fond engine %s", engine_name);
-@@ -201,14 +228,25 @@ ibus_factory_service_method_call (IBusService           *service,
-                                                    error_message);
-             g_free (error_message);
-         }
+-        if (engine_type == G_TYPE_INVALID) {
+-            gchar *error_message = g_strdup_printf ("Can not fond engine %s", engine_name);
+-            g_dbus_method_invocation_return_error (invocation,
+-                                                   G_DBUS_ERROR,
+-                                                   G_DBUS_ERROR_FAILED,
+-                                                   error_message);
+-            g_free (error_message);
+-        }
 -        else {
 -            gchar *object_path = g_strdup_printf ("/org/freedesktop/IBus/Engine/%d",
 -                                            ++factory->priv->id);
@@ -126,28 +175,26 @@ index 11d9a6d..f72f51e 100644
 -                                                       engine_name,
 -                                                       object_path,
 -                                                       ibus_service_get_connection ((IBusService *)factory));
-+        else  {
-+            gchar *object_path = NULL;
-+            if (engine == NULL) {
-+                object_path = g_strdup_printf ("/org/freedesktop/IBus/Engine/%d",
-+                                               ++factory->priv->id);
-+                engine = ibus_engine_new_type (engine_type,
-+                                               engine_name,
-+                                               object_path,
-+                                               ibus_service_get_connection ((IBusService *)factory));
-+            } else {
-+                GValue value = { 0, };
-+                g_value_init (&value, G_TYPE_STRING);
-+                g_object_get_property (G_OBJECT (engine), "object-path", &value);
-+                object_path = g_value_dup_string (&value);
-+                g_value_unset (&value);
-+            }
-+
              g_assert (engine != NULL);
 +            g_assert (object_path != NULL);
              g_object_ref_sink (engine);
              factory->priv->engine_list = g_list_append (factory->priv->engine_list, engine);
              g_signal_connect (engine,
+@@ -219,6 +286,14 @@ ibus_factory_service_method_call (IBusService           *service,
+                                                    g_variant_new ("(o)", object_path));
+             g_free (object_path);
+         }
++        else {
++            gchar *error_message = g_strdup_printf ("Can not fond engine %s", engine_name);
++            g_dbus_method_invocation_return_error (invocation,
++                                                   G_DBUS_ERROR,
++                                                   G_DBUS_ERROR_FAILED,
++                                                   error_message);
++            g_free (error_message);
++        }
+         return;
+     }
+ 
 diff --git a/src/ibusfactory.h b/src/ibusfactory.h
 index 47c06e0..03d1dea 100644
 --- a/src/ibusfactory.h
diff --git a/ibus.spec b/ibus.spec
index c976b89..b54d56a 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -20,7 +20,7 @@
 
 Name:       ibus
 Version:    1.3.99.20110419
-Release:    13%{?dist}
+Release:    14%{?dist}
 Summary:    Intelligent Input Bus for Linux OS
 License:    LGPLv2+
 Group:      System Environment/Libraries
@@ -28,7 +28,7 @@ URL:        http://code.google.com/p/ibus/
 Source0:    http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz
 Source1:    xinput-ibus
 %if %have_gjsfile
-Source2:    http://fujiwara.fedorapeople.org/ibus/gnome-shell/ibus-gjs-1.3.99.20110806.tar.gz
+Source2:    http://fujiwara.fedorapeople.org/ibus/gnome-shell/ibus-gjs-1.3.99.20110814.tar.gz
 %endif
 Source3:    https://www.transifex.net/projects/p/ibus/resource/master/l/da/download/ibus_master_da.po
 Patch0:     ibus-HEAD.patch
@@ -62,6 +62,9 @@ BuildRequires:  iso-codes-devel
 %if %have_libxkbfile
 BuildRequires:  libxkbfile-devel
 %endif
+# for ibus-gjs-xx.tar.gz
+BuildRequires:  gjs
+BuildRequires:  gnome-shell
 
 Requires:   %{name}-libs = %{version}-%{release}
 Requires:   %{name}-gtk2 = %{version}-%{release}
@@ -184,14 +187,6 @@ mv data/ibus.schemas.in data/ibus.schemas.in.in
 %patch91 -p1 -b .fallback-icon
 
 %build
-%if %have_gjsfile
-d=`basename %SOURCE2 .tar.gz`
-cd $d
-%configure
-make %{?_smp_mflags}
-cd ..
-%endif
-
 %if %have_libxkbfile
 aclocal -I m4
 autoheader
@@ -214,6 +209,16 @@ automake -a -c -f
 # make -C po update-gmo
 make %{?_smp_mflags}
 
+
+%if %have_gjsfile
+d=`basename %SOURCE2 .tar.gz`
+cd $d
+export PKG_CONFIG_PATH=..:/usr/lib64/pkgconfig:/usr/lib/pkgconfig
+%configure
+make %{?_smp_mflags}
+cd ..
+%endif
+
 %install
 rm -rf $RPM_BUILD_ROOT
 make DESTDIR=$RPM_BUILD_ROOT install
@@ -364,7 +369,7 @@ fi
 %{_datadir}/gtk-doc/html/*
 
 %changelog
-* Fri Aug 05 2011 Takao Fujiwara <tfujiwar at redhat.com> - 1.3.99.20110419-13
+* Fri Aug 12 2011 Takao Fujiwara <tfujiwar at redhat.com> - 1.3.99.20110419-14
 - Updated ibus-HEAD.patch for upstream.
 - Removed ibus-435880-surrounding-text.patch as upstream.
 - Added ibus-711632-fedora-fallback-icon.patch
diff --git a/sources b/sources
index 90152fa..b0f89ef 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
 d4f2729fecb92ae6b41f26c770b1a772  ibus-1.3.99.20110419.tar.gz
-b2214490304ab89d599cf72d012fde3c  ibus-gjs-1.3.99.20110806.tar.gz
+8af38ef34d99c232c73a83735afa86dd  ibus-gjs-1.3.99.20110814.tar.gz
 698c90edf0f037488e1aa969804e891f  ibus_master_da.po


More information about the scm-commits mailing list