Fixed Bug 750484 - support reloading Xmodmap

Fixed Bug 753781 - ibus-x11 needs async for hangul ibus_commit_text.
This commit is contained in:
Takao Fujiwara 2011-11-18 19:55:48 +09:00
parent 3ef409f362
commit 481f2eee59
5 changed files with 340 additions and 19 deletions

2
.gitignore vendored
View File

@ -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

View File

@ -1,18 +1,18 @@
From 10bff3bb3c4ea8ec1316beb47b6d8fcbdfd357bf Mon Sep 17 00:00:00 2001
From a8f02d4be33f87cf97039736407cd13e795b992b Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
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 @@
</locale>
</schema>
<schema>
@ -197,6 +197,17 @@ index 663358c..8979515 100644
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/use_xmodmap</key>
+ <applyto>/desktop/ibus/general/use_xmodmap</applyto>
+ <owner>ibus</owner>
+ <type>bool</type>
+ <default>true</default>
+ <locale name="C">
+ <short>Use xmodmap</short>
+ <long>Run xmodmap if .xmodmap/.Xmodmap exists.</long>
+ </locale>
+ </schema>
+ <schema>
+ <key>/schemas/desktop/ibus/general/xkb_latin_layouts</key>
+ <applyto>/desktop/ibus/general/xkb_latin_layouts</applyto>
+ <owner>ibus</owner>
@ -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):

View File

@ -323,3 +323,176 @@ index 0a4f3fb..059d660 100644
--
1.7.6.4
From a8c21dd867f4a9e1c37cae4f6509af1491c5fc96 Mon Sep 17 00:00:00 2001
From: fujiwarat <takao.fujiwara1@gmail.com>
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

View File

@ -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 <tfujiwar@redhat.com> - 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 <tfujiwar@redhat.com> - 1.4.0-10
- Updated ibus-xx-bridge-hotkey.patch for f16
Fixed no XKB languages from layout only. e.g. in(eng).

View File

@ -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