[gtk+/gtk-2-24] Allow fallback for input method modules



commit 0b59fbfb9d677b77b392c0c6d327ddecd7978d89
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Jun 5 17:03:42 2012 -0400

    Allow fallback for input method modules
    
    Accept a :-separated list of module names in GTK_IM_MODULE and
    the corresponding setting, to deal a bit better with broken
    situations.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=603559
    
    Patch by Akira Tagoh, backported from GTK+ 3. The backport
    is required because GTK+ 2 and 3 are listening to the same env
    vars and settings for immodules.

 docs/reference/gtk/running.sgml |    2 +
 gtk/gtkimmodule.c               |   49 +++++++++++++++++++++++++++------------
 gtk/gtksettings.c               |    2 +
 3 files changed, 38 insertions(+), 15 deletions(-)
---
diff --git a/docs/reference/gtk/running.sgml b/docs/reference/gtk/running.sgml
index 8371832..11fa0d1 100644
--- a/docs/reference/gtk/running.sgml
+++ b/docs/reference/gtk/running.sgml
@@ -264,6 +264,8 @@ additional environment variables.
     that enables <literal>XSETTINGS</literal> and has a value in
     <literal>Gtk/IMModule</literal>, that will be used for the default
     IM module.
+    This also can be a colon-separated list of input-methods, which
+    GTK+ will try in turn until it finds one available on the system.
   </para>
 </formalpara>
 
diff --git a/gtk/gtkimmodule.c b/gtk/gtkimmodule.c
index f1da875..f7baa03 100644
--- a/gtk/gtkimmodule.c
+++ b/gtk/gtkimmodule.c
@@ -650,6 +650,26 @@ match_locale (const gchar *locale,
   return 0;
 }
 
+static const gchar *
+lookup_immodule (gchar **immodules_list)
+{
+  while (immodules_list && *immodules_list)
+    {
+      if (g_strcmp0 (*immodules_list, SIMPLE_ID) == 0)
+        return SIMPLE_ID;
+      else
+       {
+         GtkIMModule *module;
+         module = g_hash_table_lookup (contexts_hash, *immodules_list);
+         if (module)
+           return module->contexts[0]->context_id;
+       }
+      immodules_list++;
+    }
+
+  return NULL;
+}
+
 /**
  * _gtk_im_module_get_default_context_id:
  * @client_window: a window
@@ -666,7 +686,7 @@ _gtk_im_module_get_default_context_id (GdkWindow *client_window)
   const gchar *context_id = NULL;
   gint best_goodness = 0;
   gint i;
-  gchar *tmp_locale, *tmp;
+  gchar *tmp_locale, *tmp, **immodules;
   const gchar *envvar;
   GdkScreen *screen;
   GtkSettings *settings;
@@ -674,11 +694,16 @@ _gtk_im_module_get_default_context_id (GdkWindow *client_window)
   if (!contexts_hash)
     gtk_im_module_initialize ();
 
-  envvar = g_getenv ("GTK_IM_MODULE");
-  if (envvar &&
-      (strcmp (envvar, SIMPLE_ID) == 0 ||
-       g_hash_table_lookup (contexts_hash, envvar))) 
-    return envvar;
+  envvar = g_getenv("GTK_IM_MODULE");
+  if (envvar)
+    {
+        immodules = g_strsplit(envvar, ":", 0);
+        context_id = lookup_immodule(immodules);
+        g_strfreev(immodules);
+
+        if (context_id)
+          return context_id;
+    }
 
   /* Check if the certain immodule is set in XSETTINGS.
    */
@@ -689,15 +714,9 @@ _gtk_im_module_get_default_context_id (GdkWindow *client_window)
       g_object_get (G_OBJECT (settings), "gtk-im-module", &tmp, NULL);
       if (tmp)
         {
-          if (strcmp (tmp, SIMPLE_ID) == 0)
-            context_id = SIMPLE_ID;
-          else
-            {
-              GtkIMModule *module;
-              module = g_hash_table_lookup (contexts_hash, tmp);
-              if (module)
-                context_id = module->contexts[0]->context_id;
-            }
+          immodules = g_strsplit(tmp, ":", 0);
+          context_id = lookup_immodule(immodules);
+          g_strfreev(immodules);
           g_free (tmp);
 
        	  if (context_id)
diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c
index f83a54b..c5f77fe 100644
--- a/gtk/gtksettings.c
+++ b/gtk/gtksettings.c
@@ -850,6 +850,8 @@ gtk_settings_class_init (GtkSettingsClass *class)
    * Which IM (input method) module should be used by default. This is the 
    * input method that will be used if the user has not explicitly chosen 
    * another input method from the IM context menu.  
+   * This also can be a colon-separated list of input methods, which GTK+
+   * will try in turn until it finds one available on the system.
    *
    * See #GtkIMContext and see the #GtkSettings:gtk-show-input-method-menu property.
    */



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