From 7a4110c56f4378b47920aa3e2c43096f3c31306b Mon Sep 17 00:00:00 2001 From: CentOS Buildsys Date: Jul 29 2013 13:37:06 +0000 Subject: import ibus-1.5.3-1.el7.src.rpm --- diff --git a/.ibus.metadata b/.ibus.metadata new file mode 100644 index 0000000..05fb407 --- /dev/null +++ b/.ibus.metadata @@ -0,0 +1 @@ +51ba186cbf5e1e194ba0cd22b81f00d9d40ec521 SOURCES/ibus-1.5.3.tar.gz diff --git a/README.md b/README.md deleted file mode 100644 index 0e7897f..0000000 --- a/README.md +++ /dev/null @@ -1,5 +0,0 @@ -The master branch has no content - -Look at the c7 branch if you are working with CentOS-7, or the c4/c5/c6 branch for CentOS-4, 5 or 6 - -If you find this file in a distro specific branch, it means that no content has been checked in yet diff --git a/SOURCES/ibus-530711-preload-sys.patch b/SOURCES/ibus-530711-preload-sys.patch new file mode 100644 index 0000000..e90cd6b --- /dev/null +++ b/SOURCES/ibus-530711-preload-sys.patch @@ -0,0 +1,419 @@ +From 38a22f910f28d0babadd79d8430b2854281f705e Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Fri, 26 Jul 2013 11:28:51 +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 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'. +--- + data/ibus.schemas.in | 24 +++++++++ + setup/main.py | 73 ++++++++++++++++++++++++--- + setup/setup.ui | 22 +++++++-- + src/ibustypes.h | 10 ++++ + ui/gtk3/panel.vala | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++ + 5 files changed, 254 insertions(+), 11 deletions(-) + +diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in +index d0b3db8..52ece27 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 9703d5e..b39a044 100644 +--- a/setup/main.py ++++ b/setup/main.py +@@ -189,16 +189,27 @@ class Setup(object): + self.__checkbutton_use_global_engine.connect("toggled", + self.__checkbutton_use_global_engine_toggled_cb) + ++ # 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.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) + +- tmp_dict = {} +- for e in self.__engines: +- 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 = self.__get_engine_descs_from_names(engine_names) + + self.__treeview = self.__builder.get_object("treeview_engines") + self.__treeview.set_engines(engines) +@@ -242,6 +253,7 @@ class Setup(object): + self.__checkbutton_auto_start_toggled_cb) + + self.__config = self.__bus.get_config() ++ self.__config.connect("value-changed", self.__config_value_changed_cb) + + self.__init_hotkey() + self.__init_panel() +@@ -250,8 +262,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 = [] +@@ -271,6 +283,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 +@@ -323,6 +342,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", ++ variant) ++ 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 ++ variant = GLib.Variant.new_int32(IBus.PreloadEngineMode.LANG_RELATIVE) ++ self.__config.set_value("general", ++ "preload_engine_mode", ++ variant) ++ self.__builder.get_object("hbox_customize_active_input_methods").set_sensitive(False) ++ + def __init_bus(self): + self.__bus = IBus.Bus() + if self.__bus.is_connected(): +@@ -541,8 +588,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): +- pass ++ def __config_value_changed_cb(self, bus, section, name, variant): ++ if section == 'general' and name == 'preload_engines': ++ value = [] ++ if variant != None: ++ value = variant.unpack() ++ engines = self.__get_engine_descs_from_names(value) ++ 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 __config_reloaded_cb(self, bus): + pass +diff --git a/setup/setup.ui b/setup/setup.ui +index 2042263..33827f1 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 737b3e2..8ce5a16 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 fb012c3..54251e7 100644 +--- a/ui/gtk3/panel.vala ++++ b/ui/gtk3/panel.vala +@@ -413,6 +413,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", "embed_preedit_text"); + m_config.watch("general", "engines_order"); + m_config.watch("general", "switcher_delay_time"); +@@ -487,7 +489,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 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; ++ } ++ ++ 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() { +@@ -704,6 +835,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.8.0 + diff --git a/SOURCES/ibus-541492-xkb.patch b/SOURCES/ibus-541492-xkb.patch new file mode 100644 index 0000000..5edaf21 --- /dev/null +++ b/SOURCES/ibus-541492-xkb.patch @@ -0,0 +1,1950 @@ +From 53928ed24b12912fdec8e279f5e739b251a5084a Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Fri, 26 Jul 2013 11:27:37 +0900 +Subject: [PATCH] Add libgnomekbd and load preload engines. + +--- + bindings/vala/Gkbd-3.0.metadata | 1 + + bindings/vala/Makefile.am | 19 +- + bindings/vala/Xkl-1.0.metadata | 3 + + bindings/vala/gkbd.deps | 3 + + configure.ac | 40 ++++ + data/ibus.schemas.in | 59 +++++ + ibus-1.0.pc.in | 1 + + ibus.spec.in | 12 ++ + src/Makefile.am | 3 + + src/ibus.h | 1 + + src/ibusxkbxml.c | 466 ++++++++++++++++++++++++++++++++++++++++ + src/ibusxkbxml.h | 187 ++++++++++++++++ + ui/gtk3/Makefile.am | 36 ++++ + ui/gtk3/gkbdlayout.vala.false | 63 ++++++ + ui/gtk3/gkbdlayout.vala.true | 108 ++++++++++ + ui/gtk3/panel.vala | 216 ++++++++++++++++++- + ui/gtk3/xkblayout.vala | 431 +++++++++++++++++++++++++++++++++++++ + 17 files changed, 1645 insertions(+), 4 deletions(-) + create mode 100644 bindings/vala/Gkbd-3.0.metadata + create mode 100644 bindings/vala/Xkl-1.0.metadata + create mode 100644 bindings/vala/gkbd.deps + create mode 100644 src/ibusxkbxml.c + create mode 100644 src/ibusxkbxml.h + 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/bindings/vala/Gkbd-3.0.metadata b/bindings/vala/Gkbd-3.0.metadata +new file mode 100644 +index 0000000..661e6fd +--- /dev/null ++++ b/bindings/vala/Gkbd-3.0.metadata +@@ -0,0 +1 @@ ++Configuration cheader_filename="libgnomekbd/gkbd-configuration.h" +diff --git a/bindings/vala/Makefile.am b/bindings/vala/Makefile.am +index be45e41..44b3e61 100644 +--- a/bindings/vala/Makefile.am ++++ b/bindings/vala/Makefile.am +@@ -28,8 +28,6 @@ vapi_deps = \ + $(top_builddir)/src/IBus-1.0.gir \ + $(NULL) + +-ibus-1.0.vapi: $(vapi_deps) +- + VAPIGEN_VAPIS = ibus-1.0.vapi + + ibus_1_0_vapi_DEPS = gio-2.0 +@@ -39,18 +37,33 @@ ibus_1_0_vapi_FILES = \ + $(srcdir)/IBus-1.0-custom.vala \ + $(NULL) + ++if ENABLE_LIBGNOMEKBD ++ibus-1.0.vapi: $(vapi_deps) gkbd.vapi ++ ++VAPIGEN_VAPIS += gkbd.vapi ++ ++gkbd_vapi_DEPS = gtk+-3.0 glib-2.0 gmodule-2.0 ++gkbd_vapi_METADATADIRS = $(srcdir) ++gkbd_vapi_FILES = /usr/share/gir-1.0/Gkbd-3.0.gir ++else ++ibus-1.0.vapi: $(vapi_deps) ++endif ++ + vapidir = $(datadir)/vala/vapi +-vapi_DATA = $(VAPIGEN_VAPIS) $(VAPIGEN_VAPIS:.vapi=.deps) ++vapi_DATA = ibus-1.0.vapi ibus-1.0.deps + + MAINTAINERCLEANFILES = $(VAPIGEN_VAPIS) + + EXTRA_DIST = \ + $(VAPIGEN_VAPIS) \ ++ Gkbd-3.0.metadata \ ++ gkbd.deps \ + IBus-1.0.metadata \ + IBus-1.0-custom.vala \ + ibus-1.0.deps \ + config.vapi \ + xi.vapi \ ++ Xkl-1.0.metadata \ + $(NULL) + + -include $(top_srcdir)/git.mk +diff --git a/bindings/vala/Xkl-1.0.metadata b/bindings/vala/Xkl-1.0.metadata +new file mode 100644 +index 0000000..4961d0c +--- /dev/null ++++ b/bindings/vala/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/bindings/vala/gkbd.deps b/bindings/vala/gkbd.deps +new file mode 100644 +index 0000000..172632c +--- /dev/null ++++ b/bindings/vala/gkbd.deps +@@ -0,0 +1,3 @@ ++gtk+-3.0 ++glib-2.0 ++gmodule-2.0 +diff --git a/configure.ac b/configure.ac +index 45c195a..79cae77 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -242,6 +242,45 @@ else + enable_xim="no (disabled, use --enable-xim to enable)" + fi + ++# Option for XKB command. ++PKG_CHECK_MODULES(XKB, ++ [xkbfile],, ++ [XKB_LIBS="-lxkbfile"] ++) ++ ++# --enable-libgnomekbd option. ++AC_ARG_ENABLE(libgnomekbd, ++ AS_HELP_STRING([--enable-libgnomekbd], ++ [Use libgnomekbd to handle the keymaps]), ++ [enable_libgnomekbd=$enableval], ++ [enable_libgnomekbd=no] ++) ++AM_CONDITIONAL([ENABLE_LIBGNOMEKBD], [test x"$enable_libgnomekbd" = x"yes"]) ++if test x"$enable_libgnomekbd" = x"yes"; then ++ # check for libgnomekbd ++ PKG_CHECK_MODULES(LIBGNOMEKBDUI, [ ++ libgnomekbdui ++ ]) ++ PKG_CHECK_MODULES(ATK, [ ++ atk ++ ]) ++ HAVE_IBUS_GKBD=true ++else ++ enable_libgnomekbd="no (disabled, use --enable-libgnomekbd to enable)" ++ HAVE_IBUS_GKBD=false ++fi ++AC_SUBST(HAVE_IBUS_GKBD) ++ ++# Define XKB rules file ++AC_ARG_WITH(xkb-rules-xml, ++ AS_HELP_STRING([--with-xkb-rules-xml[=$DIR/evdev.xml]], ++ [Set evdev.xml file path (default: /usr/share/X11/xkb/rules/evdev.xml)]), ++ XKB_RULES_XML_FILE=$with_xkb_rules_xml, ++ XKB_RULES_XML_FILE="/usr/share/X11/xkb/rules/evdev.xml" ++) ++AC_DEFINE_UNQUOTED(XKB_RULES_XML_FILE, "$XKB_RULES_XML_FILE", ++ [Define file path of evdev.xml]) ++ + # GObject introspection + GOBJECT_INTROSPECTION_CHECK([0.6.8]) + +@@ -595,6 +634,7 @@ Build options: + Panel icon "$IBUS_ICON_KEYBOARD" + Enable surrounding-text $enable_surrounding_text + Enable libnotify $enable_libnotify ++ Build libgnomebkd $enable_libgnomekbd + Run test cases $enable_tests + ]) + +diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in +index 9cfe83b..d0b3db8 100644 +--- a/data/ibus.schemas.in ++++ b/data/ibus.schemas.in +@@ -56,6 +56,52 @@ + + + ++ /schemas/desktop/ibus/general/use_xmodmap ++ /desktop/ibus/general/use_xmodmap ++ ibus ++ bool ++ true ++ ++ Use xmodmap ++ Run xmodmap if .xmodmap/.Xmodmap exists. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkb_latin_layouts ++ /desktop/ibus/general/xkb_latin_layouts ++ ibus ++ list ++ string ++ [ara,bg,cz,dev,gr,gur,in,jp(kana),mal,mkd,ru,ua] ++ ++ Latin layout which have no ASCII ++ us layout is appended to the latin layouts. variant is not needed. ++ ++ ++ ++ /schemas/desktop/ibus/general/load_xkb_layouts ++ /desktop/ibus/general/load_xkb_layouts ++ ibus ++ list ++ string ++ [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, ++gb,ge,ge(dsb),ge(ru),ge(os),gh,gh(akan),gh(ewe),gh(fula),gh(ga),gh(hausa), ++gn,gr,hu,hr,ie,ie(CloGaelach),il, ++in, ++in(tel),in(bolnagri),iq,iq(ku),ir,ir(ku),is,it,jp, ++kg,kh,kz,la,latam,lk,lk(tam_unicode),lt,lv,ma,ma(tifinagh),mal,mao, ++me,mk,mm,mt,mv,ng,ng(hausa),ng,ng(igbo),ng(yoruba),nl,no,no(smi),np, ++pk,pl,pl(csb),pt,ro,rs,ru,ru(cv),ru(kom),ru(sah),ru(tt),ru(xal), ++se,si,sk,sy,sy(ku),th,tj,tr,ua,uz,vn ++] ++ ++ XKB layout list which is shown on ibus-setup ++ XKB layout list which is shown on ibus-setup. ++ The format is "layout" or "layout(variant)". ++ ++ ++ + /schemas/desktop/ibus/general/hotkey/trigger + /desktop/ibus/general/hotkey/trigger + ibus +@@ -80,6 +126,19 @@ + + + ++ /schemas/desktop/ibus/general/hotkey/triggers-no-modifiers ++ /desktop/ibus/general/hotkey/triggers-no-modifiers ++ ibus ++ list ++ string ++ [] ++ ++ Trigger shortcut keys without modifier keys ++ Trigger shortcut keys without modifier keys. ++ The list is used by ibus-gjs. ++ ++ ++ + /schemas/desktop/ibus/general/hotkey/enable_unconditional + /desktop/ibus/general/hotkey/enable_unconditional + ibus +diff --git a/ibus-1.0.pc.in b/ibus-1.0.pc.in +index 9f593ab..c93a0ed 100644 +--- a/ibus-1.0.pc.in ++++ b/ibus-1.0.pc.in +@@ -4,6 +4,7 @@ libdir=@libdir@ + includedir=@includedir@ + datadir=@datadir@ + pkgdatadir=@datadir@/ibus ++have_ibus_gkbd=@HAVE_IBUS_GKBD@ + + Name: IBus + Description: IBus Library +diff --git a/ibus.spec.in b/ibus.spec.in +index 334f37e..2017af9 100644 +--- a/ibus.spec.in ++++ b/ibus.spec.in +@@ -5,6 +5,7 @@ + + # Build flags + %define build_python_library 0 ++%define build_libgnomekbd 0 + + %define glib_ver %([ -a %{_libdir}/pkgconfig/glib-2.0.pc ] && pkg-config --modversion glib-2.0 | cut -d. -f 1,2 || echo -n "999") + %define gconf2_version 2.12.0 +@@ -40,6 +41,10 @@ BuildRequires: dconf-devel + BuildRequires: pygobject2-devel + BuildRequires: intltool + BuildRequires: iso-codes-devel ++%if %{build_libgnomekbd} ++BuildRequires: libxkbfile-devel ++BuildRequires: libgnomekbd-devel ++%endif + + Requires: %{name}-libs = %{version}-%{release} + Requires: %{name}-gtk2 = %{version}-%{release} +@@ -52,6 +57,9 @@ Requires: dbus-python >= %{dbus_python_version} + Requires: im-chooser >= %{im_chooser_version} + Requires: notify-python + Requires: librsvg2 ++%if %{build_libgnomekbd} ++Requires: libgnomekbd ++%endif + + Requires(post): desktop-file-utils + Requires(postun): desktop-file-utils +@@ -152,6 +160,10 @@ OPTIONS="$OPTIONS --enable-python-library" + OPTIONS="$OPTIONS --disable-python-library" + %endif + ++%if %{build_libgnomekbd} ++OPTIONS="$OPTIONS --enable-libgnomekbd" ++%endif ++ + %configure $OPTIONS + + # make -C po update-gmo +diff --git a/src/Makefile.am b/src/Makefile.am +index 74b6838..2645314 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -201,6 +201,9 @@ typelibs_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) + CLEANFILES += $(dist_gir_DATA) $(typelibs_DATA) + endif + ++ibus_sources += ibusxkbxml.c ++ibus_headers += ibusxkbxml.h ++ + # gen enum types + ibusenumtypes.h: $(ibus_headers) ibusenumtypes.h.template + $(AM_V_GEN) ( top_builddir=`cd $(top_builddir) && pwd`; \ +diff --git a/src/ibus.h b/src/ibus.h +index e27f845..4b3919c 100644 +--- a/src/ibus.h ++++ b/src/ibus.h +@@ -47,6 +47,7 @@ + #include + #include + #include ++#include + #include + #include + #include +diff --git a/src/ibusxkbxml.c b/src/ibusxkbxml.c +new file mode 100644 +index 0000000..f815e5d +--- /dev/null ++++ b/src/ibusxkbxml.c +@@ -0,0 +1,466 @@ ++/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */ ++/* vim:set et sts=4: */ ++/* bus - The Input Bus ++ * Copyright (C) 2013 Takao Fujiwara ++ * Copyright (C) 2013 Peng Huang ++ * Copyright (C) 2013 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 library; if not, write to the ++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ * Boston, MA 02111-1307, USA. ++ */ ++#ifdef HAVE_CONFIG_H ++#include ++#endif ++ ++#include ++ ++#include "ibus.h" ++#include "ibusxkbxml.h" ++ ++#ifndef XKB_RULES_XML_FILE ++#define XKB_RULES_XML_FILE "/usr/share/X11/xkb/rules/evdev.xml" ++#endif ++ ++#define IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE(o) \ ++ (G_TYPE_INSTANCE_GET_PRIVATE ((o), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryPrivate)) ++ ++typedef struct _IBusXKBConfigRegistryPrivate IBusXKBConfigRegistryPrivate; ++ ++struct _IBusXKBConfigRegistryPrivate { ++ GHashTable *layout_list; ++ GHashTable *layout_lang; ++ GHashTable *layout_desc; ++ GHashTable *variant_desc; ++}; ++ ++ ++/* functions prototype */ ++static void ibus_xkb_config_registry_destroy ++ (IBusXKBConfigRegistry *xkb_config); ++ ++G_DEFINE_TYPE (IBusXKBConfigRegistry, ibus_xkb_config_registry, IBUS_TYPE_OBJECT) ++ ++static void ++parse_xkb_xml_languagelist_node (IBusXKBConfigRegistryPrivate *priv, ++ XMLNode *parent_node, ++ const gchar *layout_name) ++{ ++ XMLNode *node = parent_node; ++ XMLNode *sub_node; ++ GList *p; ++ GList *lang_list = NULL; ++ ++ g_assert (node != NULL); ++ g_assert (layout_name != NULL); ++ for (p = node->sub_nodes; p; p = p->next) { ++ sub_node = (XMLNode *) p->data; ++ if (g_strcmp0 (sub_node->name, "iso639Id") == 0) { ++ lang_list = g_list_append (lang_list, ++ (gpointer) g_strdup (sub_node->text)); ++ continue; ++ } ++ } ++ if (lang_list == NULL) { ++ /* some nodes have no lang */ ++ return; ++ } ++ if (g_hash_table_lookup (priv->layout_lang, layout_name) != NULL) { ++ g_warning ("duplicated name %s exists", layout_name); ++ return; ++ } ++ g_hash_table_insert (priv->layout_lang, ++ (gpointer) g_strdup (layout_name), ++ (gpointer) lang_list); ++} ++ ++static const gchar * ++parse_xkb_xml_configitem_node (IBusXKBConfigRegistryPrivate *priv, ++ XMLNode *parent_node) ++{ ++ XMLNode *node = parent_node; ++ XMLNode *sub_node; ++ GList *p; ++ gchar *name = NULL; ++ gchar *description = NULL; ++ ++ g_assert (node != NULL); ++ for (p = node->sub_nodes; p; p = p->next) { ++ sub_node = (XMLNode *) p->data; ++ if (g_strcmp0 (sub_node->name, "name") == 0) { ++ name = sub_node->text; ++ continue; ++ } ++ if (g_strcmp0 (sub_node->name, "description") == 0) { ++ description = sub_node->text; ++ continue; ++ } ++ if (g_strcmp0 (sub_node->name, "languageList") == 0) { ++ if (name == NULL) { ++ g_warning ("layout name is NULL in node %s", node->name); ++ continue; ++ } ++ parse_xkb_xml_languagelist_node (priv, sub_node, name); ++ continue; ++ } ++ } ++ if (name == NULL) { ++ g_warning ("No name in layout node"); ++ return NULL; ++ } ++ if (g_hash_table_lookup (priv->layout_desc, name) != NULL) { ++ g_warning ("duplicated name %s exists", name); ++ return name; ++ } ++ g_hash_table_insert (priv->layout_desc, ++ (gpointer) g_strdup (name), ++ (gpointer) g_strdup (description)); ++ ++ return name; ++} ++ ++static const gchar * ++parse_xkb_xml_variant_configitem_node (IBusXKBConfigRegistryPrivate *priv, ++ XMLNode *parent_node, ++ const gchar *layout_name) ++{ ++ XMLNode *node = parent_node; ++ XMLNode *sub_node; ++ GList *p; ++ gchar *name = NULL; ++ gchar *description = NULL; ++ gchar *variant_lang_name = NULL; ++ ++ g_assert (node != NULL); ++ g_assert (layout_name != NULL); ++ for (p = node->sub_nodes; p; p = p->next) { ++ sub_node = (XMLNode *) p->data; ++ if (g_strcmp0 (sub_node->name, "name") == 0) { ++ name = sub_node->text; ++ continue; ++ } ++ if (g_strcmp0 (sub_node->name, "description") == 0) { ++ description = sub_node->text; ++ continue; ++ } ++ if (g_strcmp0 (sub_node->name, "languageList") == 0) { ++ if (name == NULL) { ++ g_warning ("layout name is NULL in node %s", node->name); ++ continue; ++ } ++ variant_lang_name = g_strdup_printf ("%s(%s)", layout_name, name); ++ parse_xkb_xml_languagelist_node (priv, sub_node, variant_lang_name); ++ g_free (variant_lang_name); ++ continue; ++ } ++ } ++ if (name == NULL) { ++ g_warning ("No name in layout node"); ++ return NULL; ++ } ++ if (g_hash_table_lookup (priv->variant_desc, name) != NULL) { ++ /* This is an expected case. */ ++ return name; ++ } ++ variant_lang_name = g_strdup_printf ("%s(%s)", layout_name, name); ++ g_hash_table_insert (priv->variant_desc, ++ (gpointer) variant_lang_name, ++ (gpointer) g_strdup (description)); ++ return name; ++} ++ ++static const gchar * ++parse_xkb_xml_variant_node (IBusXKBConfigRegistryPrivate *priv, ++ XMLNode *parent_node, ++ const gchar *layout_name) ++{ ++ XMLNode *node = parent_node; ++ XMLNode *sub_node; ++ GList *p; ++ const gchar *variant_name = NULL; ++ ++ g_assert (node != NULL); ++ g_assert (layout_name != NULL); ++ for (p = node->sub_nodes; p; p = p->next) { ++ sub_node = (XMLNode *) p->data; ++ if (g_strcmp0 (sub_node->name, "configItem") == 0) { ++ variant_name = parse_xkb_xml_variant_configitem_node (priv, sub_node, layout_name); ++ continue; ++ } ++ } ++ return variant_name; ++} ++ ++static GList * ++parse_xkb_xml_variantlist_node (IBusXKBConfigRegistryPrivate *priv, ++ XMLNode *parent_node, ++ const gchar *layout_name, ++ GList *variant_list) ++{ ++ XMLNode *node = parent_node; ++ XMLNode *sub_node; ++ GList *p; ++ const gchar *variant_name = NULL; ++ ++ g_assert (node != NULL); ++ g_assert (layout_name != NULL); ++ for (p = node->sub_nodes; p; p = p->next) { ++ sub_node = (XMLNode *) p->data; ++ if (g_strcmp0 (sub_node->name, "variant") == 0) { ++ variant_name = parse_xkb_xml_variant_node (priv, sub_node, layout_name); ++ if (variant_name != NULL) { ++ variant_list = g_list_append (variant_list, ++ (gpointer) g_strdup (variant_name)); ++ } ++ continue; ++ } ++ } ++ return variant_list; ++} ++ ++static void ++parse_xkb_xml_layout_node (IBusXKBConfigRegistryPrivate *priv, ++ XMLNode *parent_node) ++{ ++ XMLNode *node = parent_node; ++ XMLNode *sub_node; ++ GList *p; ++ const gchar *name = NULL; ++ GList *variant_list = NULL; ++ ++ g_assert (node != NULL); ++ for (p = node->sub_nodes; p; p = p->next) { ++ sub_node = (XMLNode *) p->data; ++ if (g_strcmp0 (sub_node->name, "configItem") == 0) { ++ name = parse_xkb_xml_configitem_node (priv, sub_node); ++ continue; ++ } ++ if (g_strcmp0 (sub_node->name, "variantList") == 0) { ++ if (name == NULL) { ++ g_warning ("layout name is NULL in node %s", node->name); ++ continue; ++ } ++ variant_list = parse_xkb_xml_variantlist_node (priv, sub_node, ++ name, ++ variant_list); ++ continue; ++ } ++ } ++ if (g_hash_table_lookup (priv->layout_list, name) != NULL) { ++ g_warning ("duplicated name %s exists", name); ++ return; ++ } ++ g_hash_table_insert (priv->layout_list, ++ (gpointer) g_strdup (name), ++ (gpointer) variant_list); ++} ++ ++static void ++parse_xkb_xml_top_node (IBusXKBConfigRegistryPrivate *priv, ++ XMLNode *parent_node) ++{ ++ XMLNode *node = parent_node; ++ XMLNode *sub_node; ++ GList *p; ++ ++ g_assert (priv != NULL); ++ g_assert (node != NULL); ++ ++ if (g_strcmp0 (node->name, "xkbConfigRegistry") != 0) { ++ g_warning ("node has no xkbConfigRegistry name"); ++ return; ++ } ++ for (p = node->sub_nodes; p; p = p->next) { ++ sub_node = (XMLNode *) p->data; ++ if (g_strcmp0 (sub_node->name, "layoutList") == 0) { ++ break; ++ } ++ } ++ if (p == NULL) { ++ g_warning ("xkbConfigRegistry node has no layoutList node"); ++ return; ++ } ++ node = sub_node; ++ for (p = node->sub_nodes; p; p = p->next) { ++ sub_node = (XMLNode *) p->data; ++ if (g_strcmp0 (sub_node->name, "layout") == 0) { ++ parse_xkb_xml_layout_node (priv, sub_node); ++ continue; ++ } ++ } ++} ++ ++static void ++free_lang_list (GList *list) ++{ ++ GList *l = list; ++ while (l) { ++ g_free (l->data); ++ l->data = NULL; ++ l = l->next; ++ } ++ g_list_free (list); ++} ++ ++static void ++parse_xkb_config_registry_file (IBusXKBConfigRegistryPrivate *priv, ++ const gchar *file) ++{ ++ XMLNode *node; ++ ++ g_assert (file != NULL); ++ ++ priv->layout_list = g_hash_table_new_full (g_str_hash, ++ (GEqualFunc) g_str_equal, ++ (GDestroyNotify) g_free, ++ (GDestroyNotify) free_lang_list); ++ priv->layout_desc = g_hash_table_new_full (g_str_hash, ++ (GEqualFunc) g_str_equal, ++ (GDestroyNotify) g_free, ++ (GDestroyNotify) g_free); ++ priv->layout_lang = g_hash_table_new_full (g_str_hash, ++ (GEqualFunc) g_str_equal, ++ (GDestroyNotify) g_free, ++ (GDestroyNotify) free_lang_list); ++ priv->variant_desc = g_hash_table_new_full (g_str_hash, ++ (GEqualFunc) g_str_equal, ++ (GDestroyNotify) g_free, ++ (GDestroyNotify) g_free); ++ node = ibus_xml_parse_file (file); ++ parse_xkb_xml_top_node (priv, node); ++ ibus_xml_free (node); ++} ++ ++static void ++ibus_xkb_config_registry_init (IBusXKBConfigRegistry *xkb_config) ++{ ++ IBusXKBConfigRegistryPrivate *priv; ++ const gchar *file = XKB_RULES_XML_FILE; ++ ++ priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config); ++ parse_xkb_config_registry_file (priv, file); ++} ++ ++static void ++ibus_xkb_config_registry_destroy (IBusXKBConfigRegistry *xkb_config) ++{ ++ IBusXKBConfigRegistryPrivate *priv; ++ ++ g_return_if_fail (xkb_config != NULL); ++ ++ priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config); ++ ++ g_hash_table_destroy (priv->layout_list); ++ priv->layout_list = NULL; ++ g_hash_table_destroy (priv->layout_lang); ++ priv->layout_lang= NULL; ++ g_hash_table_destroy (priv->layout_desc); ++ priv->layout_desc= NULL; ++ g_hash_table_destroy (priv->variant_desc); ++ priv->variant_desc = NULL; ++ ++ IBUS_OBJECT_CLASS(ibus_xkb_config_registry_parent_class)->destroy (IBUS_OBJECT (xkb_config)); ++} ++ ++static void ++ibus_xkb_config_registry_class_init (IBusXKBConfigRegistryClass *klass) ++{ ++ IBusObjectClass *ibus_object_class = IBUS_OBJECT_CLASS (klass); ++ ++ g_type_class_add_private (klass, sizeof (IBusXKBConfigRegistryPrivate)); ++ ++ ibus_object_class->destroy = (IBusObjectDestroyFunc) ibus_xkb_config_registry_destroy; ++} ++ ++IBusXKBConfigRegistry * ++ibus_xkb_config_registry_new (void) ++{ ++ IBusXKBConfigRegistry *xkb_config; ++ ++ xkb_config = IBUS_XKB_CONFIG_REGISTRY (g_object_new (IBUS_TYPE_XKB_CONFIG_REGISTRY, NULL)); ++ return xkb_config; ++} ++ ++#define TABLE_FUNC(field_name) const GHashTable * \ ++ibus_xkb_config_registry_get_##field_name (IBusXKBConfigRegistry *xkb_config) \ ++{ \ ++ IBusXKBConfigRegistryPrivate *priv; \ ++ \ ++ g_return_val_if_fail (xkb_config != NULL, NULL); \ ++ priv = IBUS_XKB_CONFIG_REGISTRY_GET_PRIVATE (xkb_config); \ ++ return priv->field_name; \ ++} ++ ++TABLE_FUNC (layout_list) ++TABLE_FUNC (layout_lang) ++TABLE_FUNC (layout_desc) ++TABLE_FUNC (variant_desc) ++ ++#undef TABLE_FUNC ++ ++GList * ++ibus_xkb_config_registry_layout_list_get_layouts (IBusXKBConfigRegistry *xkb_config) ++{ ++ GHashTable *table; ++ GList *list = NULL; ++ ++ table = (GHashTable *) ++ ibus_xkb_config_registry_get_layout_list (xkb_config); ++ list = (GList *) g_hash_table_get_keys (table); ++ return list; ++} ++ ++/* vala could use GLib.List for the returned pointer and ++ * the declaration calls g_list_foreach (retval, g_free, NULL). ++ * When I think about GLib.List v.s. GLib.List, probably ++ * I think GLib.List is better for the function and set ++ * g_strdup() here. I do not know about GJS implementation. ++ */ ++#define TABLE_LOOKUP_LIST_FUNC(field_name, value) GList * \ ++ibus_xkb_config_registry_##field_name##_get_##value (IBusXKBConfigRegistry *xkb_config, const gchar *key) \ ++{ \ ++ GHashTable *table; \ ++ GList *list = NULL; \ ++ GList *retval= NULL; \ ++ GList *p = NULL; \ ++ \ ++ table = (GHashTable *) \ ++ ibus_xkb_config_registry_get_##field_name (xkb_config); \ ++ list = (GList *) g_hash_table_lookup (table, key); \ ++ retval = g_list_copy (list); \ ++ for (p = retval; p; p = p->next) { \ ++ p->data = g_strdup (p->data); \ ++ } \ ++ return retval; \ ++} ++ ++#define TABLE_LOOKUP_STRING_FUNC(field_name, value) gchar * \ ++ibus_xkb_config_registry_##field_name##_get_##value (IBusXKBConfigRegistry *xkb_config, const gchar *key) \ ++{ \ ++ GHashTable *table; \ ++ const gchar *desc = NULL; \ ++ \ ++ table = (GHashTable *) \ ++ ibus_xkb_config_registry_get_##field_name (xkb_config); \ ++ desc = (const gchar *) g_hash_table_lookup (table, key); \ ++ return g_strdup (desc); \ ++} ++ ++TABLE_LOOKUP_LIST_FUNC (layout_list, variants) ++TABLE_LOOKUP_LIST_FUNC (layout_lang, langs) ++TABLE_LOOKUP_STRING_FUNC (layout_desc, desc) ++TABLE_LOOKUP_STRING_FUNC (variant_desc, desc) ++ ++#undef TABLE_LOOKUP_LIST_FUNC ++#undef TABLE_LOOKUP_STRING_FUNC +diff --git a/src/ibusxkbxml.h b/src/ibusxkbxml.h +new file mode 100644 +index 0000000..5aa486d +--- /dev/null ++++ b/src/ibusxkbxml.h +@@ -0,0 +1,187 @@ ++/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */ ++/* vim:set et sts=4: */ ++/* bus - The Input Bus ++ * Copyright (C) 2013 Takao Fujiwara ++ * Copyright (C) 2013 Peng Huang ++ * Copyright (C) 2013 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 library; if not, write to the ++ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++ * Boston, MA 02111-1307, USA. ++ */ ++#ifndef __IBUS_XKBXML_H_ ++#define __IBUS_XKBXML_H_ ++ ++#if !defined (__IBUS_H_INSIDE__) && !defined (IBUS_COMPILATION) ++#error "Only can be included directly" ++#endif ++ ++#include "ibus.h" ++ ++/* ++ * Type macros. ++ */ ++/* define IBusXKBConfigRegistry macros */ ++#define IBUS_TYPE_XKB_CONFIG_REGISTRY \ ++ (ibus_xkb_config_registry_get_type ()) ++#define IBUS_XKB_CONFIG_REGISTRY(obj) \ ++ (G_TYPE_CHECK_INSTANCE_CAST ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistry)) ++#define IBUS_XKB_CONFIG_REGISTRY_CLASS(klass) \ ++ (G_TYPE_CHECK_CLASS_CAST ((klass), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryClass)) ++#define IBUS_IS_XKB_CONFIG_REGISTRY(obj) \ ++ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY)) ++#define IBUS_IS_XKB_CONFIG_REGISTRY_CLASS(klass) \ ++ (G_TYPE_CHECK_CLASS_TYPE ((klass), IBUS_TYPE_XKB_CONFIG_REGISTRY)) ++#define IBUS_XKB_CONFIG_REGISTRY_GET_CLASS(obj) \ ++ (G_TYPE_INSTANCE_GET_CLASS ((obj), IBUS_TYPE_XKB_CONFIG_REGISTRY, IBusXKBConfigRegistryClass)) ++ ++G_BEGIN_DECLS ++ ++typedef struct _IBusXKBConfigRegistry IBusXKBConfigRegistry; ++typedef struct _IBusXKBConfigRegistryClass IBusXKBConfigRegistryClass; ++ ++struct _IBusXKBConfigRegistry { ++ IBusObject parent; ++}; ++ ++struct _IBusXKBConfigRegistryClass { ++ IBusObjectClass parent; ++ /* signals */ ++ /*< private >*/ ++ /* padding */ ++ gpointer pdummy[8]; ++}; ++ ++ ++GType ibus_xkb_config_registry_get_type ++ (void); ++ ++/** ++ * ibus_xkb_config_registry_new: ++ * @returns: A newly allocated IBusXKBConfigRegistry ++ * ++ * New an IBusXKBConfigRegistry. ++ */ ++IBusXKBConfigRegistry * ++ ibus_xkb_config_registry_new ++ (void); ++ ++/** ++ * ibus_xkb_config_registry_get_layout_list: (skip) ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @returns: A const GHashTable ++ * ++ * a const GHashTable ++ */ ++const GHashTable * ++ ibus_xkb_config_registry_get_layout_list ++ (IBusXKBConfigRegistry *xkb_config); ++ ++/** ++ * ibus_xkb_config_registry_get_layout_lang: (skip) ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @returns: A const GHashTable ++ * ++ * a const GHashTable ++ */ ++const GHashTable * ++ ibus_xkb_config_registry_get_layout_lang ++ (IBusXKBConfigRegistry *xkb_config); ++ ++/** ++ * ibus_xkb_config_registry_get_layout_desc: (skip) ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @returns: A const GHashTable ++ * ++ * a const GHashTable ++ */ ++const GHashTable * ++ ibus_xkb_config_registry_get_layout_desc ++ (IBusXKBConfigRegistry *xkb_config); ++ ++/** ++ * ibus_xkb_config_registry_get_variant_desc: (skip) ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @returns: A const GHashTable ++ * ++ * a const GHashTable ++ */ ++const GHashTable * ++ ibus_xkb_config_registry_get_variant_desc ++ (IBusXKBConfigRegistry *xkb_config); ++ ++/** ++ * ibus_xkb_config_registry_layout_list_get_layouts: ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @returns: (transfer container) (element-type utf8): A GList of layouts ++ * ++ * a GList of layouts ++ */ ++GList * ++ ibus_xkb_config_registry_layout_list_get_layouts ++ (IBusXKBConfigRegistry *xkb_config); ++ ++/** ++ * ibus_xkb_config_registry_layout_list_get_variants: ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @layout: A layout. ++ * @returns: (transfer container) (element-type utf8): A GList ++ * ++ * a GList ++ */ ++GList * ++ ibus_xkb_config_registry_layout_list_get_variants ++ (IBusXKBConfigRegistry *xkb_config, ++ const gchar *layout); ++ ++/** ++ * ibus_xkb_config_registry_layout_lang_get_langs: ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @layout: A layout. ++ * @returns: (transfer container) (element-type utf8): A GList ++ * ++ * a GList ++ */ ++GList * ++ ibus_xkb_config_registry_layout_lang_get_langs ++ (IBusXKBConfigRegistry *xkb_config, ++ const gchar *layout); ++ ++/** ++ * ibus_xkb_config_registry_layout_desc_get_desc: ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @layout: A layout. ++ * @returns: A layout description ++ * ++ * a layout description ++ */ ++gchar * ++ ibus_xkb_config_registry_layout_desc_get_desc ++ (IBusXKBConfigRegistry *xkb_config, ++ const gchar *layout); ++ ++/** ++ * ibus_xkb_config_registry_variant_desc_get_desc: ++ * @xkb_config: An IBusXKBConfigRegistry. ++ * @variant: A variant. ++ * @returns: A variant description ++ * ++ * a variant description ++ */ ++gchar * ++ ibus_xkb_config_registry_variant_desc_get_desc ++ (IBusXKBConfigRegistry *xkb_config, ++ const gchar *variant); ++G_END_DECLS ++#endif +diff --git a/ui/gtk3/Makefile.am b/ui/gtk3/Makefile.am +index 97c915c..5d53836 100644 +--- a/ui/gtk3/Makefile.am ++++ b/ui/gtk3/Makefile.am +@@ -44,6 +44,8 @@ AM_CPPFLAGS = \ + + USE_SYMBOL_ICON = FALSE + ++HAVE_IBUS_GKBD_C = $(strip $(subst false, FALSE, $(subst true, TRUE, $(HAVE_IBUS_GKBD)))) ++ + AM_CFLAGS = \ + @GLIB2_CFLAGS@ \ + @GIO2_CFLAGS@ \ +@@ -54,6 +56,8 @@ AM_CFLAGS = \ + -DBINDIR=\"$(bindir)\" \ + -DIBUS_DISABLE_DEPRECATED \ + -DSWITCHER_USE_SYMBOL_ICON=$(USE_SYMBOL_ICON) \ ++ -DHAVE_IBUS_GKBD=$(HAVE_IBUS_GKBD_C) \ ++ -DXKB_LAYOUTS_MAX_LENGTH=4 \ + -Wno-unused-variable \ + -Wno-unused-but-set-variable \ + -Wno-unused-function \ +@@ -97,12 +101,40 @@ AM_VALAFLAGS += \ + $(NULL) + endif + ++if ENABLE_LIBGNOMEKBD ++AM_CFLAGS += \ ++ @LIBGNOMEKBDUI_CFLAGS@ \ ++ @ATK_CFLAGS@ \ ++ $(NULL) ++ ++AM_LDADD += \ ++ @LIBGNOMEKBDUI_LIBS@ \ ++ @ATK_LIBS@ \ ++ $(NULL) ++ ++AM_VALAFLAGS += \ ++ --vapidir=. \ ++ --metadatadir=$(top_srcdir)/bindings/vala \ ++ --pkg=glib-2.0 \ ++ --pkg=gmodule-2.0 \ ++ --pkg=gkbd \ ++ --pkg=Xkl-1.0 \ ++ $(NULL) ++ ++$(srcdir)/gkbdlayout.vala: $(top_builddir)/bindings/vala/gkbd.vapi ++ @cp $(srcdir)/gkbdlayout.vala.true $(srcdir)/gkbdlayout.vala ++else ++$(srcdir)/gkbdlayout.vala: ++ @cp $(srcdir)/gkbdlayout.vala.false $(srcdir)/gkbdlayout.vala ++endif ++ + libexec_PROGRAMS = ibus-ui-gtk3 + + ibus_ui_gtk3_SOURCES = \ + application.vala \ + candidatearea.vala \ + candidatepanel.vala \ ++ gkbdlayout.vala \ + handle.vala \ + iconwidget.vala \ + keybindingmanager.vala \ +@@ -111,6 +143,7 @@ ibus_ui_gtk3_SOURCES = \ + property.vala \ + separator.vala \ + switcher.vala \ ++ xkblayout.vala \ + $(NULL) + + ibus_ui_gtk3_LDADD = \ +@@ -119,9 +152,12 @@ ibus_ui_gtk3_LDADD = \ + + CLEANFILES = \ + gtkpanel.xml \ ++ gkbdlayout.vala \ + $(NULL) + + EXTRA_DIST = \ ++ gkbdlayout.vala.false \ ++ gkbdlayout.vala.true \ + gtkpanel.xml.in \ + $(NULL) + +diff --git a/ui/gtk3/gkbdlayout.vala.false b/ui/gtk3/gkbdlayout.vala.false +new file mode 100644 +index 0000000..506aff2 +--- /dev/null ++++ b/ui/gtk3/gkbdlayout.vala.false +@@ -0,0 +1,63 @@ ++/* vim:set et sts=4 sw=4: ++ * ++ * ibus - The Input Bus ++ * ++ * Copyright(c) 2013 Red Hat, Inc. ++ * Copyright(c) 2013 Peng Huang ++ * Copyright(c) 2013 Takao Fujiwara ++ * ++ * 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 ++ */ ++ ++public class GkbdLayout ++{ ++ public signal void changed(); ++ public signal void group_changed (int object); ++ ++ public GkbdLayout() { ++ } ++ ++ public string[] get_layouts() { ++ return new string[0]; ++ } ++ ++ public string[] get_group_names() { ++ return new string[0]; ++ } ++ ++ public void lock_group(int id) { ++ } ++ ++ public void start_listen() { ++ } ++ ++ public void stop_listen() { ++ } ++ ++ /* ++ public static int main(string[] args) { ++ GkbdLayout ibus_layouts = new GkbdLayout(); ++ ++ string[] layouts = ibus_layouts.get_layouts(); ++ string[] names = ibus_layouts.get_group_names(); ++ for (int i = 0; layouts != null && i < layouts.length; i++) { ++ stdout.printf("%s %s\n", layouts[i], names[i]); ++ } ++ ++ return 0; ++ } ++ */ ++} +diff --git a/ui/gtk3/gkbdlayout.vala.true b/ui/gtk3/gkbdlayout.vala.true +new file mode 100644 +index 0000000..a6e0f8d +--- /dev/null ++++ b/ui/gtk3/gkbdlayout.vala.true +@@ -0,0 +1,108 @@ ++/* vim:set et sts=4 sw=4: ++ * ++ * ibus - The Input Bus ++ * ++ * Copyright(c) 2013 Red Hat, Inc. ++ * Copyright(c) 2013 Peng Huang ++ * Copyright(c) 2013 Takao Fujiwara ++ * ++ * 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 ++ */ ++ ++public class GkbdLayout ++{ ++ public signal void changed(); ++ public signal void group_changed (int object); ++ ++ private Gkbd.Configuration m_config = null; ++ ++ public GkbdLayout() { ++ m_config = Gkbd.Configuration.get(); ++ if (m_config != null) { ++ m_config.changed.connect(config_changed_cb); ++ m_config.group_changed.connect(config_group_changed_cb); ++ } ++ } ++ ++ ~GkbdLayout() { ++ if (m_config != null) { ++ m_config.changed.disconnect(config_changed_cb); ++ m_config.group_changed.disconnect(config_group_changed_cb); ++ /* gkbd_configuration_get reuses the object and do not ++ * destroy m_config here. */ ++ m_config.ref(); ++ m_config = null; ++ } ++ } ++ ++ private void config_changed_cb() { ++ changed(); ++ } ++ ++ private void config_group_changed_cb(int object) { ++ group_changed(object); ++ } ++ ++ public string[] get_layouts() { ++ if (m_config == null) { ++ return new string[0]; ++ } ++ return m_config.get_short_group_names(); ++ } ++ ++ public string[] get_group_names() { ++ if (m_config == null) { ++ return new string[0]; ++ } ++ return m_config.get_group_names(); ++ } ++ ++ public void lock_group(int id) { ++ if (m_config == null) { ++ return; ++ } ++ m_config.lock_group(id); ++ } ++ ++ public void start_listen() { ++ if (m_config == null) { ++ return; ++ } ++ m_config.start_listen(); ++ } ++ ++ public void stop_listen() { ++ if (m_config == null) { ++ return; ++ } ++ m_config.stop_listen(); ++ } ++ ++ /* ++ public static int main(string[] args) { ++ Gtk.init(ref args); ++ GkbdLayout ibus_layouts = new GkbdLayout(); ++ ++ string[] layouts = ibus_layouts.get_layouts(); ++ string[] names = ibus_layouts.get_group_names(); ++ for (int i = 0; layouts != null && i < layouts.length; i++) { ++ stdout.printf("%s %s\n", layouts[i], names[i]); ++ } ++ ++ return 0; ++ } ++ */ ++} +diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala +index 39aca08..fb012c3 100644 +--- a/ui/gtk3/panel.vala ++++ b/ui/gtk3/panel.vala +@@ -49,6 +49,13 @@ class Panel : IBus.PanelService { + private Gtk.CssProvider m_css_provider; + private int m_switcher_delay_time = 400; + private bool m_use_system_keyboard_layout = false; ++ private GkbdLayout m_gkbdlayout = null; ++ private XKBLayout m_xkblayout = null; ++ private string[] m_layouts = {}; ++ private string[] m_variants = {}; ++ private int m_fallback_lock_id = -1; ++ private bool m_changed_xkb_option = false; ++ private GLib.Timer m_changed_layout_timer; + private const string ACCELERATOR_SWITCH_IME_FOREWARD = "space"; + + private GLib.List m_keybindings = new GLib.List(); +@@ -91,6 +98,14 @@ class Panel : IBus.PanelService { + + ~Panel() { + unbind_switch_shortcut(); ++ ++ if (HAVE_IBUS_GKBD && m_gkbdlayout != null) { ++ m_gkbdlayout.changed.disconnect(gkbdlayout_changed_cb); ++ m_gkbdlayout.stop_listen(); ++ m_gkbdlayout = null; ++ } ++ ++ m_xkblayout = null; + } + + private void keybinding_manager_bind(KeybindingManager keybinding_manager, +@@ -405,6 +420,7 @@ class Panel : IBus.PanelService { + m_config.watch("general/hotkey", "triggers"); + m_config.watch("panel", "custom_font"); + m_config.watch("panel", "use_custom_font"); ++ init_engines_order(); + // Update m_use_system_keyboard_layout before update_engines() + // is called. + set_use_system_keyboard_layout(null); +@@ -422,6 +438,204 @@ class Panel : IBus.PanelService { + } + } + ++ private void gkbdlayout_changed_cb() { ++ /* The callback is called four times after set_layout is called ++ * so check the elapsed and take the first signal only. */ ++ double elapsed = m_changed_layout_timer.elapsed(); ++ if (elapsed < 1.0 && elapsed > 0.0) { ++ return; ++ } ++ ++ if (m_fallback_lock_id != -1) { ++ /* Call lock_group only when set_layout is called. */ ++ m_gkbdlayout.lock_group(m_fallback_lock_id); ++ m_fallback_lock_id = -1; ++ } else { ++ /* Reset default layout when gnome-control-center is called. */ ++ m_xkblayout.reset_layout(); ++ } ++ ++ update_xkb_engines(); ++ m_changed_layout_timer.reset(); ++ } ++ ++ private void init_gkbd() { ++ m_gkbdlayout = new GkbdLayout(); ++ m_gkbdlayout.changed.connect(gkbdlayout_changed_cb); ++ ++ /* Probably we cannot support both keyboard and ibus indicators ++ * How can I get the engine from keymap of group_id? ++ * e.g. 'en' could be owned by xkb:en and pinyin engines. */ ++ //m_gkbdlayout.group_changed.connect((object) => {}); ++ ++ m_changed_layout_timer = new GLib.Timer(); ++ m_changed_layout_timer.start(); ++ m_gkbdlayout.start_listen(); ++ } ++ ++ private void init_engines_order() { ++ if (m_config == null) { ++ return; ++ } ++ ++ m_xkblayout = new XKBLayout(m_config); ++ string session = Environment.get_variable("DESKTOP_SESSION"); ++ ++ if (HAVE_IBUS_GKBD && ++ session != null && session.length >= 5 && ++ session[0:5] == "gnome") { ++ init_gkbd(); ++ } ++ ++ update_xkb_engines(); ++ } ++ ++ private void update_xkb_engines() { ++ string var_layout = m_xkblayout.get_layout(); ++ string var_variant = m_xkblayout.get_variant(); ++ if (var_layout == "") { ++ return; ++ } ++ ++ m_layouts = var_layout.split(","); ++ m_variants = var_variant.split(","); ++ ++ IBus.XKBConfigRegistry registry = new IBus.XKBConfigRegistry(); ++ string[] var_xkb_engine_names = {}; ++ for (int i = 0; i < m_layouts.length; i++) { ++ string name = m_layouts[i]; ++ string lang = null; ++ ++ if (i < m_variants.length && m_variants[i] != "") { ++ name = "%s:%s".printf(name, m_variants[i]); ++ string layout = "%s(%s)".printf(name, m_variants[i]); ++ GLib.List langs = ++ registry.layout_lang_get_langs(layout); ++ if (langs.length() != 0) { ++ lang = langs.data; ++ } ++ } else { ++ name = "%s:".printf(name); ++ } ++ ++ if (lang == null) { ++ GLib.List langs = ++ registry.layout_lang_get_langs(m_layouts[i]); ++ if (langs.length() != 0) { ++ lang = langs.data; ++ } ++ } ++ ++ var_xkb_engine_names += "%s:%s:%s".printf("xkb", name, lang); ++ } ++ ++ GLib.Variant var_engines = ++ m_config.get_value("general", "preload_engines"); ++ string[] engine_names = {}; ++ bool updated_engine_names = false; ++ ++ if (var_engines != null) { ++ engine_names = var_engines.dup_strv(); ++ } ++ ++ foreach (string name in var_xkb_engine_names) { ++ if (name in engine_names) ++ continue; ++ updated_engine_names = true; ++ engine_names += name; ++ } ++ ++ if (updated_engine_names) { ++ m_config.set_value("general", ++ "preload_engines", ++ new GLib.Variant.strv(engine_names)); ++ } ++ ++ GLib.Variant var_order = ++ m_config.get_value("general", "engines_order"); ++ string[] order_names = {}; ++ bool updated_order_names = false; ++ ++ if (var_order != null) { ++ order_names = var_order.dup_strv(); ++ } ++ ++ foreach (var name in var_xkb_engine_names) { ++ if (name in order_names) ++ continue; ++ order_names += name; ++ updated_order_names = true; ++ } ++ ++ if (updated_order_names) { ++ m_config.set_value("general", ++ "engines_order", ++ new GLib.Variant.strv(order_names)); ++ } ++ } ++ ++ private void set_xkb_group_layout(IBus.EngineDesc engine) { ++ int[] retval = m_xkblayout.set_layout(engine, true); ++ if (retval[0] >= 0) { ++ /* If an XKB keymap is added into the XKB group, ++ * this._gkbdlayout.lock_group will be called after ++ * 'group-changed' signal is received. */ ++ m_fallback_lock_id = retval[0]; ++ m_changed_xkb_option = (retval[1] != 0) ? true : false; ++ } ++ } ++ ++ private bool set_gkbd_layout(IBus.EngineDesc engine) { ++ string layout = engine.get_layout(); ++ string variant = engine.get_layout_variant(); ++ ++ /* If a previous ibus engine changed XKB options, need to set the ++ * default XKB option. */ ++ if (m_changed_xkb_option == true) { ++ m_changed_xkb_option = false; ++ return false; ++ } ++ ++ if (variant != "" && variant != "default") { ++ layout = "%s(%s)".printf(layout, variant); ++ } ++ ++ int gkbd_len = m_gkbdlayout.get_group_names().length; ++ for (int i = 0; i < m_layouts.length && i < gkbd_len; i++) { ++ string sys_layout = m_layouts[i]; ++ if (i < m_variants.length && m_variants[i] != "") { ++ sys_layout = "%s(%s)".printf(sys_layout, m_variants[i]); ++ } ++ if (sys_layout == layout) { ++ m_gkbdlayout.lock_group(i); ++ return true; ++ } ++ } ++ return false; ++ } ++ ++ private void set_layout(IBus.EngineDesc engine) { ++ string layout = engine.get_layout(); ++ ++ if (layout == "" || layout == null) { ++ return; ++ } ++ ++ if (m_xkblayout == null) { ++ init_engines_order(); ++ } ++ ++ if (HAVE_IBUS_GKBD && m_gkbdlayout != null) { ++ if (set_gkbd_layout(engine)) { ++ return; ++ } ++ set_xkb_group_layout(engine); ++ return; ++ } ++ ++ m_xkblayout.set_layout(engine); ++ } ++ + private void exec_setxkbmap(IBus.EngineDesc engine) { + string layout = engine.get_layout(); + string variant = engine.get_layout_variant(); +@@ -482,7 +696,7 @@ class Panel : IBus.PanelService { + } + // set xkb layout + if (!m_use_system_keyboard_layout) { +- exec_setxkbmap(engine); ++ set_layout(engine); + } + } + +diff --git a/ui/gtk3/xkblayout.vala b/ui/gtk3/xkblayout.vala +new file mode 100644 +index 0000000..b4b54ff +--- /dev/null ++++ b/ui/gtk3/xkblayout.vala +@@ -0,0 +1,431 @@ ++/* vim:set et sts=4 sw=4: ++ * ++ * ibus - The Input Bus ++ * ++ * Copyright(c) 2013 Red Hat, Inc. ++ * Copyright(c) 2013 Peng Huang ++ * Copyright(c) 2013 Takao Fujiwara ++ * ++ * 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 ++ */ ++ ++public extern const bool HAVE_IBUS_GKBD; ++public extern const int XKB_LAYOUTS_MAX_LENGTH; ++ ++class XKBLayout ++{ ++ string m_xkb_command = "setxkbmap"; ++ IBus.Config m_config = null; ++ string[] m_xkb_latin_layouts = {}; ++ GLib.Pid m_xkb_pid = -1; ++ GLib.Pid m_xmodmap_pid = -1; ++ string m_xmodmap_command = "xmodmap"; ++ bool m_use_xmodmap = true; ++ string[] m_xmodmap_known_files = {".xmodmap", ".xmodmaprc", ++ ".Xmodmap", ".Xmodmaprc"}; ++ string m_default_layout = ""; ++ string m_default_variant = ""; ++ string m_default_option = ""; ++ ++ public XKBLayout(IBus.Config? config) { ++ m_config = config; ++ ++ if (config != null) { ++ var value = config.get_value("general", "xkb_latin_layouts"); ++ for (int i = 0; value != null && i < value.n_children(); i++) { ++ m_xkb_latin_layouts += ++ value.get_child_value(i).dup_string(); ++ } ++ if (m_use_xmodmap) { ++ m_use_xmodmap = config.get_value("general", "use_xmodmap").get_boolean(); ++ } ++ } ++ } ++ ++ private string get_output_from_cmdline(string arg, string element) { ++ string[] exec_command = {}; ++ exec_command += m_xkb_command; ++ exec_command += arg; ++ string standard_output = null; ++ string standard_error = null; ++ int exit_status = 0; ++ string retval = ""; ++ try { ++ GLib.Process.spawn_sync(null, ++ exec_command, ++ null, ++ GLib.SpawnFlags.SEARCH_PATH, ++ null, ++ out standard_output, ++ out standard_error, ++ out exit_status); ++ } catch (GLib.SpawnError err) { ++ stderr.printf("IBUS_ERROR: %s\n", err.message); ++ } ++ if (exit_status != 0) { ++ stderr.printf("IBUS_ERROR: %s\n", standard_error ?? ""); ++ } ++ if (standard_output == null) { ++ return ""; ++ } ++ foreach (string line in standard_output.split("\n")) { ++ if (element.length <= line.length && ++ line[0:element.length] == element) { ++ retval = line[element.length:line.length]; ++ if (retval == null) { ++ retval = ""; ++ } else { ++ retval = retval.strip(); ++ } ++ } ++ } ++ return retval; ++ } ++ ++ private void set_layout_cb(GLib.Pid pid, int status) { ++ if (m_xkb_pid != pid) { ++ stderr.printf("IBUS_ERROR: set_layout_cb has another pid\n"); ++ return; ++ } ++ GLib.Process.close_pid(m_xkb_pid); ++ m_xkb_pid = -1; ++ set_xmodmap(); ++ } ++ ++ private void set_xmodmap_cb(GLib.Pid pid, int status) { ++ if (m_xmodmap_pid != pid) { ++ stderr.printf("IBUS_ERROR: set_xmodmap_cb has another pid\n"); ++ return; ++ } ++ GLib.Process.close_pid(m_xmodmap_pid); ++ m_xmodmap_pid = -1; ++ } ++ ++ private string get_fullpath(string command) { ++ string envpath = GLib.Environment.get_variable("PATH"); ++ foreach (string dir in envpath.split(":")) { ++ string filepath = GLib.Path.build_filename(dir, command); ++ if (GLib.FileUtils.test(filepath, GLib.FileTest.EXISTS)) { ++ return filepath; ++ } ++ } ++ return ""; ++ } ++ ++ private string[] get_xkb_group_layout (string layout, ++ string variant, ++ int layouts_max_length) { ++ int group_id = 0; ++ int i = 0; ++ string[] layouts = m_default_layout.split(","); ++ string[] variants = m_default_variant.split(","); ++ string group_layouts = ""; ++ string group_variants = ""; ++ bool has_variant = false; ++ bool include_keymap = false; ++ ++ for (i = 0; i < layouts.length; i++) { ++ if (i >= layouts_max_length - 1) { ++ break; ++ } ++ ++ if (i == 0) { ++ group_layouts = layouts[i]; ++ } else { ++ group_layouts = "%s,%s".printf(group_layouts, layouts[i]); ++ } ++ ++ if (i >= variants.length) { ++ if (i == 0) { ++ group_variants = ""; ++ } else { ++ group_variants += ","; ++ } ++ if (layout == layouts[i] && variant == "") { ++ include_keymap = true; ++ group_id = i; ++ } ++ continue; ++ } ++ if (layout == layouts[i] && variant == variants[i]) { ++ include_keymap = true; ++ group_id = i; ++ } ++ ++ if (variants[i] != "") { ++ has_variant = true; ++ } ++ ++ if (i == 0) { ++ group_variants = variants[i]; ++ } else { ++ group_variants = "%s,%s".printf(group_variants, variants[i]); ++ } ++ } ++ ++ if (variant != "") { ++ has_variant = true; ++ } ++ ++ if (!include_keymap) { ++ group_layouts = "%s,%s".printf(group_layouts, layout); ++ group_variants = "%s,%s".printf(group_variants, variant); ++ group_id = i; ++ } ++ ++ if (!has_variant) { ++ group_variants = null; ++ } ++ ++ return {group_layouts, group_variants, group_id.to_string()}; ++ } ++ ++ public string[] get_variant_from_layout(string layout) { ++ int left_bracket = layout.index_of("("); ++ int right_bracket = layout.index_of(")"); ++ if (left_bracket >= 0 && right_bracket > left_bracket) { ++ return {layout[0:left_bracket] + ++ layout[right_bracket + 1:layout.length], ++ layout[left_bracket + 1:right_bracket]}; ++ } ++ return {layout, "default"}; ++ } ++ ++ public string[] get_option_from_layout(string layout) { ++ int left_bracket = layout.index_of("["); ++ int right_bracket = layout.index_of("]"); ++ if (left_bracket >= 0 && right_bracket > left_bracket) { ++ return {layout[0:left_bracket] + ++ layout[right_bracket + 1:layout.length], ++ layout[left_bracket + 1:right_bracket]}; ++ } ++ return {layout, "default"}; ++ } ++ ++ public string get_layout() { ++ return get_output_from_cmdline("-query", "layout: "); ++ } ++ ++ public string get_variant() { ++ return get_output_from_cmdline("-query", "variant: "); ++ } ++ ++ public string get_option() { ++ return get_output_from_cmdline("-query", "options: "); ++ } ++ ++ /* ++ public string get_group() { ++ return get_output_from_cmdline("--get-group", "group: "); ++ } ++ */ ++ ++ public int[] set_layout(IBus.EngineDesc engine, ++ bool use_group_layout=false) { ++ string layout = engine.get_layout(); ++ string variant = engine.get_layout_variant(); ++ string option = engine.get_layout_option(); ++ ++ assert (layout != null); ++ ++ int xkb_group_id = 0; ++ int changed_option = 0; ++ ++ if (m_xkb_pid != -1) { ++ return {-1, 0}; ++ } ++ ++ if (layout == "default" && ++ (variant == "default" || variant == "") && ++ (option == "default" || option == "")) { ++ return {-1, 0}; ++ } ++ ++ bool need_us_layout = false; ++ foreach (string latin_layout in m_xkb_latin_layouts) { ++ if (layout == latin_layout && variant != "eng") { ++ need_us_layout = true; ++ break; ++ } ++ if (variant != null && ++ "%s(%s)".printf(layout, variant) == latin_layout) { ++ need_us_layout = true; ++ break; ++ } ++ } ++ ++ int layouts_max_length = XKB_LAYOUTS_MAX_LENGTH; ++ if (need_us_layout) { ++ layouts_max_length--; ++ } ++ ++ if (m_default_layout == "") { ++ m_default_layout = get_layout(); ++ } ++ if (m_default_variant == "") { ++ m_default_variant = get_variant(); ++ } ++ if (m_default_option == "") { ++ m_default_option = get_option(); ++ } ++ ++ if (layout == "default") { ++ layout = m_default_layout; ++ variant = m_default_variant; ++ } else { ++ if (use_group_layout) { ++ if (variant == "default") { ++ variant = ""; ++ } ++ string[] retval = get_xkb_group_layout (layout, variant, ++ layouts_max_length); ++ layout = retval[0]; ++ variant = retval[1]; ++ xkb_group_id = int.parse(retval[2]); ++ } ++ } ++ ++ if (layout == "") { ++ warning("Could not get the correct layout"); ++ return {-1, 0}; ++ } ++ ++ if (variant == "default" || variant == "") { ++ variant = null; ++ } ++ ++ if (option == "default" || option == "") { ++ option = m_default_option; ++ } else { ++ if (!(option in m_default_option.split(","))) { ++ option = "%s,%s".printf(m_default_option, option); ++ changed_option = 1; ++ } else { ++ option = m_default_option; ++ } ++ } ++ ++ if (option == "") { ++ option = null; ++ } ++ ++ if (need_us_layout) { ++ layout += ",us"; ++ if (variant != null) { ++ variant += ","; ++ } ++ } ++ ++ string[] args = {}; ++ args += m_xkb_command; ++ args += "-layout"; ++ args += layout; ++ if (variant != null) { ++ args += "-variant"; ++ args += variant; ++ } ++ if (option != null) { ++ /* TODO: Need to get the session XKB options */ ++ args += "-option"; ++ args += "-option"; ++ args += option; ++ } ++ ++ GLib.Pid child_pid; ++ try { ++ GLib.Process.spawn_async(null, ++ args, ++ null, ++ GLib.SpawnFlags.DO_NOT_REAP_CHILD | ++ GLib.SpawnFlags.SEARCH_PATH, ++ null, ++ out child_pid); ++ } catch (GLib.SpawnError err) { ++ stderr.printf("Execute setxkbmap failed: %s\n", err.message); ++ return {-1, 0}; ++ } ++ m_xkb_pid = child_pid; ++ GLib.ChildWatch.add(m_xkb_pid, set_layout_cb); ++ ++ return {xkb_group_id, changed_option}; ++ } ++ ++ public void set_xmodmap() { ++ if (!m_use_xmodmap) { ++ return; ++ } ++ ++ if (m_xmodmap_pid != -1) { ++ return; ++ } ++ ++ string xmodmap_cmdpath = get_fullpath(m_xmodmap_command); ++ if (xmodmap_cmdpath == "") { ++ xmodmap_cmdpath = m_xmodmap_command; ++ } ++ string homedir = GLib.Environment.get_home_dir(); ++ foreach (string xmodmap_file in m_xmodmap_known_files) { ++ string xmodmap_filepath = GLib.Path.build_filename(homedir, xmodmap_file); ++ if (!GLib.FileUtils.test(xmodmap_filepath, GLib.FileTest.EXISTS)) { ++ continue; ++ } ++ string[] args = {xmodmap_cmdpath, xmodmap_filepath}; ++ ++ GLib.Pid child_pid; ++ try { ++ GLib.Process.spawn_async(null, ++ args, ++ null, ++ GLib.SpawnFlags.DO_NOT_REAP_CHILD | ++ GLib.SpawnFlags.SEARCH_PATH, ++ null, ++ out child_pid); ++ } catch (GLib.SpawnError err) { ++ stderr.printf("IBUS_ERROR: %s\n", err.message); ++ return; ++ } ++ m_xmodmap_pid = child_pid; ++ GLib.ChildWatch.add(m_xmodmap_pid, set_xmodmap_cb); ++ ++ break; ++ } ++ } ++ ++ public void reset_layout() { ++ m_default_layout = get_layout(); ++ m_default_variant = get_variant(); ++ m_default_option = get_option(); ++ } ++ ++ /* ++ public static int main(string[] args) { ++ IBus.Bus bus = new IBus.Bus(); ++ IBus.Config config = bus.get_config(); ++ XKBLayout xkblayout = new XKBLayout(config); ++ stdout.printf ("layout: %s\n", xkblayout.get_layout()); ++ stdout.printf ("variant: %s\n", xkblayout.get_variant()); ++ stdout.printf ("option: %s\n", xkblayout.get_option()); ++ xkblayout.set_layout("jp"); ++ if (config != null) { ++ IBus.main(); ++ } else { ++ Gtk.init (ref args); ++ Gtk.main(); ++ } ++ return 0; ++ } ++ */ ++} +-- +1.8.0 + diff --git a/SOURCES/ibus-810211-no-switch-by-no-trigger.patch b/SOURCES/ibus-810211-no-switch-by-no-trigger.patch new file mode 100644 index 0000000..c1bea4d --- /dev/null +++ b/SOURCES/ibus-810211-no-switch-by-no-trigger.patch @@ -0,0 +1,36 @@ +From d3bc903b487bb301395947f692ce0d8c130874e3 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Sat, 6 Oct 2012 17:54:27 +0900 +Subject: [PATCH] Fix not to switch engines by non-trigger keys. + +--- + ui/gtk3/switcher.vala | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/ui/gtk3/switcher.vala b/ui/gtk3/switcher.vala +index 4a02743..c606682 100644 +--- a/ui/gtk3/switcher.vala ++++ b/ui/gtk3/switcher.vala +@@ -140,6 +140,7 @@ class Switcher : Gtk.Window { + /* Let gtk recalculate the window size. */ + resize(1, 1); + ++ m_result = 0; + m_selected_engine = index; + m_label.set_text(m_buttons[index].longname); + m_buttons[index].grab_focus(); +@@ -378,6 +379,11 @@ class Switcher : Gtk.Window { + break; + default: + debug("0x%04x", pe->keyval); ++ if (m_loop != null) { ++ m_loop.quit(); ++ m_loop = null; ++ } ++ retval = false; + break; + } + } while (false); +-- +1.8.0 + diff --git a/SOURCES/ibus-xinput b/SOURCES/ibus-xinput new file mode 100644 index 0000000..f5459ff --- /dev/null +++ b/SOURCES/ibus-xinput @@ -0,0 +1,16 @@ +XIM=ibus +XIM_PROGRAM="/usr/bin/ibus-daemon" +ICON="ibus" +XIM_ARGS="-r --xim" +PREFERENCE_PROGRAM=/usr/bin/ibus-setup +SHORT_DESC="IBus" +GTK_IM_MODULE=ibus +NOT_RUN=gnome3 + +if test -f /usr/lib/qt4/plugins/inputmethods/libqtim-ibus.so || \ + test -f /usr/lib64/qt4/plugins/inputmethods/libqtim-ibus.so; +then + QT_IM_MODULE=ibus +else + QT_IM_MODULE=xim +fi diff --git a/SOURCES/ibus-xx-setup-frequent-lang.patch b/SOURCES/ibus-xx-setup-frequent-lang.patch new file mode 100644 index 0000000..1aff39e --- /dev/null +++ b/SOURCES/ibus-xx-setup-frequent-lang.patch @@ -0,0 +1,427 @@ +From c9d8db44583262f49adf7588fe0adbf0842a995a Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Thu, 31 Jan 2013 17:31:55 +0900 +Subject: [PATCH] Enable ibus-setup to show the frequently used languages + only in IME list. + +--- + data/ibus.schemas.in | 168 ++++++++++++++++++++++++++++++++++++++++++++++++ + setup/enginecombobox.py | 155 +++++++++++++++++++++++++++++++++++++------- + setup/main.py | 1 + + 3 files changed, 300 insertions(+), 24 deletions(-) + +diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in +index 52ece27..007fc66 100644 +--- a/data/ibus.schemas.in ++++ b/data/ibus.schemas.in +@@ -339,6 +339,174 @@ se,si,sk,sy,sy(ku),th,tj,tr,ua,uz,vn + + + ++ /schemas/desktop/ibus/general/xkblayoutconfig/group_list ++ /desktop/ibus/general/xkblayoutconfig/group_list ++ ibus ++ list ++ string ++ [west_europe,south_europe,east_europe,north_europe,west_asia,center_asia,east_asia,india,australia] ++ ++ List of system keyboard layout groups on ibus-setup ++ The group list is used not to show all the system ++ keyboard layouts by default. The list item will be ++ appended at the end of gconf key. e.g. ++ .../xkblayoutconfig/item1 ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/west_europe ++ /desktop/ibus/general/xkblayoutconfig/west_europe ++ ibus ++ list ++ string ++ ++ [ca,cs,de,en,es,fr,gd,hu,it,nl,pt,sk,sl] ++ ++ List of European languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/south_europe ++ /desktop/ibus/general/xkblayoutconfig/south_europe ++ ibus ++ list ++ string ++ ++ [bg,bs,el,mk,mt,ro,sq,sr] ++ ++ List of European languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/east_europe ++ /desktop/ibus/general/xkblayoutconfig/east_europe ++ ibus ++ list ++ string ++ ++ [be,csb,cv,et,ka,kk,ky,lt,lv,pl,ru,tt,uk,uz] ++ ++ List of European languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/north_europe ++ /desktop/ibus/general/xkblayoutconfig/north_europe ++ ibus ++ list ++ string ++ ++ [da,fi,fo,is,no,se,sv] ++ ++ List of European languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/west_asia ++ /desktop/ibus/general/xkblayoutconfig/west_asia ++ ibus ++ list ++ string ++ ++ [am,ar,az,ber,fa,ha,he,hy,ig,ku,tg,tr,yo] ++ ++ List of Asian languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/center_asia ++ /desktop/ibus/general/xkblayoutconfig/center_asia ++ ibus ++ list ++ string ++ ++ [bo,zh] ++ ++ List of Asian languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/east_asia ++ /desktop/ibus/general/xkblayoutconfig/east_asia ++ ibus ++ list ++ string ++ ++ [dz,km,lo,my,th,vi] ++ ++ List of Asian languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/india ++ /desktop/ibus/general/xkblayoutconfig/india ++ ibus ++ list ++ string ++ ++ [bn,dv,gu,hi,kn,ml,ne,or,pa,si,ta,te,ur] ++ ++ List of Asian languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ ++ /schemas/desktop/ibus/general/xkblayoutconfig/australia ++ /desktop/ibus/general/xkblayoutconfig/australia ++ ibus ++ list ++ string ++ ++ [mi] ++ ++ List of Asian languages on ibus-setup ++ ibus-setup shows the languages only in input method list ++ when you run ibus-setup on one of the languages. ++ Other languages are hidden under an extended button. ++ ++ ++ + /schemas/desktop/ibus/panel/custom_font + /desktop/ibus/panel/custom_font + ibus +diff --git a/setup/enginecombobox.py b/setup/enginecombobox.py +index 0f8a6ae..9828ee6 100644 +--- a/setup/enginecombobox.py ++++ b/setup/enginecombobox.py +@@ -45,6 +45,9 @@ class EngineComboBox(Gtk.ComboBox): + self.connect("notify::active", self.__notify_active_cb) + + self.__model = None ++ self.__all_model = None ++ self.__config = None ++ self.__show_sub_lang = False + + renderer = Gtk.CellRendererPixbuf() + renderer.set_property("xalign", 0) +@@ -58,20 +61,51 @@ class EngineComboBox(Gtk.ComboBox): + self.pack_start(renderer, True) + self.set_cell_data_func(renderer, self.__name_cell_data_cb, None) + +- def set_engines(self, engines): +- self.__model = Gtk.TreeStore(object) ++ def __gconf_get_lang_list_from_locale(self): ++ common_list = ['en', 'Other'] ++ if self.__config == None: ++ return None ++ loc = None ++ try: ++ loc = locale.setlocale (locale.LC_ALL) ++ except: ++ pass ++ if loc == None: ++ return common_list ++ current_lang = IBus.get_language_name(loc) ++ if current_lang == None: ++ return common_list ++ group_list = self.__config.get_value("general/xkblayoutconfig", ++ "group_list") ++ if group_list == None: ++ return [loc] + common_list ++ group_list = list(group_list) ++ lang_list = None ++ for group in group_list: ++ group = str(group) ++ langs = list(self.__config.get_value("general/xkblayoutconfig", ++ group)) ++ for lang in langs: ++ lang = str(lang) ++ if current_lang == IBus.get_language_name(lang): ++ lang_list = langs ++ break ++ if lang_list != None: ++ break ++ if lang_list == None: ++ return [loc] + common_list ++ return lang_list + common_list + +- iter1 = self.__model.append(None) +- self.__model.set(iter1, 0, 0) +- langs = {} +- for e in engines: +- l = IBus.get_language_name(e.get_language()) +- if l == None: +- l = "" +- if l not in langs: +- langs[l] = [] +- langs[l].append(e) ++ def __has_engine_in_lang_list(self, engine, lang_list): ++ retval = False ++ for lang in lang_list: ++ if IBus.get_language_name(lang) == \ ++ IBus.get_language_name(engine.props.language): ++ retval = True ++ break ++ return retval + ++ def __model_append_langs(self, model, langs, visible): + keys = langs.keys() + keys.sort(locale.strcoll) + loc = locale.getlocale()[0] +@@ -89,29 +123,86 @@ class EngineComboBox(Gtk.ComboBox): + keys.remove(IBus.get_language_name("Other")) + keys += [IBus.get_language_name("Other")] + for l in keys: +- iter1 = self.__model.append(None) +- self.__model.set(iter1, 0, l) ++ iter1 = model.append(None) ++ model.set(iter1, 0, l) + def cmp_engine(a, b): + if a.get_rank() == b.get_rank(): + return locale.strcoll(a.get_longname(), b.get_longname()) + return int(b.get_rank() - a.get_rank()) + langs[l].sort(cmp_engine) + for e in langs[l]: +- iter2 = self.__model.append(iter1) +- self.__model.set(iter2, 0, e) ++ iter2 = model.append(iter1) ++ model.set(iter2, 0, e) ++ ++ def set_engines(self, engines): ++ self.__model = Gtk.TreeStore(object) ++ ++ iter1 = self.__model.append(None) ++ self.__model.set(iter1, 0, 0) ++ lang_list = self.__gconf_get_lang_list_from_locale() ++ lang = {} ++ sub_lang = {} ++ for e in engines: ++ l = IBus.get_language_name(e.props.language) ++ if lang_list == None or \ ++ self.__has_engine_in_lang_list(e, lang_list): ++ if l not in lang: ++ lang[l] = [] ++ lang[l].append(e) ++ else: ++ if l not in sub_lang: ++ sub_lang[l] = [] ++ sub_lang[l].append(e) ++ ++ self.__model_append_langs(self.__model, lang, True) ++ iter1 = self.__model.append(None) ++ self.__model.set(iter1, 0, -1) ++ ++ self.__all_model = Gtk.TreeStore(object) ++ iter1 = self.__all_model.append(None) ++ self.__all_model.set(iter1, 0, 0) ++ self.__model_append_langs(self.__all_model, lang, False) ++ iter1 = self.__all_model.append(None) ++ self.__all_model.set(iter1, 0, -1) ++ self.__model_append_langs(self.__all_model, sub_lang, False) ++ ++ self.__toggle_sub_lang() + +- self.set_model(self.__model) ++ def __toggle_sub_lang(self): ++ self.set_model(None) ++ if self.__show_sub_lang: ++ self.set_model(self.__all_model) ++ else: ++ self.set_model(self.__model) + self.set_active(0) + + def __icon_cell_data_cb(self, celllayout, renderer, model, iter, data): +- engine = self.__model.get_value(iter, 0) ++ model = self.get_model() ++ engine = model.get_value(iter, 0) + + if isinstance(engine, str) or isinstance (engine, unicode): + renderer.set_property("visible", False) + renderer.set_property("sensitive", False) + elif isinstance(engine, int): +- renderer.set_property("visible", False) +- renderer.set_property("sensitive", False) ++ if engine == 0: ++ renderer.set_property("visible", False) ++ renderer.set_property("sensitive", False) ++ renderer.set_property("pixbuf", None) ++ elif engine < 0: ++ if not self.__show_sub_lang: ++ pixbuf = load_icon("go-bottom", Gtk.IconSize.LARGE_TOOLBAR) ++ else: ++ pixbuf = load_icon("go-up", Gtk.IconSize.LARGE_TOOLBAR) ++ if pixbuf == None: ++ pixbuf = load_icon(Gtk.STOCK_MISSING_IMAGE, ++ Gtk.IconSize.LARGE_TOOLBAR) ++ if pixbuf == None: ++ renderer.set_property("visible", False) ++ renderer.set_property("sensitive", False) ++ return ++ renderer.set_property("visible", True) ++ renderer.set_property("sensitive", True) ++ renderer.set_property("pixbuf", pixbuf) + else: + renderer.set_property("visible", True) + renderer.set_property("sensitive", True) +@@ -119,7 +210,8 @@ class EngineComboBox(Gtk.ComboBox): + renderer.set_property("pixbuf", pixbuf) + + def __name_cell_data_cb(self, celllayout, renderer, model, iter, data): +- engine = self.__model.get_value(iter, 0) ++ model = self.get_model() ++ engine = model.get_value(iter, 0) + + if isinstance (engine, str) or isinstance (engine, unicode): + renderer.set_property("sensitive", False) +@@ -127,8 +219,15 @@ class EngineComboBox(Gtk.ComboBox): + renderer.set_property("weight", Pango.Weight.NORMAL) + elif isinstance(engine, int): + renderer.set_property("sensitive", True) +- renderer.set_property("text", _("Select an input method")) +- renderer.set_property("weight", Pango.Weight.NORMAL) ++ if engine == 0: ++ renderer.set_property("text", _("Select an input method")) ++ renderer.set_property("weight", Pango.Weight.NORMAL) ++ elif engine < 0: ++ if not self.__show_sub_lang: ++ renderer.set_property("text", _("Show all input methods")) ++ else: ++ renderer.set_property("text", _("Show only input methods for your region")) ++ renderer.set_property("weight", Pango.Weight.BOLD) + else: + renderer.set_property("sensitive", True) + renderer.set_property("text", engine.get_longname()) +@@ -144,10 +243,18 @@ class EngineComboBox(Gtk.ComboBox): + if i == 0 or i == -1: + return None + iter = self.get_active_iter() +- return self.get_model()[iter][0] ++ model = self.get_model() ++ if model[iter][0] == -1: ++ self.__show_sub_lang = not self.__show_sub_lang ++ self.__toggle_sub_lang() ++ return None ++ return model[iter][0] + else: + raise AttributeError, 'unknown property %s' % property.name + ++ def set_config(self, config): ++ self.__config = config ++ + def get_active_engine(self): + return self.get_property("active-engine") + +diff --git a/setup/main.py b/setup/main.py +index b39a044..5b077a8 100644 +--- a/setup/main.py ++++ b/setup/main.py +@@ -206,6 +206,7 @@ class Setup(object): + # init engine page + self.__engines = self.__bus.list_engines() + self.__combobox = self.__builder.get_object("combobox_engines") ++ self.__combobox.set_config(self.__config) + self.__combobox.set_engines(self.__engines) + + engine_names = values.get("preload_engines", []) +-- +1.8.0 + diff --git a/SPECS/ibus.spec b/SPECS/ibus.spec new file mode 100644 index 0000000..be2039c --- /dev/null +++ b/SPECS/ibus.spec @@ -0,0 +1,1132 @@ +%global with_preload_xkb_engine 1 +%global with_pygobject2 1 +%global with_pygobject3 1 + +%global with_pkg_config %(pkg-config --version >/dev/null 2>&1 && echo -n "1" || echo -n "0") + +%if (0%{?fedora} > 18 || 0%{?rhel} > 6) +%global with_python_pkg 1 +%else +%global with_python_pkg 0 +%endif + +%global ibus_api_version 1.0 + +%if %with_pkg_config +%{!?gtk2_binary_version: %global gtk2_binary_version %(pkg-config --variable=gtk_binary_version gtk+-2.0)} +%{!?gtk3_binary_version: %global gtk3_binary_version %(pkg-config --variable=gtk_binary_version gtk+-3.0)} +%global glib_ver %([ -a %{_libdir}/pkgconfig/glib-2.0.pc ] && pkg-config --modversion glib-2.0 | cut -d. -f 1,2 || echo -n "999") +%else +%{!?gtk2_binary_version: %global gtk2_binary_version ?.?.?} +%{!?gtk3_binary_version: %global gtk3_binary_version ?.?.?} +%global glib_ver 0 +%endif + +%global dbus_python_version 0.83.0 + +Name: ibus +Version: 1.5.3 +Release: 1%{?dist} +Summary: Intelligent Input Bus for Linux OS +License: LGPLv2+ +Group: System Environment/Libraries +URL: http://code.google.com/p/ibus/ +Source0: http://ibus.googlecode.com/files/%{name}-%{version}.tar.gz +Source1: %{name}-xinput +# Upstreamed patches. +# Patch0: %{name}-HEAD.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=810211 +Patch1: %{name}-810211-no-switch-by-no-trigger.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=541492 +Patch2: %{name}-541492-xkb.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=530711 +Patch3: %{name}-530711-preload-sys.patch +# Hide minor input method engines on ibus-setup by locale +Patch4: %{name}-xx-setup-frequent-lang.patch + +%if (0%{?fedora} < 19 && 0%{?rhel} < 7) +# Keep the default triggers for the back compatiblity. +Patch95: %{name}-xx-ctrl-space.patch +%endif + + +BuildRequires: gettext-devel +BuildRequires: libtool +BuildRequires: gtk2-devel +BuildRequires: gtk3-devel +BuildRequires: dbus-glib-devel +BuildRequires: dbus-python-devel >= %{dbus_python_version} +BuildRequires: desktop-file-utils +BuildRequires: gtk-doc +BuildRequires: dconf-devel +BuildRequires: dbus-x11 +BuildRequires: python2-devel +BuildRequires: vala +BuildRequires: vala-devel +BuildRequires: vala-tools +# for AM_GCONF_SOURCE_2 in configure.ac +BuildRequires: GConf2-devel +BuildRequires: intltool +BuildRequires: iso-codes-devel +BuildRequires: libnotify-devel + +Requires: %{name}-libs = %{version}-%{release} +Requires: %{name}-gtk2 = %{version}-%{release} +Requires: %{name}-gtk3 = %{version}-%{release} +%if %with_python_pkg +Requires: %{name}-setup = %{version}-%{release} +%endif + +Requires: iso-codes +Requires: dbus-python >= %{dbus_python_version} +Requires: dbus-x11 +Requires: dconf +Requires: notify-python +Requires: librsvg2 +# for setxkbmap +Requires: xorg-x11-xkb-utils +# The feature in ibus-gnome3 is provided by gnome-shell. +Obsoletes: ibus-gnome3 < %{version}-%{release} +%if ! %with_python_pkg +%if %with_pygobject3 +Requires: pygobject3 +BuildRequires: gobject-introspection-devel +BuildRequires: pygobject3-devel +%endif +%if %with_pygobject2 +Requires: pygtk2 +%endif +%endif + +Requires(post): desktop-file-utils +Requires(postun): desktop-file-utils +Requires(postun): dconf +Requires(posttrans): dconf + +Requires(post): %{_sbindir}/alternatives +Requires(postun): %{_sbindir}/alternatives + +%global _xinputconf %{_sysconfdir}/X11/xinit/xinput.d/ibus.conf + +%description +IBus means Intelligent Input Bus. It is an input framework for Linux OS. + +%package libs +Summary: IBus libraries +Group: System Environment/Libraries + +Requires: glib2 >= %{glib_ver} +Requires: dbus >= 1.2.4 + +%description libs +This package contains the libraries for IBus + +%package gtk2 +Summary: IBus im module for gtk2 +Group: System Environment/Libraries +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-libs = %{version}-%{release} +Requires(post): glib2 >= %{glib_ver} +# Added for upgrade el6 to el7 +Provides: ibus-gtk = %{version}-%{release} +Obsoletes: ibus-gtk < %{version}-%{release} + +%description gtk2 +This package contains ibus im module for gtk2 + +%package gtk3 +Summary: IBus im module for gtk3 +Group: System Environment/Libraries +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-libs = %{version}-%{release} +Requires(post): glib2 >= %{glib_ver} + +%description gtk3 +This package contains ibus im module for gtk3 + +%if %with_python_pkg +%if %with_pygobject3 +%package setup +Summary: IBus setup utility +Group: System Environment/Libraries +Requires: %{name} = %{version}-%{release} +Requires: pygobject3 +BuildRequires: gobject-introspection-devel +BuildRequires: pygobject3-devel +BuildArch: noarch + +%description setup +This is a setup utility for IBus. +%endif + +%if %with_pygobject2 +%package pygtk2 +Summary: IBus pygtk2 library +Group: System Environment/Libraries +Requires: %{name} = %{version}-%{release} +Requires: pygtk2 +BuildArch: noarch + +%description pygtk2 +This is a pygtk2 library for IBus. Now major IBus engines use pygobject3 +and this package will be deprecated. +%endif +%endif + +%package devel +Summary: Development tools for ibus +Group: Development/Libraries +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: %{name}-libs = %{version}-%{release} +Requires: glib2-devel +Requires: dbus-devel + +%description devel +The ibus-devel package contains the header files and developer +docs for ibus. + +%package devel-docs +Summary: Developer documents for ibus +Group: Development/Libraries +%if (0%{?fedora} >= 19 || 0%{?rhel} >= 7) +Requires: %{name} = %{version}-%{release} +BuildArch: noarch +%else +Requires: %{name}%{?_isa} = %{version}-%{release} +%endif + +%description devel-docs +The ibus-devel-docs package contains developer documentation for ibus + + +%prep +%setup -q + +# %%patch0 -p1 +cp client/gtk2/ibusimcontext.c client/gtk3/ibusimcontext.c || +%patch1 -p1 -b .noswitch +%if %with_preload_xkb_engine +%patch2 -p1 -b .preload-xkb +rm -f bindings/vala/ibus-1.0.vapi +rm -f data/dconf/00-upstream-settings +%endif +%patch3 -p1 -b .preload-sys +%patch4 -p1 -b .setup-frequent-lang + +%if (0%{?fedora} < 19 && 0%{?rhel} < 7) +%patch95 -p1 -b .ctrl +%endif + +%build +%if %with_preload_xkb_engine +autoreconf -f -i -v +%endif +%configure \ + --disable-static \ + --enable-gtk2 \ + --enable-gtk3 \ + --enable-xim \ + --enable-gtk-doc \ + --with-no-snooper-apps='gnome-do,Do.*,firefox.*,.*chrome.*,.*chromium.*' \ + --enable-surrounding-text \ +%if %with_pygobject2 + --enable-python-library \ +%endif + --enable-introspection + +%if %with_preload_xkb_engine +make -C ui/gtk3 maintainer-clean-generic +%endif +# make -C po update-gmo +make %{?_smp_mflags} + +%install +make install DESTDIR=$RPM_BUILD_ROOT INSTALL='install -p' +rm -f $RPM_BUILD_ROOT%{_libdir}/libibus-%{ibus_api_version}.la +rm -f $RPM_BUILD_ROOT%{_libdir}/gtk-2.0/%{gtk2_binary_version}/immodules/im-ibus.la +rm -f $RPM_BUILD_ROOT%{_libdir}/gtk-3.0/%{gtk3_binary_version}/immodules/im-ibus.la + +# install xinput config file +install -pm 644 -D %{SOURCE1} $RPM_BUILD_ROOT%{_xinputconf} + +# install .desktop files +echo "NoDisplay=true" >> $RPM_BUILD_ROOT%{_datadir}/applications/ibus-setup.desktop +#echo "X-GNOME-Autostart-enabled=false" >> $RPM_BUILD_ROOT%{_sysconfdir}/xdg/autostart/ibus.desktop + +desktop-file-install --delete-original \ + --dir $RPM_BUILD_ROOT%{_datadir}/applications \ + $RPM_BUILD_ROOT%{_datadir}/applications/* + +# FIXME: no version number +%find_lang %{name}10 + +%post +# recreate icon cache +touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : + +%{_sbindir}/alternatives --install %{_sysconfdir}/X11/xinit/xinputrc xinputrc %{_xinputconf} 83 || : + +%postun +if [ "$1" -eq 0 ]; then + # recreate icon cache + touch --no-create %{_datadir}/icons/hicolor &>/dev/null || : + gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : + + %{_sbindir}/alternatives --remove xinputrc %{_xinputconf} || : + # if alternative was set to manual, reset to auto + [ -L %{_sysconfdir}/alternatives/xinputrc -a "`readlink %{_sysconfdir}/alternatives/xinputrc`" = "%{_xinputconf}" ] && %{_sbindir}/alternatives --auto xinputrc || : + + glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : + # 'dconf update' sometimes does not update the db... + dconf update + if [ -f %{_sysconfdir}/dconf/db/ibus ] ; then + rm -f %{_sysconfdir}/dconf/db/ibus + fi + # 'ibus write-cache --system' updates the system cache. + if [ -f /var/cache/ibus/bus/registry ] ; then + rm -f /var/cache/ibus/bus/registry + fi +fi + +%posttrans +gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : +glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || : +dconf update +if [ %{_bindir}/ibus ] ; then + %{_bindir}/ibus write-cache --system &>/dev/null || : +fi + +%post libs -p /sbin/ldconfig + +%postun libs -p /sbin/ldconfig + +%post gtk2 +if [ $1 -eq 1 ] ; then + # For upgrades, the cache will be regenerated by the new package's %%postun + %{_bindir}/update-gtk-immodules %{_host} || : +fi + +%postun gtk2 +%{_bindir}/update-gtk-immodules %{_host} || : + +%post gtk3 +if [ $1 -eq 1 ] ; then + # For upgrades, the cache will be regenerated by the new package's %%postun + /usr/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache &> /dev/null || : +fi + +%postun gtk3 +/usr/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache &> /dev/null || : + + +# FIXME: no version number +%files -f %{name}10.lang +%doc AUTHORS COPYING README +%dir %{_datadir}/ibus/ +%{_bindir}/ibus +%{_bindir}/ibus-daemon +%{_datadir}/applications/* +%{_datadir}/bash-completion/completions/ibus.bash +%{_datadir}/GConf/gsettings/* +%{_datadir}/glib-2.0/schemas/*.xml +%{_datadir}/ibus/component +%{_datadir}/ibus/engine +%{_datadir}/ibus/keymaps +%{_datadir}/icons/hicolor/*/apps/* +%{_datadir}/man/man1/ibus.1.gz +%{_datadir}/man/man1/ibus-daemon.1.gz +%{_libexecdir}/ibus-engine-simple +%{_libexecdir}/ibus-dconf +%{_libexecdir}/ibus-ui-gtk3 +%{_libexecdir}/ibus-x11 +%{_sysconfdir}/dconf/db/ibus.d +%{_sysconfdir}/dconf/profile/ibus +%python2_sitearch/gi/overrides/IBus.py* +%config %{_xinputconf} +%if ! %with_python_pkg +%if %with_pygobject3 +%{_bindir}/ibus-setup +%{_datadir}/ibus/setup +%{_datadir}/man/man1/ibus-setup.1.gz +%endif +%if %with_pygobject2 +%dir %{python2_sitelib}/ibus +%{python2_sitelib}/ibus/* +%endif +%endif + +%files libs +%{_libdir}/libibus-%{ibus_api_version}.so.* +%{_libdir}/girepository-1.0/IBus-1.0.typelib + +%files gtk2 +%{_libdir}/gtk-2.0/%{gtk2_binary_version}/immodules/im-ibus.so + +%files gtk3 +%{_libdir}/gtk-3.0/%{gtk3_binary_version}/immodules/im-ibus.so + +%if %with_python_pkg +%if %with_pygobject3 +%files setup +%{_bindir}/ibus-setup +%{_datadir}/ibus/setup +%{_datadir}/man/man1/ibus-setup.1.gz +%endif + +%if %with_pygobject2 +%files pygtk2 +%dir %{python2_sitelib}/ibus +%{python2_sitelib}/ibus/* +%endif +%endif + +%files devel +%{_libdir}/lib*.so +%{_libdir}/pkgconfig/* +%{_includedir}/* +%{_datadir}/gir-1.0/IBus-1.0.gir +%{_datadir}/vala/vapi/ibus-1.0.vapi +%{_datadir}/vala/vapi/ibus-1.0.deps + +%files devel-docs +%{_datadir}/gtk-doc/html/* + +%changelog +* Thu Jul 11 2013 Takao Fujiwara - 1.5.3-1 +- Bumped to 1.5.3 +- Deleted ibus-xx-g-s-disable-preedit.patch as EOL. +- Deleted ibus-gjs as EOL. +- Removed imsettings-gnome, im-chooser, libgnomekbd dependencies. + +* Thu Jul 11 2013 Takao Fujiwara - 1.5.2-8 +- Updated ibus-HEAD.patch to delete pyxdg dependencies. + +* Mon Jun 17 2013 Takao Fujiwara - 1.5.2-7 +- Bug 972328 - Deleted ibus-panel + +* Mon Jun 17 2013 Takao Fujiwara - 1.5.2-6 +- Bug 972328 - Bring back the dependency of ibus-setup. + +* Tue Jun 11 2013 Takao Fujiwara - 1.5.2-5 +- Removed dependencies of ibus-setup and ibus-pygtk2 + +* Wed Jun 05 2013 Takao Fujiwara - 1.5.2-4 +- Updated ibus-HEAD.patch for upstream. +- Added ibus-xx-1.5.2.patch until 1.5.3 will be released. +- Added ibus-xx-ctrl-space.patch for back compatible triggers. + +* Wed May 01 2013 Takao Fujiwara - 1.5.2-3 +- Updated ibus-HEAD.patch for upstream. +- Deleted ibus-947318-reconnect-gtk-client.patch + +* Sun Apr 21 2013 Takao Fujiwara - 1.5.2-2 +- Separate python files in f19 or later. + +* Thu Apr 18 2013 Takao Fujiwara - 1.5.2-1 +- Bumped to 1.5.2 +- Created noarch packages for python files due to .pyc and .pyo. +- Added man pages. + +* Mon Feb 18 2013 Takao Fujiwara - 1.5.1-3 +- Copied gtk2 module to gtk3 one. + +* Thu Jan 31 2013 Takao Fujiwara - 1.5.1-2 +- Updated ibus-530711-preload-sys.patch. Fixes #904799 + +* Tue Jan 08 2013 Takao Fujiwara - 1.5.1-1 +- Bumped to 1.5.1 +- Bumped to ibus-gjs 3.4.1.20130115 for f17 +- Removed ibus-xx-no-use.diff + +* Fri Dec 14 2012 Takao Fujiwara - 1.4.99.20121109-9 +- Updated ibus-xx-no-use.diff not to use variant.dup_strv() + +* Fri Dec 07 2012 Takao Fujiwara - 1.4.99.20121109-8 +- Resolves #869584 - Removed libgnomekbd dependency in f18. + +* Fri Nov 30 2012 Takao Fujiwara - 1.4.99.20121109-7 +- Set time stamp of ibus/_config.py + +* Fri Nov 30 2012 Takao Fujiwara - 1.4.99.20121109-6 +- Set time stamp of ibus/_config.py + +* Fri Nov 30 2012 Takao Fujiwara - 1.4.99.20121109-5 +- Updated spec file to work witout pkgconfig. + +* Tue Nov 27 2012 Takao Fujiwara - 1.4.99.20121109-4 +- Added comment lines for patches. + +* Tue Nov 27 2012 Takao Fujiwara - 1.4.99.20121109-3 +- Fixed misc issues. + +* Thu Oct 11 2012 Takao Fujiwara - 1.4.99.20121109-2 +- Obsoleted ibus-gnome3 + +* Thu Oct 11 2012 Takao Fujiwara - 1.4.99.20121109-1 +- Bumped to 1.4.99.20121109 +- Removed im-chooser, imsettings-gnome, gnome-icon-theme-symbolic + dependencies in f18 because ibus gnome integration is done. + Use ibus-keyboard instead of input-keyboard-symbolic. +- Disabled ibus-gjs build because of ibus gnome integration. + +* Thu Oct 11 2012 Takao Fujiwara - 1.4.99.20121006-2 +- Updated ibus-HEAD.patch to fix typo in data/dconf/profile/ibus + +* Thu Oct 11 2012 Takao Fujiwara - 1.4.99.20121006-2 +- Updated ibus-HEAD.patch to fix typo in data/dconf/profile/ibus + +* Sat Oct 06 2012 Takao Fujiwara - 1.4.99.20121006-1 +- Bumped to 1.4.99.20121006 +- Removed ibus-xx-segv-reg-prop.patch + +* Fri Sep 14 2012 Takao Fujiwara - 1.4.99.20120914-2 +- Added ibus-xx-segv-reg-prop.patch to avoid segv + +* Fri Sep 14 2012 Takao Fujiwara - 1.4.99.20120914-1 +- Bumped to 1.4.99.20120914 + +* Thu Sep 06 2012 Takao Fujiwara - 1.4.99.20120822-2 +- Updated ibus-530711-preload-sys.patch +- Updated ibus-541492-xkb.patch +- Updated ibus-xx-no-use.diff + Fixed Bug 854161 - not able to add keymap with ibus-setup + +* Wed Aug 22 2012 Takao Fujiwara - 1.4.99.20120822-1 +- Bumped to 1.4.99.20120822 +- Bumped to ibus-gjs 3.4.1.20120815 + Fixed Bug 845956 - ibus backward trigger key is not customized + Fixed Bug 844580 - ibus-dconf does not load the system gvdb +- Separated ibus-810211-no-switch-by-no-trigger.patch from ibus-HEAD.patch + +* Fri Jul 27 2012 Fedora Release Engineering - 1.4.99.20120712-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Thu Jul 19 2012 Takao Fujiwara - 1.4.99.20120712-2 +- Updated ibus-HEAD.patch + Support dconf 0.13.4 + +* Tue Jul 17 2012 Takao Fujiwara - 1.4.99.20120712-1 +- Bumped to 1.4.99.20120712 +- Removed ibus-xx-branding-switcher-ui.patch as upstreamed. + +* Fri Jun 8 2012 Matthias Clasen - 1.4.99.20120428-3 +- Rebuild against new libgnomekbd + +* Fri Apr 27 2012 Takao Fujiwara - 1.4.99.20120428-2 +- Updated ibus-HEAD.patch +- Updated ibus-541492-xkb.patch +- Updated ibus-xx-branding-switcher-ui.patch + Fixed Bug 810211 - Cancel Control + space pressing Control key. +- Updated ibus-xx-no-use.diff + Enabled to customize trigger keys with non-modifier trigger keys. + +* Fri Apr 27 2012 Takao Fujiwara - 1.4.99.20120428-1 +- Bumped to 1.4.99.20120428 + Fixed Bug 799571 - no IME list at the session login. + Fixed Bug 810415 - ibus does not handle Ctrl+space with BUTTON_PRESS. +- Bumped to ibus-gjs 3.4.1.20120428 + Fixed Bug 802052 - no modifiers trigger keys. + Fixed Bug 803244 - IME switch Ctrl+space not working on shell text entry. + +* Tue Apr 24 2012 Kalev Lember - 1.4.99.20120317-4 +- Update the dconf and icon cache rpm scriptlets + +* Wed Apr 18 2012 Takao Fujiwara - 1.4.99.20120317-3 +- Added a RHEL flag. + +* Tue Mar 27 2012 Takao Fujiwara - 1.4.99.20120317-2 +- Bumped to ibus-gjs 3.3.92.20120327 + +* Sat Mar 17 2012 Takao Fujiwara - 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 - 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 +- Updated ibus-HEAD.patch + Fixed Bug 800897 - After doing "ctrl+space", ibus tray icon freezes + +* Mon Mar 05 2012 Takao Fujiwara - 1.4.99.20120303-2 +- Added ibus-HEAD.patch to fix python library to load libibus.so. + +* Sun Mar 04 2012 Takao Fujiwara - 1.4.99.20120303-1 +- Bumped to 1.4.99.20120303 + Fixed Bug 796070 - ibus-setup without no ibus-daemon + +* Wed Feb 08 2012 Takao Fujiwara - 1.4.99.20120203-3 +- Fixed ibus-setup on C locale +- Fixed to show no registered engines from g-c-c. +- Enabled Alt_R keybinding on ko locales for ibus gtk only. + +* Fri Feb 03 2012 Takao Fujiwara - 1.4.99.20120203-1 +- Updated to 1.4.99.20120203 +- Removed ibus-xx-bridge-hotkey.patch +- Updated ibus-541492-xkb.patch to use libgnomekbd. +- Updated ibus-xx-setup-frequent-lang.patch for 1.4.99.20120203 + +* Wed Jan 04 2012 Takao Fujiwara - 1.4.0-17 +- Added ibus-771115-property-compatible.patch for f16 + Fixed Bug 771115 - IBusProperty back compatibility. + +* Fri Dec 30 2011 Takao Fujiwara - 1.4.0-16 +- Enhanced ibus-gnome3 shell lookup window. +- Updated ibus-HEAD.patch from upstream + Fixed Bug 769135 - ibus-x11 SEGV in _process_key_event_done. +- Updated ibus-541492-xkb.patch + Fixed Bug 757889 - ibus-setup SEGV without active engine. + Fixed Bug 760213 - ibus-setup saves XKB variants correctly. + Fixed Bug 769133 - ibus-engine-xkb returns FALSE for ASCII typings. +- Updated ibus-xx-bridge-hotkey.patch for an enhancement. + +* Wed Nov 30 2011 Takao Fujiwara - 1.4.0-14 +- Enabled dconf. +- Updated ibus-HEAD.patch + Fixed Bug 618229 - engine setup buton on ibus-setup. +- Removed ibus-711632-fedora-fallback-icon.patch as upstreamed. +- Updated ibus-xx-bridge-hotkey.patch + Removed Enable/Disable buttons on ibus-setup + +* Fri Nov 18 2011 Takao Fujiwara - 1.4.0-11 +- Updated ibus-541492-xkb.patch + Fixed Bug 750484 - support reloading Xmodmap +- Updated ibus-HEAD.patch + Fixed Bug 753781 - ibus-x11 needs async for hangul ibus_commit_text. + +* Fri Nov 04 2011 Takao Fujiwara - 1.4.0-10 +- Updated ibus-xx-bridge-hotkey.patch for f16 + Fixed no XKB languages from layout only. e.g. in(eng). +- Updated ibus-541492-xkb.patch + Fixed not to show 'eng' on GUI for in(eng). + +* Wed Nov 02 2011 Takao Fujiwara - 1.4.0-9 +- Updated ibus-HEAD.patch + Fixed prev/next keys without global engine. +- Updated ibus-xx-bridge-hotkey.patch for f16 + Fixed Bug 747902 - mouse and ctrl+space not working + Fixed Bug 749770 - IME hotkey after Control + Space +- Updated ibus-711632-fedora-fallback-icon.patch + Fixed Bug 717831 - use old icon for desktops other than gnome + +* Fri Oct 28 2011 Takao Fujiwara - 1.4.0-8 +- Updated ibus-xx-bridge-hotkey.patch for f16 +- Fixed Bug 747902 - mouse and ctrl+space not working + +* Wed Oct 26 2011 Fedora Release Engineering - 1.4.0-6 +- Rebuilt for glibc bug#747377 + +* Fri Oct 21 2011 Takao Fujiwara - 1.4.0-5 +- Fixed Bug 747845 - ibus icon cannot open menu item on gnome-shell + +* Thu Oct 20 2011 Takao Fujiwara - 1.4.0-4 +- Fixed Bug 746869 - no keymaps if the XKB has no group and no variant + +* Fri Sep 30 2011 Takao Fujiwara - 1.4.0-3 +- Rebuilt for f16 gnome-shell 3.2 and gjs 1.30 + +* Wed Sep 28 2011 Takao Fujiwara - 1.4.0-2 +- Updated to 1.4.0 +- Updated ibus-gjs 3.0.2.20110928 for f15. +- Updated ibus-gjs 3.2.0.20110928 for f16. (#740588) +- Updated ibus-530711-preload-sys.patch + Fixed not to show duplicated engine names in setup treeview (#740447) +- Updated bus-gjs-xx-gnome-shell-3.1.4-build-failure.patch for f16. +- Updated ibus-xx-bridge-hotkey.patch + Fixed a XKB configuration without the input focus for f16 (#739165) + Fixed not to show null strings in case of no variants (#738130) + +* Tue Sep 13 2011 Takao Fujiwara - 1.3.99.20110817-5 +- Updated ibus-gjs 3.1.91.20110913 for f16. + +* Thu Sep 08 2011 Takao Fujiwara - 1.3.99.20110817-4 +- Updated ibus-gjs 3.1.91.20110908 and 3.0.2.20110908 for gnome-shell. + Fixed preedit active segments on gnome-shell and X11 apps. +- Added ibus-xx-g-s-disable-preedit.patch + Disabled preedit on gnome-shell for a workaround. +- Updated ibus.spec + Fixed Bug 735879 pre/postun scripts + +* Thu Sep 01 2011 Takao Fujiwara - 1.3.99.20110817-3 +- Fixed Bug 700472 Use a symbol icon instead of an image icon. +- Updated ibus-HEAD.patch for upstream. +- Removed ibus-435880-surrounding-text.patch as upstream. +- Added ibus-711632-fedora-fallback-icon.patch + Fixed SEGV with no icon in oxygen-gtk icon theme. +- Added ibus-xx-bridge-hotkey.patch + Triaged Bug 707370 SetEngine timeout + Fixed Bug 731610 Keep IM state when text input focus changes +- Added transitional ibus-gnome3 package. + Fixed Bug 718110 Use a shell icon instead of pygtk2 icon. + +* Thu May 26 2011 Takao Fujiwara - 1.3.99.20110419-1 +- Updated to 1.3.99.20110419 +- Added ibus-HEAD.patch + Fixed Bug 697471 - ibus-gconf zombie when restart ibus from ibus panel. +- Updated ibus-541492-xkb.patch + Fixed Bug 701202 - us(dvorak) does not show up in list + Updated ibus-1.0.pc for ibus-xkb + Showed XKB variant descriptions only without layout descriptions. +- Updated ibus-xx-setup-frequent-lang.patch + Updated UI strings + +* Tue Apr 19 2011 Takao Fujiwara - 1.3.99.20110408-1 +- Updated to 1.3.99.20110408 + Fixed Bug 683484 - Timed out SetEngine when select an engine from panel. + Fixed Bug 657165 - IBus for gnome-shell for Fedora 15. +- Upstreamed ibus-657165-panel-libs.patch +- Removed ibus-675503-gnome-shell-workaround.patch +- Added ibus-xx-setup-frequent-lang.patch +- Updated ibus-541492-xkb.patch + Fixed Bug 696481 - no the variant maps without language codes +- Added dependency of imsettings-gnome. + Fixed Bug 696510 - need a dependency in ibus-gtk3 for imsettings-gnome + +* Thu Mar 10 2011 Takao Fujiwara - 1.3.99.20110228-1 +- Updated to 1.3.99.20110228 +- Integrated the part of gjs in Bug 657165 ibus for gnome-shell. + Added ibus-657165-panel-libs.patch + Added gnome-shell-ibus-plugins-20110304.tar.bz2 +- Fixed Bug 675503 - a regression in sync mode + Added ibus-675503-gnome-shell-workaround.patch until gnome-shell is updated. +- Fixed Bug 677856 - left ibus snooper when im client is switched. +- Fixed Bug 673047 - abrt ibus_xkb_get_current_layout for non-XKB system + Updated ibus-541492-xkb.patch + +* Wed Feb 09 2011 Fedora Release Engineering - 1.3.99.20110127-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Feb 04 2011 Takao Fujiwara - 1.3.99.20110127-1 +- Updated to 1.3.99.20110127 +- Updated ibus-HEAD.patch from upstream. + +* Wed Jan 26 2011 Takao Fujiwara - 1.3.99.20110117-1 +- Updated to 1.3.99.20110117 +- Fixed Bug 666427 - ibus requires dbus-x11 +- Fixed Bug 670137 - QT_IM_MODULE=xim in ibus.conf without ibus-qt + +* Thu Dec 09 2010 Takao Fujiwara - 1.3.99.20101202-1 +- Updated to 1.3.99.20101202 +- Added ibus-530711-preload-sys.patch + Fixed Bug 530711 - Reload preloaded engines by login + +* Fri Oct 29 2010 Takao Fujiwara - 1.3.99.20101028-1 +- Updated to 1.3.99.20101028 +- Integrated gdbus +- Merged notify.patch into ibus-HEAD.patch + +* Fri Oct 22 2010 Takao Fujiwara - 1.3.8-1 +- Updated to 1.3.8 +- Added ibus-541492-xkb.patch + Fixes Bug 541492 - ibus needs to support some xkb layout switching +- Added ibus-435880-surrounding-text.patch + Fixes Bug 435880 - ibus-gtk requires surrounding-text support +- Added ibus-xx-workaround-gtk3.patch + Workaround for f14 http://koji.fedoraproject.org/koji/taskinfo?taskID=2516604 + +* Mon Aug 23 2010 Takao Fujiwara - 1.3.7-1 +- Updated to 1.3.7 + +* Wed Jul 28 2010 Mamoru Tasaka - 1.3.6-5 +- Rebuild against python 2.7 + +* Thu Jul 22 2010 Jens Petersen - 1.3.6-4 +- keep bumping ibus-gtk obsoletes to avoid upgrade problems + +* Wed Jul 21 2010 David Malcolm - 1.3.6-3 +- Rebuilt for https://fedoraproject.org/wiki/Features/Python_2.7/MassRebuild + +* Thu Jul 15 2010 Colin Walters - 1.3.6-2 +- Rebuild with new gobject-introspection + +* Tue Jul 06 2010 Takao Fujiwara - 1.3.6-1 +- Update to 1.3.6 + +* Wed Jun 30 2010 Jens Petersen +- version the ibus-gtk obsolete and provides +- drop the old redundant ibus-qt obsoletes + +* Mon Jun 28 2010 Matthias Clasen - 1.3.5-3 +- Rebuild against newer gtk + +* Tue Jun 22 2010 Colin Walters - 1.3.5-2 +- Bump Release to keep ahead of F-13 + +* Sat Jun 12 2010 Peng Huang - 1.3.5-1 +- Update to 1.3.5 +- Support gtk3, gobject-introspection and vala. + +* Sat May 29 2010 Peng Huang - 1.3.4-2 +- Update to 1.3.4 + +* Sat May 29 2010 Peng Huang - 1.3.4-1 +- Update to 1.3.4 + +* Tue May 04 2010 Peng Huang - 1.3.3-1 +- Update to 1.3.3 + +* Sun May 02 2010 Peng Huang - 1.3.2-3 +- Embedded language bar in menu by default. +- Fix bug 587353 - [abrt] crash in ibus-1.3.2-2.fc12 + +* Sat Apr 24 2010 Peng Huang - 1.3.2-2 +- Add requires librsvg2 +- Update ibus-HEAD.patch: Update po files and and setting + +* Wed Apr 21 2010 Peng Huang - 1.3.2-1 +- Update to 1.3.2 +- Fix bug 583446 - [abrt] crash in ibus-1.3.1-1.fc12 + +* Mon Apr 05 2010 Peng Huang - 1.3.1-1 +- Update to 1.3.1 + +* Fri Mar 26 2010 Peng Huang - 1.3.0-3 +- Update ibus-HEAD.patch +- Fix bug - some time panel does not show candidates. +- Update some po files + +* Mon Mar 22 2010 Peng Huang - 1.3.0-2 +- Does not check glib micro version in ibus im module. + +* Mon Mar 22 2010 Peng Huang - 1.3.0-1 +- Update to 1.3.0 + +* Tue Feb 02 2010 Peng Huang - 1.2.99.20100202-1 +- Update to 1.2.99.20100202 + +* Mon Jan 11 2010 Peng Huang - 1.2.0.20100111-1 +- Update to 1.2.0.20100111 + +* Fri Dec 25 2009 Peng Huang - 1.2.0.20091225-1 +- Update to 1.2.0.20091225 +- Fix bug 513895 - new IME does not show up in ibus-setup +- Fix bug 531857 - applet order should correspond with preferences order +- Fix bug 532856 - should not list already added input-methods in Add selector + +* Tue Dec 15 2009 Peng Huang - 1.2.0.20091215-1 +- Update to 1.2.0.20091215 + +* Thu Dec 10 2009 Peng Huang - 1.2.0.20091204-2 +- Fix rpmlint warnings and errors. + +* Fri Dec 04 2009 Peng Huang - 1.2.0.20091204-1 +- Update to 1.2.0.20091204 +- Fix Bug 529920 - language panel pops up on the wrong monitor +- Fix Bug 541197 - Ibus crash + +* Tue Nov 24 2009 Peng Huang - 1.2.0.20091124-1 +- Update to 1.2.0.20091124 +- Update some translations. +- Fix bug 538147 - [abrt] crash detected in firefox-3.5.5-1.fc12 + +* Sat Oct 24 2009 Peng Huang - 1.2.0.20091024-1 +- Update to 1.2.0.20091024 + +* Wed Oct 14 2009 Peng Huang - 1.2.0.20091014-2 +- Update to 1.2.0.20091014 +- Change ICON in ibus.conf + +* Sun Sep 27 2009 Peng Huang - 1.2.0.20090927-1 +- Update to 1.2.0.20090927 + +* Tue Sep 15 2009 Peng Huang - 1.2.0.20090915-1 +- Update to 1.2.0.20090915 +- Fix bug 521591 - check if the icon filename is a real file before trying to open it +- Fix bug 522310 - Memory leak on show/hide +- Fix bug 509518 - ibus-anthy should only override to jp layout for kana input + +* Fri Sep 04 2009 Peng Huang - 1.2.0.20090904-2 +- Refresh the tarball. + +* Fri Sep 04 2009 Peng Huang - 1.2.0.20090904-1 +- Update to 1.2.0.20090904 + +* Mon Aug 31 2009 Peng Huang - 1.2.0.20090828-2 +- Change icon path in ibus.conf + +* Fri Aug 28 2009 Peng Huang - 1.2.0.20090828-1 +- Update to 1.2.0.20090828 +- Change the icon on systray. +- Fix segment fault in ibus_hotkey_profile_destroy +- Fix some memory leaks. + +* Wed Aug 12 2009 Peng Huang - 1.2.0.20090812-1 +- Update to 1.2.0.20090812 + +* Mon Aug 10 2009 Peng Huang - 1.2.0.20090807-4 +- Update ibus-HEAD.patch +- Fix Numlock problem. +- Fix some memory leaks. + +* Fri Aug 07 2009 Peng Huang - 1.2.0.20090807-2 +- Update ibus-HEAD.patch +- Fix bug 516154. + +* Fri Aug 07 2009 Peng Huang - 1.2.0.20090807-1 +- Update to 1.2.0.20090807 + +* Thu Aug 06 2009 Peng Huang - 1.2.0.20090806-1 +- Update to 1.2.0.20090806 +- Fix bug 515106 - don't install duplicate files + +* Tue Jul 28 2009 Peng Huang - 1.2.0.20090723-3 +- Update xinput-ibus: setup QT_IM_MODULE if the ibus qt input method plugin exists. + +* Fri Jul 24 2009 Fedora Release Engineering - 1.2.0.20090723-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Thu Jul 23 2009 Peng Huang - 1.2.0.20090723-1 +- Update to 1.2.0.20090723 +- Fix dead loop in ibus-gconf + +* Wed Jul 22 2009 Peng Huang - 1.2.0.20090722-1 +- Update to 1.2.0.20090722 + +* Sun Jul 19 2009 Peng Huang - 1.2.0.20090719-1 +- Update to 1.2.0.20090719 + +* Mon Jun 22 2009 Peng Huang - 1.2.0.20090617-1 +- Update to 1.2.0.20090617 + +* Fri Jun 12 2009 Peng Huang - 1.1.0.20090612-1 +- Update to 1.1.0.20090612 +- Fix bug 504942 - PageUp and PageDown do not work in candidate list +- Fix bug 491040 - Implememnt mouse selection in candidate list + +* Wed Jun 10 2009 Peng Huang - 1.1.0.20090609-1 +- Update to Update to 1.1.0.20090609 +- Fix bug 502414 - Implemented on-screen help facility +- Fix bug 502561 - iBus should show keymap name on iBus panel +- Fix bug 498043 - ibus Alt-grave trigger conflicts with openoffice.org +- Implemented API for setting labels for candidates in LookupTable + +* Sun May 31 2009 Peng Huang - 1.1.0.20090531-1 +- Update to Update to 1.1.0.20090531 + +* Tue May 26 2009 Peng Huang - 1.1.0.20090508-5 +- Update ibus-HEAD.patch. +- Show the default input method with bold text +- Add information text below input methods list + +* Mon May 25 2009 Peng Huang - 1.1.0.20090508-4 +- Update ibus-HEAD.patch. +- Fix bug 501211 - ibus-setup window should be raised if running or just stay on top/grab focus +- Fix bug 501640 - ibus should adds new IMEs at end of engine list not beginning +- Fix bug 501644 - [IBus] focus-out and disabled IME should hide language panel + +* Thu May 14 2009 Peng Huang - 1.1.0.20090508-2 +- Remove requires notification-daemon +- Fix bug 500588 - Hardcoded requirement for notification-daemon + +* Fri May 08 2009 Peng Huang - 1.1.0.20090508-1 +- Update to 1.1.0.20090508 +- Fix bug 499533 - [Indic] ibus should allow input in KDE using all supported Indic locales +- Fix bug 498352 - hotkey config table should list keys in same order as on main setup page +- Fix bug 497707 - ibus French translation update + +* Fri May 08 2009 Peng Huang - 1.1.0.20090423-3 +- Fix bug 498541 - ibus-libs should not contain devel file libibus.so + +* Tue May 05 2009 Peng Huang - 1.1.0.20090423-2 +- Fix bug 498141 - new ibus install needs gtk immodules +- Separate ibus document from ibus-devel to ibus-devel-docs + +* Thu Apr 23 2009 Peng Huang - 1.1.0.20090423-1 +- Update to ibus-1.1.0.20090423. +- Fix bug 497265 - [mai_IN] Maithili language name is not correct. +- Fix bug 497279 - IBus does not works with evolution correctly. +- Enhance authentication both in daemon & clients + +* Fri Apr 17 2009 Peng Huang - 1.1.0.20090417-1 +- Update to ibus-1.1.0.20090417. +- Fix bug 496199 - cannot remove Ctrl+Space hotkey with ibus-setup + +* Fri Apr 17 2009 Peng Huang - 1.1.0.20090413-4 +- Update ibus-HEAD.patch. +- Next Engine hotkey will do nothing if the IM is not active. + +* Wed Apr 15 2009 Peng Huang - 1.1.0.20090413-3 +- Update ibus-HEAD.patch. +- Fix bug 495431 - ibus Release modifier doesn't work with Alt +- Fix bug 494445 - ibus-hangul missing Hangul Han/En mode + (and Alt_R+release hotkey) +- Update te.po + +* Tue Apr 14 2009 Peng Huang - 1.1.0.20090413-2 +- Update ibus-HEAD.patch. +- Change the mode of /tmp/ibus-$USER to 0700 to improve security +- Change the mode of /tmp/ibus-$USER/socket-address to 0600 to improve security +- Update as.po + +* Mon Apr 13 2009 Peng Huang - 1.1.0.20090413-1 +- Update to ibus-1.1.0.20090413. +- Fix crash when restart the ibus-daemon +- Add some translations. + +* Tue Apr 07 2009 Peng Huang - 1.1.0.20090407-3 +- Update the tarball. +- Fix bug 494511 - ibus-gtk makes gnome-terminal abort + when a key is pressed + +* Tue Apr 07 2009 Peng Huang - 1.1.0.20090407-2 +- Update default hotkey settings. + +* Tue Apr 07 2009 Peng Huang - 1.1.0.20090407-1 +- Update to ibus-1.1.0.20090407. +- Fix bug 491042 - ibus default trigger hotkeys +- Fix bug 492929 - ibus-hangul can cause gtk app to lockup +- Fix bug 493701 - (ibus) imsettings disconnect/reconnect kills gtk app +- Fix bug 493687 - ibus-hangul should default to vertical candidate selection +- Fix bug 493449 - ibus broke Alt-F2 command auto-completion + +* Tue Mar 31 2009 Peng Huang - 1.1.0.20090331-1 +- Update to ibus-1.1.0.20090331. +- Fix bug 492956 - screws up keyboard input in firefox +- Fix bug 490143 - ibus issue with gnome-keyring + +* Sun Mar 29 2009 Peng Huang - 1.1.0.20090311-3 +- Recreate the ibus-HEAD.patch from upstream git source tree +- Fix bug 491999 - up/down arrow keys broken in xchat + +* Sat Mar 28 2009 Peng Huang - 1.1.0.20090311-2 +- Recreate the ibus-HEAD.patch from upstream git source tree. +- Fix bug 490009 - Deleting Next Engine shortcuts doesn't work +- Fix bug 490381 - Change "Next/Previous engine" labels + +* Wed Mar 11 2009 Peng Huang - 1.1.0.20090311-1 +- Update to ibus-1.1.0.20090311. +- Update setup ui follow GNOME Human Interface Guidelines 2.2 (#489497). + +* Fri Mar 6 2009 Peng Huang - 1.1.0.20090306-1 +- Update to ibus-1.1.0.20090306. + +* Tue Mar 3 2009 Jens Petersen +- use post for ibus-gtk requires glib2 + +* Mon Mar 2 2009 Jens Petersen - 1.1.0.20090225-2 +- drop the superfluous ibus-0.1 engine obsoletes +- move glib2 requires to gtk package + +* Wed Feb 25 2009 Peng Huang - 1.1.0.20090225-1 +- Update to ibus-1.1.0.20090225. +- Fix problems in %%post and %%postun scripts. +- Hide ibus & ibus preferences menu items. + +* Tue Feb 17 2009 Peng Huang - 1.1.0.20090211-10 +- Recreate the ibus-HEAD.patch from upstream git source tree. +- Put 'Select an input method' in engine select combobox (#485861). + +* Tue Feb 17 2009 Peng Huang - 1.1.0.20090211-9 +- Add requires im-chooser >= 1.2.5. + +* Tue Feb 17 2009 Peng Huang - 1.1.0.20090211-8 +- Recreate the ibus-HEAD.patch from upstream git source tree. +- Fix ibus-hangul segfault (#485438). + +* Mon Feb 16 2009 Peng Huang - 1.1.0.20090211-6 +- Recreate the ibus-HEAD.patch from upstream git source tree. +- The new patch fixes ibus-x11 segfault (#485661). + +* Sun Feb 15 2009 Peng Huang - 1.1.0.20090211-5 +- Recreate the ibus-HEAD.patch from upstream git source tree. + +* Sun Feb 15 2009 Peng Huang - 1.1.0.20090211-4 +- Remove gnome-python2-gconf from requires. + +* Fri Feb 13 2009 Peng Huang - 1.1.0.20090211-3 +- Update ibus-HEAD.patch, to fix bug 484652. + +* Fri Feb 13 2009 Peng Huang - 1.1.0.20090211-2 +- Add patch ibus-HEAD.patch, to update ibus to HEAD version. + +* Wed Feb 11 2009 Peng Huang - 1.1.0.20090211-1 +- Add --xim argument in xinput-ibus +- Add Obsoletes: ibus-qt <= 1.1.0 +- Move libibus.so.* to ibus-libs to make ibus multilib. +- Update to 1.1.0.20090211. + +* Thu Feb 05 2009 Peng Huang - 1.1.0.20090205-1 +- Update to 1.1.0.20090205. + +* Tue Feb 03 2009 Peng Huang - 0.1.1.20090203-1 +- Update to 0.1.1.20090203. + +* Sat Nov 29 2008 Ignacio Vazquez-Abrams - 0.1.1.20081023-3 +- Rebuild for Python 2.6 + +* Wed Nov 19 2008 Peng Huang - 0.1.1.20081023-2 +- Move libibus-gtk.so from ibus.rpm to ibus-gtk.rpm to fix bug 472146. + +* Thu Oct 23 2008 Peng Huang - 0.1.1.20081023-1 +- Update to 0.1.1.20081023. + +* Thu Oct 16 2008 Peng Huang - 0.1.1.20081016-1 +- Update to 0.1.1.20081016. + +* Tue Oct 7 2008 Jens Petersen - 0.1.1.20081006-3 +- remove the empty %%doc file entries + +* Tue Oct 7 2008 Jens Petersen - 0.1.1.20081006-2 +- add xinputrc alternative when installing or uninstalling + +* Mon Oct 06 2008 Peng Huang - 0.1.1.20081006-1 +- Update to 0.1.1.20081006. + +* Sun Oct 05 2008 Peng Huang - 0.1.1.20081005-1 +- Update to 0.1.1.20081005. + +* Sat Oct 04 2008 Peng Huang - 0.1.1.20081004-1 +- Update to 0.1.1.20081004. + +* Wed Oct 01 2008 Peng Huang - 0.1.1.20081001-1 +- Update to 0.1.1.20081001. + +* Tue Sep 30 2008 Peng Huang - 0.1.1.20080930-1 +- Update to 0.1.1.20080930. + +* Tue Sep 23 2008 Peng Huang - 0.1.1.20080923-1 +- Update to 0.1.1.20080923. + +* Wed Sep 17 2008 Peng Huang - 0.1.1.20080917-1 +- Update to 0.1.1.20080917. + +* Tue Sep 16 2008 Peng Huang - 0.1.1.20080916-1 +- Update to 0.1.1.20080916. + +* Mon Sep 15 2008 Peng Huang - 0.1.1.20080914-1 +- Update to 0.1.1.20080914. + +* Mon Sep 08 2008 Peng Huang - 0.1.1.20080908-1 +- Update to 0.1.1.20080908. + +* Mon Sep 01 2008 Peng Huang - 0.1.1.20080901-1 +- Update to 0.1.1.20080901. + +* Sat Aug 30 2008 Peng Huang - 0.1.1.20080830-1 +- Update to 0.1.1.20080830. + +* Mon Aug 25 2008 Peng Huang - 0.1.1.20080825-1 +- Update to 0.1.1.20080825. + +* Sat Aug 23 2008 Peng Huang - 0.1.1.20080823-1 +- Update to 0.1.1.20080823. + +* Fri Aug 15 2008 Peng Huang - 0.1.1.20080815-1 +- Update to 0.1.1.20080815. + +* Tue Aug 12 2008 Peng Huang - 0.1.1.20080812-1 +- Update to 0.1.1.20080812. + +* Mon Aug 11 2008 Peng Huang - 0.1.0.20080810-2 +- Add gnome-python2-gconf in Requires. + +* Thu Aug 07 2008 Peng Huang - 0.1.0.20080810-1 +- The first version.