mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-18 09:00:34 +00:00
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.
This commit is contained in:
parent
b32a9eb691
commit
0b59fbfb9d
@ -264,6 +264,8 @@ additional environment variables.
|
|||||||
that enables <literal>XSETTINGS</literal> and has a value in
|
that enables <literal>XSETTINGS</literal> and has a value in
|
||||||
<literal>Gtk/IMModule</literal>, that will be used for the default
|
<literal>Gtk/IMModule</literal>, that will be used for the default
|
||||||
IM module.
|
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>
|
</para>
|
||||||
</formalpara>
|
</formalpara>
|
||||||
|
|
||||||
|
@ -650,6 +650,26 @@ match_locale (const gchar *locale,
|
|||||||
return 0;
|
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:
|
* _gtk_im_module_get_default_context_id:
|
||||||
* @client_window: a window
|
* @client_window: a window
|
||||||
@ -666,7 +686,7 @@ _gtk_im_module_get_default_context_id (GdkWindow *client_window)
|
|||||||
const gchar *context_id = NULL;
|
const gchar *context_id = NULL;
|
||||||
gint best_goodness = 0;
|
gint best_goodness = 0;
|
||||||
gint i;
|
gint i;
|
||||||
gchar *tmp_locale, *tmp;
|
gchar *tmp_locale, *tmp, **immodules;
|
||||||
const gchar *envvar;
|
const gchar *envvar;
|
||||||
GdkScreen *screen;
|
GdkScreen *screen;
|
||||||
GtkSettings *settings;
|
GtkSettings *settings;
|
||||||
@ -674,11 +694,16 @@ _gtk_im_module_get_default_context_id (GdkWindow *client_window)
|
|||||||
if (!contexts_hash)
|
if (!contexts_hash)
|
||||||
gtk_im_module_initialize ();
|
gtk_im_module_initialize ();
|
||||||
|
|
||||||
envvar = g_getenv ("GTK_IM_MODULE");
|
envvar = g_getenv("GTK_IM_MODULE");
|
||||||
if (envvar &&
|
if (envvar)
|
||||||
(strcmp (envvar, SIMPLE_ID) == 0 ||
|
{
|
||||||
g_hash_table_lookup (contexts_hash, envvar)))
|
immodules = g_strsplit(envvar, ":", 0);
|
||||||
return envvar;
|
context_id = lookup_immodule(immodules);
|
||||||
|
g_strfreev(immodules);
|
||||||
|
|
||||||
|
if (context_id)
|
||||||
|
return context_id;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the certain immodule is set in XSETTINGS.
|
/* 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);
|
g_object_get (G_OBJECT (settings), "gtk-im-module", &tmp, NULL);
|
||||||
if (tmp)
|
if (tmp)
|
||||||
{
|
{
|
||||||
if (strcmp (tmp, SIMPLE_ID) == 0)
|
immodules = g_strsplit(tmp, ":", 0);
|
||||||
context_id = SIMPLE_ID;
|
context_id = lookup_immodule(immodules);
|
||||||
else
|
g_strfreev(immodules);
|
||||||
{
|
|
||||||
GtkIMModule *module;
|
|
||||||
module = g_hash_table_lookup (contexts_hash, tmp);
|
|
||||||
if (module)
|
|
||||||
context_id = module->contexts[0]->context_id;
|
|
||||||
}
|
|
||||||
g_free (tmp);
|
g_free (tmp);
|
||||||
|
|
||||||
if (context_id)
|
if (context_id)
|
||||||
|
@ -850,6 +850,8 @@ gtk_settings_class_init (GtkSettingsClass *class)
|
|||||||
* Which IM (input method) module should be used by default. This is the
|
* 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
|
* input method that will be used if the user has not explicitly chosen
|
||||||
* another input method from the IM context menu.
|
* 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.
|
* See #GtkIMContext and see the #GtkSettings:gtk-show-input-method-menu property.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user