diff options
author | Matthias Clasen <matthiasc@src.gnome.org> | 2009-01-13 19:15:42 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2009-01-13 19:15:42 +0000 |
commit | 5d4bb27b74415d90f2eb08209d1f39f1220d1990 (patch) | |
tree | 982a565930c2a148146f017a723e9e229f0b5057 /gtk/gtkimmulticontext.c | |
parent | 856279da34c7a1773bde71c723306b5beaaf6d14 (diff) | |
download | gtk+-5d4bb27b74415d90f2eb08209d1f39f1220d1990.tar.gz |
Bug 450716 – New API to change global IM
Requested by Daniel Elstner.
* gtk/gtk.symbols:
* gtk/gtkimmulticontext.[hc] (gtk_im_multicontext_set_context_id):
New function to set the context id on a GtkIMMulticontext.
* gtk/gtkentry.c:
* gtk/gtktextview.c: Add a ::im-module property that can be
set to override the global setting for the im module to be used.
svn path=/trunk/; revision=22113
Diffstat (limited to 'gtk/gtkimmulticontext.c')
-rw-r--r-- | gtk/gtkimmulticontext.c | 60 |
1 files changed, 41 insertions, 19 deletions
diff --git a/gtk/gtkimmulticontext.c b/gtk/gtkimmulticontext.c index 5462575705..f48fc84665 100644 --- a/gtk/gtkimmulticontext.c +++ b/gtk/gtkimmulticontext.c @@ -34,6 +34,7 @@ struct _GtkIMMulticontextPrivate { GdkWindow *client_window; GdkRectangle cursor_location; + gchar *context_id; guint use_preedit : 1; guint have_cursor_location : 1; @@ -85,7 +86,6 @@ static gboolean gtk_im_multicontext_delete_surrounding_cb (GtkIMContext * gint n_chars, GtkIMMulticontext *multicontext); -static const gchar *user_context_id = NULL; static const gchar *global_context_id = NULL; G_DEFINE_TYPE (GtkIMMulticontext, gtk_im_multicontext, GTK_TYPE_IM_CONTEXT) @@ -143,6 +143,7 @@ gtk_im_multicontext_finalize (GObject *object) gtk_im_multicontext_set_slave (multicontext, NULL, TRUE); g_free (multicontext->context_id); + g_free (multicontext->priv->context_id); G_OBJECT_CLASS (gtk_im_multicontext_parent_class)->finalize (object); } @@ -226,19 +227,19 @@ gtk_im_multicontext_get_slave (GtkIMMulticontext *multicontext) { GtkIMContext *slave; - if (!global_context_id) + g_free (multicontext->context_id); + + if (multicontext->priv->context_id) + multicontext->context_id = g_strdup (multicontext->priv->context_id); + else { - if (user_context_id) - global_context_id = user_context_id; - else + if (!global_context_id) global_context_id = _gtk_im_module_get_default_context_id (multicontext->priv->client_window); + multicontext->context_id = g_strdup (global_context_id); } - slave = _gtk_im_module_create (global_context_id); + slave = _gtk_im_module_create (multicontext->context_id); gtk_im_multicontext_set_slave (multicontext, slave, FALSE); g_object_unref (slave); - - g_free (multicontext->context_id); - multicontext->context_id = g_strdup (global_context_id); } return multicontext->slave; @@ -335,8 +336,11 @@ gtk_im_multicontext_focus_in (GtkIMContext *context) * for the new global context type. */ if (multicontext->context_id == NULL || - global_context_id == NULL || - strcmp (global_context_id, multicontext->context_id) != 0) + (multicontext->priv->context_id != NULL && + strcmp (multicontext->priv->context_id, multicontext->context_id) != 0) || + (multicontext->priv->context_id == NULL && + (global_context_id == NULL || + strcmp (global_context_id, multicontext->context_id) != 0))) gtk_im_multicontext_set_slave (multicontext, NULL, FALSE); slave = gtk_im_multicontext_get_slave (multicontext); @@ -494,11 +498,7 @@ activate_cb (GtkWidget *menuitem, { const gchar *id = g_object_get_data (G_OBJECT (menuitem), "gtk-context-id"); - gtk_im_context_reset (GTK_IM_CONTEXT (context)); - - user_context_id = id; - global_context_id = NULL; - gtk_im_multicontext_set_slave (context, NULL, FALSE); + gtk_im_multicontext_set_context_id (context, id); } } @@ -543,7 +543,7 @@ gtk_im_multicontext_append_menuitems (GtkIMMulticontext *context, system_context_id = _gtk_im_module_get_default_context_id (context->priv->client_window); system_menuitem = menuitem = gtk_radio_menu_item_new_with_label (group, C_("input method menu", "System")); - if (!user_context_id) + if (!context->priv->context_id) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE); group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem)); g_object_set_data (G_OBJECT (menuitem), I_("gtk-context-id"), NULL); @@ -616,8 +616,8 @@ gtk_im_multicontext_append_menuitems (GtkIMMulticontext *context, menuitem = gtk_radio_menu_item_new_with_label (group, translated_name); - if ((user_context_id && - strcmp (contexts[i]->context_id, user_context_id) == 0)) + if ((context->priv->context_id && + strcmp (contexts[i]->context_id, context->priv->context_id) == 0)) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE); if (strcmp (contexts[i]->context_id, system_context_id) == 0) @@ -661,6 +661,28 @@ gtk_im_multicontext_get_context_id (GtkIMMulticontext *context) return context->context_id; } +/** + * gtk_im_multicontext_set_context_id: + * @context: a #GtkIMMulticontext + * @context_id: the id to use + * + * Sets the context id for @context. + * + * This causes the currently active slave of @context to be + * replaced by the slave corresponding to the new context id. + * + * Since: 2.16 + */ +void +gtk_im_multicontext_set_context_id (GtkIMMulticontext *context, + const char *context_id) +{ + gtk_im_context_reset (GTK_IM_CONTEXT (context)); + g_free (context->priv->context_id); + context->priv->context_id = g_strdup (context_id); + gtk_im_multicontext_set_slave (context, NULL, FALSE); +} + #define __GTK_IM_MULTICONTEXT_C__ #include "gtkaliasdef.c" |