From d566bc83a4672b88a38fa5de25741b99ebaeae62 Mon Sep 17 00:00:00 2001 From: fujiwarat Date: Fri, 20 Sep 2013 17:20:09 +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, users would prefer to load the system default engines again by login. The gsettings 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 gsettings 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'. --- data/ibus.schemas.in | 24 ++++++++++++++ setup/main.py | 70 +++++++++++++++++++++++++++++++++++---- setup/setup.ui | 22 +++++++++++-- src/ibustypes.h | 10 ++++++ ui/gtk3/panel.vala | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 210 insertions(+), 9 deletions(-) diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in index 88a287f..b6709fd 100644 --- a/data/ibus.schemas.in +++ b/data/ibus.schemas.in @@ -2,6 +2,30 @@ + /schemas/desktop/ibus/general/preload_engine_mode + /desktop/ibus/general/preload_engine_mode + ibus + int + 0 + + Preload engine mode + Preload engines are loaded with this mode. + 0 = user customized engines. + 1 = language related engines. + + + + /schemas/desktop/ibus/general/preload_engines_inited + /desktop/ibus/general/preload_engines_inited + ibus + bool + false + + The key preload_engines is initialized + The key preload_engines is initialized + + + /schemas/desktop/ibus/general/preload_engines /desktop/ibus/general/preload_engines ibus diff --git a/setup/main.py b/setup/main.py index d3f4414..235ef9c 100644 --- a/setup/main.py +++ b/setup/main.py @@ -187,16 +187,30 @@ class Setup(object): 'active', Gio.SettingsBindFlags.DEFAULT) + # set preload mode + preload_engine_mode = \ + self.__settings_general.get_int('preload-engine-mode') + button = self.__builder.get_object("checkbutton_preload_engine_mode") + hbox = self.__builder.get_object("hbox_customize_active_input_methods") + if preload_engine_mode == IBus.PreloadEngineMode.USER: + button.set_active(True) + hbox.set_sensitive(True) + else: + button.set_active(False) + hbox.set_sensitive(False) + button.connect('toggled', + self.__checkbutton_preload_engine_mode_toggled_cb) + + self.__settings_general.connect('changed::preload-engines', + self.__settings_general_preload_engines_cb) + # init engine page self.__engines = self.__bus.list_engines() self.__combobox = self.__builder.get_object("combobox_engines") self.__combobox.set_engines(self.__engines) - tmp_dict = {} - for e in self.__engines: - tmp_dict[e.get_name()] = e engine_names = self.__settings_general.get_strv('preload-engines') - 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) @@ -246,8 +260,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.get_name() not in map(lambda e: e.get_name(), self.__treeview.get_engines())) def __get_engine_setup_exec_args(self, engine): args = [] @@ -267,6 +281,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 @@ -318,6 +339,43 @@ 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(): + self.__settings_general.set_int('preload-engine-mode', + IBus.PreloadEngineMode.USER) + self.__builder.get_object( + "hbox_customize_active_input_methods").set_sensitive(True) + self.__treeview.notify('engines') + else: + message = _("The list of your saved input methods will be " \ + "cleared immediately and the list will be " \ + "configured by the login language every time. " \ + "Do you agree with this?") + 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.ResponseType.YES: + button.set_active(True) + return + self.__settings_general.set_int( + 'preload-engine-mode', + IBus.PreloadEngineMode.LANG_RELATIVE) + self.__builder.get_object( + "hbox_customize_active_input_methods").set_sensitive(False) + + def __settings_general_preload_engines_cb(self, settings, key): + engine_names = self.__settings_general.get_strv('preload-engines') + engines = self.__get_engine_descs_from_names(engine_names) + current_engines = self.__treeview.get_engines() + 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 __init_bus(self): self.__bus = IBus.Bus() if self.__bus.is_connected(): diff --git a/setup/setup.ui b/setup/setup.ui index 1638abb..72a5d57 100644 --- a/setup/setup.ui +++ b/setup/setup.ui @@ -669,7 +669,23 @@ True False - + + True + Customize active input _methods + True + True + False + Customize active input methods + True + + + False + True + 0 + + + + True False @@ -858,7 +874,7 @@ True True - 0 + 1 @@ -905,7 +921,7 @@ You may use up/down buttons to change it.</i></small> False True - 1 + 2 diff --git a/src/ibustypes.h b/src/ibustypes.h index 6d30a86..dac7f8f 100644 --- a/src/ibustypes.h +++ b/src/ibustypes.h @@ -204,6 +204,16 @@ typedef enum { } IBusError; /** + * IBusPreloadEngineMode: + * @IBUS_PRELOAD_ENGINE_MODE_USER: user custimized engines + * @IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE: language related engines. + */ +typedef enum { + IBUS_PRELOAD_ENGINE_MODE_USER = 0, + IBUS_PRELOAD_ENGINE_MODE_LANG_RELATIVE = 1, +} IBusPreloadEngineMode; + +/** * IBusRectangle: * @x: x coordinate. * @y: y coordinate. diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala index c08f6f4..9c1fef5 100644 --- a/ui/gtk3/panel.vala +++ b/ui/gtk3/panel.vala @@ -130,6 +130,10 @@ class Panel : IBus.PanelService { null); }); + m_settings_general.changed["preload-engine-mode"].connect((key) => { + update_im_engines(); + }); + m_settings_general.changed["switcher-delay-time"].connect((key) => { set_switcher_delay_time(); }); @@ -476,7 +480,96 @@ class Panel : IBus.PanelService { init_gkbd(); } + string[] preload_engines = + m_settings_general.get_strv("preload-engines"); + + bool preload_engines_inited = + m_settings_general.get_boolean("preload-engines-inited"); + + // Set preload_engines_inited = true for back compatibility + if (preload_engines.length != 0 && !preload_engines_inited) { + preload_engines_inited = true; + m_settings_general.set_boolean("preload-engines-inited", true); + } + update_xkb_engines(); + + // Before update preload_engine_mode, update_xkb_engines() is called + // because "preload-engine-mode" signal calls update_im_engines(). + if (!preload_engines_inited) + m_settings_general.set_int("preload-engine-mode", + IBus.PreloadEngineMode.LANG_RELATIVE); + + update_im_engines(); + + if (!preload_engines_inited) + m_settings_general.set_boolean("preload-engines-inited", 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 engines = m_bus.list_engines(); + string[] im_engines = {}; + + for (unowned GLib.List 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 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; + + string[] orig_preload_engines = + m_settings_general.get_strv("preload-engines"); + string[] preload_engines = {}; + + // 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_settings_general.set_strv("preload-engines", preload_engines); + + return true; + } + + private void update_im_engines() { + int preload_engine_mode = + m_settings_general.get_int("preload-engine-mode"); + + if (preload_engine_mode == IBus.PreloadEngineMode.USER) + return; + + set_lang_relative_preload_engines(); } private void update_xkb_engines() { -- 1.8.0