[gnome-settings-daemon] keyboard: Add back the gtk+ IM module handling



commit 390ba583a1d530b4527bab7a7d133ea631fc8df6
Author: Rui Matos <tiagomatos gmail com>
Date:   Fri Sep 26 15:56:29 2014 +0200

    keyboard: Add back the gtk+ IM module handling
    
    This shouldn't have been removed in commit
    326ee9f9a102a58941473e08fbe6221e70369f7f.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=737434

 plugins/keyboard/gsd-keyboard-manager.c |   60 +++++++++++++++++++++++++++++++
 1 files changed, 60 insertions(+), 0 deletions(-)
---
diff --git a/plugins/keyboard/gsd-keyboard-manager.c b/plugins/keyboard/gsd-keyboard-manager.c
index f913dc4..58972e0 100644
--- a/plugins/keyboard/gsd-keyboard-manager.c
+++ b/plugins/keyboard/gsd-keyboard-manager.c
@@ -64,12 +64,19 @@
 #define KEY_BELL_MODE      "bell-mode"
 #define KEY_BELL_CUSTOM_FILE "bell-custom-file"
 
+#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"
+
 #define GNOME_DESKTOP_INPUT_SOURCES_DIR "org.gnome.desktop.input-sources"
 
 #define KEY_INPUT_SOURCES        "sources"
 #define KEY_KEYBOARD_OPTIONS     "xkb-options"
 
 #define INPUT_SOURCE_TYPE_XKB  "xkb"
+#define INPUT_SOURCE_TYPE_IBUS "ibus"
 
 #define DEFAULT_LAYOUT "us"
 
@@ -445,6 +452,57 @@ set_devicepresence_handler (GsdKeyboardManager *manager)
         manager->priv->device_manager = device_manager;
 }
 
+static gboolean
+need_ibus (GVariant *sources)
+{
+        GVariantIter iter;
+        const gchar *type;
+
+        g_variant_iter_init (&iter, sources);
+        while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL))
+                if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS))
+                        return TRUE;
+
+        return FALSE;
+}
+
+static void
+set_gtk_im_module (GSettings *settings,
+                   GVariant  *sources)
+{
+        const gchar *new_module;
+        gchar *current_module;
+
+        if (need_ibus (sources))
+                new_module = GTK_IM_MODULE_IBUS;
+        else
+                new_module = GTK_IM_MODULE_SIMPLE;
+
+        current_module = g_settings_get_string (settings, KEY_GTK_IM_MODULE);
+        if (!g_str_equal (current_module, new_module))
+                g_settings_set_string (settings, KEY_GTK_IM_MODULE, new_module);
+        g_free (current_module);
+}
+
+static void
+input_sources_changed (GSettings          *settings,
+                       const char         *key,
+                       GsdKeyboardManager *manager)
+{
+        GSettings *interface_settings;
+        GVariant *sources;
+        /* Gtk+ uses the IM module advertised in XSETTINGS so, if we
+         * have IBus input sources, we want it to load that
+         * module. Otherwise we can use the default "simple" module
+         * which is builtin gtk+
+         */
+        sources = g_settings_get_value (settings, KEY_INPUT_SOURCES);
+        interface_settings = g_settings_new (GNOME_DESKTOP_INTERFACE_DIR);
+        set_gtk_im_module (interface_settings, sources);
+        g_object_unref (interface_settings);
+        g_variant_unref (sources);
+}
+
 static void
 get_sources_from_xkb_config (GsdKeyboardManager *manager)
 {
@@ -712,6 +770,8 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
        set_devicepresence_handler (manager);
 
         manager->priv->input_sources_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR);
+        g_signal_connect (manager->priv->input_sources_settings, "changed::"KEY_INPUT_SOURCES,
+                          G_CALLBACK (input_sources_changed), manager);
 
         manager->priv->cancellable = g_cancellable_new ();
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]