diff -Naur ibus-1.4.2/bus/ibusimpl.c my-ibus/bus/ibusimpl.c --- ibus-1.4.2/bus/ibusimpl.c 2012-08-22 14:16:51.000000000 +0000 +++ my-ibus/bus/ibusimpl.c 2012-09-04 09:42:47.349180087 +0000 @@ -77,6 +77,7 @@ gchar *global_previous_engine_name; /* engine-specific hotkeys */ + GVariant *saved_dynamic_hotkeys; IBusHotkeyProfile *engines_hotkey_profile; GHashTable *hotkey_to_engines_map; }; @@ -139,6 +140,9 @@ static void bus_ibus_impl_set_previous_engine (BusIBusImpl *ibus, GVariant *value); +static void bus_ibus_impl_set_dynamic_engine + (BusIBusImpl *ibus, + GVariant *value); static void bus_ibus_impl_set_preload_engines (BusIBusImpl *ibus, GVariant *value); @@ -384,6 +388,22 @@ } /** + * bus_ibus_impl_set_dynamic_engine: + * + * A function to be called when "dynamic_engine" config is updated. + */ +static void +bus_ibus_impl_set_dynamic_engine (BusIBusImpl *ibus, + GVariant *value) +{ + if (value != NULL && g_variant_classify (value) == G_VARIANT_CLASS_ARRAY) { + g_variant_ref (value); + ibus->saved_dynamic_hotkeys = value; + bus_ibus_impl_update_engines_hotkey_profile (ibus); + } +} + +/** * bus_ibus_impl_set_preload_engines: * * A function to be called when "preload_engines" config is updated. @@ -598,6 +618,7 @@ { "general/hotkey", "disable_unconditional", bus_ibus_impl_set_disable_unconditional }, { "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/hotkey", "dynamic_engine", bus_ibus_impl_set_dynamic_engine }, { "general", "preload_engines", bus_ibus_impl_set_preload_engines }, { "general", "use_system_keyboard_layout", bus_ibus_impl_set_use_sys_layout }, { "general", "use_global_engine", bus_ibus_impl_set_use_global_engine }, @@ -2337,6 +2358,39 @@ static void bus_ibus_impl_update_engines_hotkey_profile (BusIBusImpl *ibus) { + GVariantIter iter; + g_variant_iter_init (&iter, ibus->saved_dynamic_hotkeys); + const gchar *dynamic_string = NULL; + gchar **dynamic_string_list; + + while (g_variant_iter_loop (&iter, "&s", &dynamic_string)) { + GList *eng; + const gchar *engine_to_change_name, *hotkeys; + + dynamic_string_list = g_strsplit_set (dynamic_string, "=", 2); + //Checks for illegal strings + if ((! dynamic_string_list[0]) || (! dynamic_string_list[1])) { + g_strfreev (dynamic_string_list); + continue; + } + + engine_to_change_name = g_strstrip (dynamic_string_list[0]); + hotkeys = g_strstrip (dynamic_string_list[1]); + + for (eng = ibus->engine_list; eng; eng = eng->next) { + IBusEngineDesc *engine; + const gchar *engine_name; + + engine = eng->data; + engine_name = ibus_engine_desc_get_name(engine); + if (g_strcmp0 (engine_to_change_name, engine_name) == 0) { + g_object_set (G_OBJECT (engine), "hotkeys", hotkeys); + } + } + + g_strfreev (dynamic_string_list); + } + if (ibus->engines_hotkey_profile) { g_object_unref (ibus->engines_hotkey_profile); } diff -Naur ibus-1.4.2/data/ibus.schemas.in my-ibus/data/ibus.schemas.in --- ibus-1.4.2/data/ibus.schemas.in 2012-08-22 14:16:51.000000000 +0000 +++ my-ibus/data/ibus.schemas.in 2012-09-04 08:34:53.449056392 +0000 @@ -102,6 +102,20 @@ The shortcut keys for switching to the previous input method + + + /schemas/desktop/ibus/general/hotkey/dynamic_engine + /desktop/ibus/general/hotkey/dynamic_engine + ibus + list + string + [] + + Dynamic engine shortcut keys + The shortcut keys of individual IMEs, of format "IME name = shortcut; shortcut..." + + + /schemas/desktop/ibus/panel/show /desktop/ibus/panel/show diff -Naur ibus-1.4.2/setup/enginetreeview.py my-ibus/setup/enginetreeview.py --- ibus-1.4.2/setup/enginetreeview.py 2012-08-22 14:16:51.000000000 +0000 +++ my-ibus/setup/enginetreeview.py 2012-09-03 18:04:56.898908273 +0000 @@ -127,7 +127,10 @@ engine = self.__model.get_value(iter, 0) renderer.set_property("sensitive", True) language = ibus.get_language_name(engine.language) - renderer.set_property("text", "%s - %s" % (language, engine.longname)) + if (engine.hotkeys): + renderer.set_property("text", "%s - %s (%s)" % (language, engine.longname, engine.hotkeys)) + else: + renderer.set_property("text", "%s - %s" % (language, engine.longname)) if self.__model.get_path(iter)[0] == 0: # default engine renderer.set_property("weight", pango.WEIGHT_BOLD) diff -Naur ibus-1.4.2/setup/main.py my-ibus/setup/main.py --- ibus-1.4.2/setup/main.py 2012-08-22 14:16:51.000000000 +0000 +++ my-ibus/setup/main.py 2012-09-04 08:58:07.962432065 +0000 @@ -238,6 +238,9 @@ button = self.__builder.get_object("button_engine_about") button.connect("clicked", self.__button_engine_about_cb) + button = self.__builder.get_object("button_engine_hotkeys") + button.connect("clicked", self.__button_engine_hotkeys_cb) + self.__engine_setup_exec_list = {} button = self.__builder.get_object("button_engine_preferences") button.connect("clicked", self.__button_engine_preferences_cb) @@ -277,6 +280,7 @@ self.__builder.get_object("button_engine_remove").set_sensitive(engine != None) self.__builder.get_object("button_engine_about").set_sensitive(engine != None) + self.__builder.get_object("button_engine_hotkeys").set_sensitive(engine != None) self.__builder.get_object("button_engine_up").set_sensitive(engine not in engines[:1]) self.__builder.get_object("button_engine_down").set_sensitive(engine not in engines[-1:]) @@ -301,6 +305,45 @@ about.run() about.destroy() + def __button_engine_hotkeys_cb(self, button): + engine = self.__treeview.get_active_engine() + buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK) + title = _("Select keyboard shortcut for %s") % _(engine.name) + dialog = keyboardshortcut.KeyboardShortcutSelectionDialog(buttons = buttons, title = title) + text = engine.hotkeys + if text: + shortcuts = text.split("; ") + else: + shortcuts = None + dialog.set_shortcuts(shortcuts) + id = dialog.run() + shortcuts = dialog.get_shortcuts() + dialog.destroy() + if id != gtk.RESPONSE_OK: + return + text = "; ".join(shortcuts) + + existing = self.__config.get_value( + "general/hotkey", "dynamic_engine", + []) + + existing_dict = {} + for item in existing: + l = item.split('=', 1) + if len(l) == 1: # illegal format + continue + name = l[0].strip() + hot = l[1].strip() + existing_dict[name] = hot + + existing_dict[engine.name] = text + + new = [] + for name, hot in existing_dict.items(): + new.append(name + " = " + hot) + + self.__config.set_list("general/hotkey", "dynamic_engine", new, "s") + def __button_engine_preferences_cb(self, button): engine = self.__treeview.get_active_engine() args = self.__get_engine_setup_exec_args(engine) diff -Naur ibus-1.4.2/setup/setup.ui my-ibus/setup/setup.ui --- ibus-1.4.2/setup/setup.ui 2012-08-22 14:16:51.000000000 +0000 +++ my-ibus/setup/setup.ui 2012-09-03 19:53:40.669106347 +0000 @@ -727,6 +727,22 @@ + + Hotkeys + True + False + True + True + Show information of the selected input method + True + + + False + False + 5 + + + gtk-preferences True @@ -739,7 +755,7 @@ False False - 5 + 6 diff -Naur ibus-1.4.2/src/ibusenginedesc.c my-ibus/src/ibusenginedesc.c --- ibus-1.4.2/src/ibusenginedesc.c 2012-03-06 15:34:36.000000000 +0000 +++ my-ibus/src/ibusenginedesc.c 2012-09-04 09:37:35.392503948 +0000 @@ -235,7 +235,7 @@ "description hotkeys", "The hotkeys of engine description", "", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); /** * IBusEngineDesc:symbol: @@ -344,7 +344,6 @@ desc->priv->rank = g_value_get_uint (value); break; case PROP_HOTKEYS: - g_assert (desc->priv->hotkeys == NULL); desc->priv->hotkeys = g_value_dup_string (value); break; case PROP_SYMBOL: