[gnome-settings-daemon/wip/input-sources: 5/5] keyboard: Add the IBus engine setting code
- From: Rui Matos <rtcm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon/wip/input-sources: 5/5] keyboard: Add the IBus engine setting code
- Date: Fri, 27 Apr 2012 12:35:26 +0000 (UTC)
commit cdffffe6956f7805298e29aa26d53bf917bbc348
Author: Rui Matos <tiagomatos gmail com>
Date: Tue Apr 17 15:39:00 2012 +0200
keyboard: Add the IBus engine setting code
We simply connect to IBus and tell it to switch engine when our
current input source setting is changed and an IBus engine is
specified there. The responsibility to make sure that this engine
actually exists on the IBus side is left to whoever writes the
setting.
At the same time, if an IBus engine is specified, we flip the setting
that backs the Gtk/IMModule XSETTING so that GTK+ applications get
notified to load the IBus input method when needed and go back to the
simple input method when IBus isn't required.
configure.ac | 28 +++++++++++++++-
plugins/keyboard/Makefile.am | 2 +
plugins/keyboard/gsd-keyboard-manager.c | 56 +++++++++++++++++++++++++++++++
3 files changed, 85 insertions(+), 1 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index f05cb88..0647bdf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -184,6 +184,32 @@ AC_ARG_WITH(xkb-config-root,
[XKBCONFIGROOT=${datadir}/X11/xkb])
AC_SUBST([XKBCONFIGROOT])
+IBUS_CFLAGS=
+IBUS_LIBS=
+AC_ARG_ENABLE(ibus,
+ AS_HELP_STRING([--enable-ibus],
+ [Enable IBus support (auto)]),
+ enable_ibus=$enableval,
+ enable_ibus=auto)
+
+if test "x$enable_ibus" = "xno" ; then
+ have_ibus=no
+else
+ have_ibus=no
+ PKG_CHECK_MODULES(IBUS, ibus-1.0, have_ibus=yes, have_ibus=no)
+
+ if test "x$enable_ibus" = "xyes" -a "x$have_ibus" = "xno" ; then
+ AC_MSG_ERROR(IBus support explicity enabled but not available)
+ fi
+
+ if test "x$have_ibus" = "xyes" ; then
+ AC_DEFINE(HAVE_IBUS, 1, [Defined if IBus support is enabled])
+ fi
+fi
+AM_CONDITIONAL(HAVE_IBUS, test "x$have_ibus" = "xyes")
+AC_SUBST(IBUS_CFLAGS)
+AC_SUBST(IBUS_LIBS)
+
dnl ---------------------------------------------------------------------------
dnl - Housekeeping plugin stuff
dnl ---------------------------------------------------------------------------
@@ -515,7 +541,7 @@ echo "
Session tracking: ${SESSION_TRACKING}
LCMS DICT support: ${have_new_lcms}
-
+ IBus support: ${have_ibus}
Libnotify support: ${have_libnotify}
PackageKit support: ${have_packagekit}
Smartcard support: ${have_smartcard_support}
diff --git a/plugins/keyboard/Makefile.am b/plugins/keyboard/Makefile.am
index d1192f3..2b90548 100644
--- a/plugins/keyboard/Makefile.am
+++ b/plugins/keyboard/Makefile.am
@@ -37,6 +37,7 @@ libkeyboard_la_CFLAGS = \
$(PLUGIN_CFLAGS) \
$(SETTINGS_PLUGIN_CFLAGS) \
$(KEYBOARD_CFLAGS) \
+ $(IBUS_CFLAGS) \
$(AM_CFLAGS)
libkeyboard_la_LDFLAGS = \
@@ -48,6 +49,7 @@ libkeyboard_la_LIBADD = \
$(SETTINGS_PLUGIN_LIBS) \
$(XF86MISC_LIBS) \
$(KEYBOARD_LIBS) \
+ $(IBUS_LIBS) \
$(NULL)
noinst_PROGRAMS = test-keyboard
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
index 68d60e0..744e798 100644
--- a/plugins/keyboard/gsd-keyboard-manager.c
+++ b/plugins/keyboard/gsd-keyboard-manager.c
@@ -42,6 +42,10 @@
#include <X11/keysym.h>
#include <X11/extensions/XKBrules.h>
+#ifdef HAVE_IBUS
+#include <ibus.h>
+#endif
+
#include "gnome-settings-profile.h"
#include "gsd-keyboard-manager.h"
#include "gsd-input-helper.h"
@@ -81,11 +85,22 @@
#define DFLT_XKB_MODEL "pc105"
#endif
+#ifdef HAVE_IBUS
+#define GNOME_DESKTOP_INTERFACE_DIR "org.gnome.desktop.interface"
+
+#define KEY_GTK_IM_MODULE "gtk-im-module"
+#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
+#define GTK_IM_MODULE_IBUS "ibus"
+#endif
+
struct GsdKeyboardManagerPrivate
{
guint start_idle_id;
GSettings *settings;
GSettings *is_settings;
+#ifdef HAVE_IBUS
+ GSettings *interface_settings;
+#endif
gulong ignore_serial;
gint xkb_event_base;
GsdNumLockState old_state;
@@ -326,6 +341,28 @@ apply_xkb_layout (GsdKeyboardManager *manager,
g_free (rules_path);
}
+#ifdef HAVE_IBUS
+static void
+apply_ibus_engine (GsdKeyboardManager *manager,
+ const gchar *engine)
+{
+ IBusEngineDesc *desc = NULL;
+ IBusBus *ibus = ibus_bus_new ();
+
+ if (!ibus_bus_set_global_engine (ibus, engine) ||
+ !(desc = ibus_bus_get_global_engine (ibus)))
+ g_warning ("Couldn't set IBus engine");
+ else
+ g_settings_set_string (manager->priv->interface_settings,
+ KEY_GTK_IM_MODULE,
+ GTK_IM_MODULE_IBUS);
+
+ g_object_unref (ibus);
+ if (desc)
+ g_object_unref (desc);
+}
+#endif
+
static void
apply_input_sources_settings (GSettings *settings,
gchar *key,
@@ -338,6 +375,14 @@ apply_input_sources_settings (GSettings *settings,
"(&s&s&s)", NULL, &layout, &engine);
apply_xkb_layout (manager, layout);
+#ifdef HAVE_IBUS
+ if (engine && engine[0] != '\0')
+ apply_ibus_engine (manager, engine);
+ else
+ g_settings_set_string (manager->priv->interface_settings,
+ KEY_GTK_IM_MODULE,
+ GTK_IM_MODULE_SIMPLE);
+#endif
}
static void
@@ -465,6 +510,11 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
manager->priv->is_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR);
manager->priv->ignore_serial = XLastKnownRequestProcessed (display) - 1;
+#ifdef HAVE_IBUS
+ ibus_init ();
+ manager->priv->interface_settings = g_settings_new (GNOME_DESKTOP_INTERFACE_DIR);
+#endif
+
/* apply current settings before we install the callback */
apply_settings (manager->priv->settings, NULL, manager);
apply_input_sources_settings (manager->priv->is_settings, NULL, manager);
@@ -517,6 +567,12 @@ gsd_keyboard_manager_stop (GsdKeyboardManager *manager)
g_object_unref (p->is_settings);
p->is_settings = NULL;
}
+#ifdef HAVE_IBUS
+ if (p->interface_settings != NULL) {
+ g_object_unref (p->interface_settings);
+ p->interface_settings = NULL;
+ }
+#endif
if (p->device_manager != NULL) {
g_signal_handler_disconnect (p->device_manager, p->device_added_id);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]