From 481f2eee5940f2de0ab81cab48c2c8aefaae9f8b Mon Sep 17 00:00:00 2001 From: Takao Fujiwara Date: Nov 18 2011 10:55:48 +0000 Subject: Fixed Bug 750484 - support reloading Xmodmap Fixed Bug 753781 - ibus-x11 needs async for hangul ibus_commit_text. --- diff --git a/.gitignore b/.gitignore index ee667cc..a161180 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,5 @@ ibus-1.3.6.tar.gz /ibus-gjs-3.2.1.20111028.tar.gz /ibus-gjs-3.0.2.20111104.tar.gz /ibus-gjs-3.2.1.20111104.tar.gz +/ibus-gjs-3.0.2.20111118.tar.gz +/ibus-gjs-3.2.1.20111118.tar.gz diff --git a/ibus-541492-xkb.patch b/ibus-541492-xkb.patch index d035ee7..8f7cf00 100644 --- a/ibus-541492-xkb.patch +++ b/ibus-541492-xkb.patch @@ -1,18 +1,18 @@ -From 10bff3bb3c4ea8ec1316beb47b6d8fcbdfd357bf Mon Sep 17 00:00:00 2001 +From a8f02d4be33f87cf97039736407cd13e795b992b Mon Sep 17 00:00:00 2001 From: fujiwarat -Date: Fri, 4 Nov 2011 18:17:29 +0900 +Date: Fri, 18 Nov 2011 18:05:42 +0900 Subject: [PATCH] Add XKB layouts --- Makefile.am | 7 + configure.ac | 56 + - data/ibus.schemas.in | 36 + + data/ibus.schemas.in | 47 + ibus-1.0.pc.in | 2 + ibus/Makefile.am | 26 + ibus/__init__.py | 2 + ibus/bus.py | 3 + ibus/interface/iibus.py | 3 + - ibus/xkblayout.py.in | 231 +++ + ibus/xkblayout.py.in | 360 ++++ ibus/xkbxml.py.in | 419 ++++ setup/Makefile.am | 1 + setup/enginecombobox.py | 7 +- @@ -38,7 +38,7 @@ Subject: [PATCH] Add XKB layouts xkb/xkblib.h | 41 + xkb/xkbxml.c | 345 ++++ xkb/xkbxml.h | 113 ++ - 34 files changed, 9524 insertions(+), 4 deletions(-) + 34 files changed, 9664 insertions(+), 4 deletions(-) create mode 100644 ibus/xkblayout.py.in create mode 100644 ibus/xkbxml.py.in create mode 100644 setup/xkbsetup.py @@ -166,10 +166,10 @@ index f452666..227e28e 100644 Build gconf modules $enable_gconf Build memconf modules $enable_memconf diff --git a/data/ibus.schemas.in b/data/ibus.schemas.in -index 663358c..8979515 100644 +index 663358c..e0a6a37 100644 --- a/data/ibus.schemas.in +++ b/data/ibus.schemas.in -@@ -191,6 +191,42 @@ +@@ -191,6 +191,53 @@ @@ -197,6 +197,17 @@ index 663358c..8979515 100644 + + + ++ /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 @@ -309,10 +320,10 @@ index 678d517..7de56fc 100644 diff --git a/ibus/xkblayout.py.in b/ibus/xkblayout.py.in new file mode 100644 -index 0000000..9d7468f +index 0000000..c0c95ce --- /dev/null +++ b/ibus/xkblayout.py.in -@@ -0,0 +1,231 @@ +@@ -0,0 +1,360 @@ +# vim:set et sts=4 sw=4: +# +# ibus - The Input Bus @@ -341,15 +352,21 @@ index 0000000..9d7468f + ) + +import os, sys, time ++import glib + +XKB_COMMAND = @XKB_COMMAND@ +XKB_SESSION_TIME_OUT = 30.0 ++XMODMAP_CMD = 'xmodmap' ++XMODMAP_KNOWN_FILES = ['.xmodmap', '.xmodmaprc', '.Xmodmap', '.Xmodmaprc'] + +class XKBLayout(): + def __init__(self, config = None, command=XKB_COMMAND): + self.__config = config + self.__command = command + self.__use_xkb = True ++ self.__xkb_pid = None ++ self.__xmodmap_pid = None ++ self.__use_xmodmap = True + if self.__command == None: + self.__use_xkb = False + self.__default_layout = self.get_layout() @@ -363,6 +380,9 @@ index 0000000..9d7468f + self.__xkb_latin_layouts = list(self.__config.get_value('general', + 'xkb_latin_layouts', + [])) ++ self.__use_xmodmap = bool(self.__config.get_value('general', ++ 'use_xmodmap', ++ True)) + + + def __get_model_from_layout(self, layout): @@ -391,6 +411,44 @@ index 0000000..9d7468f + break + return retval + ++ def __get_userhome(self): ++ if 'HOME' not in os.environ: ++ import pwd ++ userhome = pwd.getpwuid(os.getuid()).pw_dir ++ else: ++ userhome = os.environ['HOME'] ++ userhome = userhome.rstrip('/') ++ return userhome ++ ++ def __get_fullpath(self, command): ++ if 'PATH' in os.environ: ++ envpath = os.environ['PATH'] ++ else: ++ envpath = os.defpath ++ PATH = envpath.split(os.pathsep) ++ for dir in PATH: ++ filepath = os.path.join(dir, command) ++ if os.path.exists(filepath): ++ return filepath ++ return None ++ ++ def __set_layout_cb(self, pid, status): ++ if self.__xkb_pid != pid: ++ print >> sys.stderr, \ ++ 'ibus.xkblayout: set_layout_cb has another pid' ++ return ++ self.__xkb_pid.close() ++ self.__xkb_pid = None ++ self.set_xmodmap() ++ ++ def __set_xmodmap_cb(self, pid, status): ++ if self.__xmodmap_pid != pid: ++ print >> sys.stderr, \ ++ 'ibus.xkblayout: set_xmodmap_cb has another pid' ++ return ++ self.__xmodmap_pid.close() ++ self.__xmodmap_pid = None ++ + def use_xkb(self, enable): + if self.__command == None: + return @@ -486,7 +544,6 @@ index 0000000..9d7468f + return + args = [] + args.append(self.__command) -+ args.append(os.path.basename(self.__command)) + args.append('--layout') + args.append(layout) + if model != None: @@ -495,8 +552,10 @@ index 0000000..9d7468f + if option != None: + args.append('--option') + args.append(option) -+ pid = os.spawnl(os.P_NOWAIT, *args) -+ os.waitpid(pid, 0) ++ pid = glib.spawn_async(argv=args, ++ flags=glib.SPAWN_DO_NOT_REAP_CHILD)[0] ++ self.__xkb_pid = pid ++ glib.child_watch_add(self.__xkb_pid, self.__set_layout_cb) + + def set_default_layout(self, layout='default', model='default'): + if not self.__use_xkb: @@ -544,6 +603,87 @@ index 0000000..9d7468f + self.__default_layout = self.get_layout() + self.__default_model = self.get_model() + self.__default_option = self.get_option() ++ ++ def set_xmodmap(self): ++ if not self.__use_xmodmap: ++ return ++ if self.__xmodmap_pid != None: ++ return ++ xmodmap_cmdpath = self.__get_fullpath(XMODMAP_CMD) ++ if xmodmap_cmdpath == None: ++ xmodmap_cmdpath = XMODMAP_CMD ++ for xmodmap_file in XMODMAP_KNOWN_FILES: ++ xmodmap_filepath = os.path.join(self.__get_userhome(), xmodmap_file) ++ if not os.path.exists(xmodmap_filepath): ++ continue ++ pid = glib.spawn_async(argv=[xmodmap_cmdpath, xmodmap_filepath], ++ flags=glib.SPAWN_DO_NOT_REAP_CHILD)[0] ++ self.__xmodmap_pid = pid ++ glib.child_watch_add(self.__xmodmap_pid, self.__set_xmodmap_cb) ++ break ++ ++ ++def test(): ++ import gtk ++ import ibus ++ ++ window = None ++ config = None ++ xkblayout = None ++ ++ def __destroy(*args): ++ window.hide() ++ gtk.main_quit() ++ ++ def __test_set_session_xkb(button): ++ xkblayout.set_layout('default') ++ print 'Reset the default keymap' ++ print 'Layout:', xkblayout.get_default_layout() ++ print 'Option:', xkblayout.get_default_option() ++ ++ def __test_set_user_xkb(button): ++ layout = 'us' ++ model = 'default' ++ option = 'default' ++ if len(sys.argv) > 1: ++ layout = sys.argv[1] ++ if len(sys.argv) > 2: ++ model = sys.argv[2] ++ if model == 'None': ++ model = None ++ if len(sys.argv) > 3: ++ option = sys.argv[3] ++ if option == 'None': ++ optoin = None ++ xkblayout.set_layout(layout, model, option) ++ print 'Test set_layout:', layout, model, option ++ ++ if ibus.get_address() != None: ++ bus = ibus.Bus() ++ config = bus.get_config() ++ else: ++ print 'no ibus' ++ xkblayout = XKBLayout(config) ++ print 'Layout:', xkblayout.get_default_layout() ++ print 'Option:', xkblayout.get_default_option() ++ window = gtk.Window(gtk.WINDOW_TOPLEVEL) ++ window.connect('destroy', __destroy) ++ vb = gtk.VBox() ++ window.add(vb) ++ b = gtk.Button('Test xkb') ++ b.connect('clicked', __test_set_user_xkb) ++ vb.add(b) ++ b = gtk.Button('Reset the default xkb') ++ b.connect('clicked', __test_set_session_xkb) ++ vb.add(b) ++ window.show_all() ++ if config != None: ++ ibus.main() ++ else: ++ gtk.main() ++ ++if __name__ == '__main__': ++ test() diff --git a/ibus/xkbxml.py.in b/ibus/xkbxml.py.in new file mode 100644 index 0000000..9407c13 @@ -2803,7 +2943,7 @@ index 0000000..6986b5c +G_END_DECLS +#endif diff --git a/ui/gtk/panel.py b/ui/gtk/panel.py -index 90be1d5..8804634 100644 +index f71a36d..a202d13 100644 --- a/ui/gtk/panel.py +++ b/ui/gtk/panel.py @@ -132,6 +132,22 @@ class Panel(ibus.PanelBase): diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch index 83f0a41..7d3816e 100644 --- a/ibus-HEAD.patch +++ b/ibus-HEAD.patch @@ -323,3 +323,176 @@ index 0a4f3fb..059d660 100644 -- 1.7.6.4 +From a8c21dd867f4a9e1c37cae4f6509af1491c5fc96 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Thu, 17 Nov 2011 15:10:05 +0900 +Subject: [PATCH] Use ibus_input_context_process_key_event_async in ibus-x11 + +--- + client/x11/main.c | 115 ++++++++++++++++++++++++++++++++++++++++++++--------- + 1 files changed, 96 insertions(+), 19 deletions(-) + +diff --git a/client/x11/main.c b/client/x11/main.c +index 0ba826c..8611bfc 100644 +--- a/client/x11/main.c ++++ b/client/x11/main.c +@@ -116,6 +116,8 @@ static gint g_debug_level = 0; + + static IBusBus *_bus = NULL; + ++static gboolean _use_sync_mode = FALSE; ++ + static void + _xim_preedit_start (XIMS xims, const X11IC *x11ic) + { +@@ -443,6 +445,31 @@ xim_unset_ic_focus (XIMS xims, IMChangeFocusStruct *call_data) + + } + ++static void ++_process_key_event_done (GObject *object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ IBusInputContext *context = (IBusInputContext *)object; ++ IMForwardEventStruct *pfe = (IMForwardEventStruct*) user_data; ++ ++ GError *error = NULL; ++ gboolean retval = ibus_input_context_process_key_event_async_finish ( ++ context, ++ res, ++ &error); ++ ++ if (error != NULL) { ++ g_warning ("Process Key Event failed: %s.", error->message); ++ g_error_free (error); ++ } ++ ++ if (retval == FALSE) { ++ IMForwardEvent (_xims, (XPointer) pfe); ++ } ++ g_free (pfe); ++} ++ + static int + xim_forward_event (XIMS xims, IMForwardEventStruct *call_data) + { +@@ -469,32 +496,61 @@ xim_forward_event (XIMS xims, IMForwardEventStruct *call_data) + if (event.type == GDK_KEY_RELEASE) { + event.state |= IBUS_RELEASE_MASK; + } +- retval = ibus_input_context_process_key_event (x11ic->context, +- event.keyval, +- event.hardware_keycode - 8, +- event.state); +- if (retval) { +- if (! x11ic->has_preedit_area) { +- _xim_set_cursor_location (x11ic); ++ ++ if (_use_sync_mode) { ++ retval = ibus_input_context_process_key_event ( ++ x11ic->context, ++ event.keyval, ++ event.hardware_keycode - 8, ++ event.state); ++ if (retval) { ++ if (! x11ic->has_preedit_area) { ++ _xim_set_cursor_location (x11ic); ++ } ++ return 1; + } +- return 1; +- } + +- IMForwardEventStruct fe; +- memset (&fe, 0, sizeof (fe)); ++ IMForwardEventStruct fe; ++ memset (&fe, 0, sizeof (fe)); + +- fe.major_code = XIM_FORWARD_EVENT; +- fe.icid = x11ic->icid; +- fe.connect_id = x11ic->connect_id; +- fe.sync_bit = 0; +- fe.serial_number = 0L; +- fe.event = call_data->event; ++ fe.major_code = XIM_FORWARD_EVENT; ++ fe.icid = x11ic->icid; ++ fe.connect_id = x11ic->connect_id; ++ fe.sync_bit = 0; ++ fe.serial_number = 0L; ++ fe.event = call_data->event; + +- IMForwardEvent (_xims, (XPointer) &fe); ++ IMForwardEvent (_xims, (XPointer) &fe); + +- return 1; ++ retval = 1; ++ } ++ else { ++ IMForwardEventStruct *pfe; ++ ++ pfe = g_new0 (IMForwardEventStruct, 1); ++ pfe->major_code = XIM_FORWARD_EVENT; ++ pfe->icid = x11ic->icid; ++ pfe->connect_id = x11ic->connect_id; ++ pfe->sync_bit = 0; ++ pfe->serial_number = 0L; ++ memcpy (&pfe->event, xevent, sizeof (XKeyEvent)); ++ ++ ibus_input_context_process_key_event_async ( ++ x11ic->context, ++ event.keyval, ++ event.hardware_keycode - 8, ++ event.state, ++ -1, ++ NULL, ++ _process_key_event_done, ++ pfe); ++ retval = 1; ++ } ++ return retval; + } + ++#undef _XIM_COPY_XKEYEVENT ++ + + static int + xim_open (XIMS xims, IMOpenStruct *call_data) +@@ -897,6 +953,25 @@ _context_disabled_cb (IBusInputContext *context, + _xim_preedit_end (_xims, x11ic); + } + ++static gboolean ++_get_boolean_env(const gchar *name, ++ gboolean defval) ++{ ++ const gchar *value = g_getenv (name); ++ ++ if (value == NULL) ++ return defval; ++ ++ if (g_strcmp0 (value, "") == 0 || ++ g_strcmp0 (value, "0") == 0 || ++ g_strcmp0 (value, "false") == 0 || ++ g_strcmp0 (value, "False") == 0 || ++ g_strcmp0 (value, "FALSE") == 0) ++ return FALSE; ++ ++ return TRUE; ++} ++ + static void + _init_ibus (void) + { +@@ -909,6 +984,8 @@ _init_ibus (void) + + g_signal_connect (_bus, "disconnected", + G_CALLBACK (_bus_disconnected_cb), NULL); ++ ++ _use_sync_mode = _get_boolean_env ("IBUS_ENABLE_SYNC_MODE", FALSE); + } + + static void +-- +1.7.6.4 + diff --git a/ibus.spec b/ibus.spec index 464552d..c235fab 100644 --- a/ibus.spec +++ b/ibus.spec @@ -7,16 +7,16 @@ %if 0%{?fedora} > 16 %define have_bridge_hotkey 1 -%define ibus_gjs_version 3.2.1.20111104 +%define ibus_gjs_version 3.2.1.20111118 %define ibus_gjs_build_failure 1 %else %if 0%{?fedora} > 15 %define have_bridge_hotkey 1 -%define ibus_gjs_version 3.2.1.20111104 +%define ibus_gjs_version 3.2.1.20111118 %define ibus_gjs_build_failure 0 %else %define have_bridge_hotkey 0 -%define ibus_gjs_version 3.0.2.20111104 +%define ibus_gjs_version 3.0.2.20111118 %define ibus_gjs_build_failure 0 %endif %endif @@ -30,7 +30,7 @@ Name: ibus Version: 1.4.0 -Release: 10%{?dist} +Release: 11%{?dist} Summary: Intelligent Input Bus for Linux OS License: LGPLv2+ Group: System Environment/Libraries @@ -406,6 +406,12 @@ fi %{_datadir}/gtk-doc/html/* %changelog +* 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). diff --git a/sources b/sources index e9cadd9..03f0ac7 100644 --- a/sources +++ b/sources @@ -1,3 +1,3 @@ b4f063794e89c71eb1f8cb543210da30 ibus-1.4.0.tar.gz -da885c3a62f509327859d1ed65544693 ibus-gjs-3.0.2.20111104.tar.gz -d49a93c05a69bcdd65a839381d9fbaa1 ibus-gjs-3.2.1.20111104.tar.gz +4257048de65ea404389bb941a51db667 ibus-gjs-3.0.2.20111118.tar.gz +ff5fdd8df5c64f3253ec37db135f336a ibus-gjs-3.2.1.20111118.tar.gz