From 0b59fbfb9d677b77b392c0c6d327ddecd7978d89 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 5 Jun 2012 17:03:42 -0400 Subject: [PATCH] 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 XSETTINGS and has a value in Gtk/IMModule, 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. 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. */ -- 1.7.10.2