static void gtk_im_multicontext_finalize (GObject *object);
static void gtk_im_multicontext_set_slave (GtkIMMulticontext *multicontext,
- GtkIMContext *slave);
+ GtkIMContext *slave,
+ gboolean finalizing);
static void gtk_im_multicontext_set_client_window (GtkIMContext *context,
GdkWindow *window);
static void
gtk_im_multicontext_finalize (GObject *object)
{
- gtk_im_multicontext_set_slave (GTK_IM_MULTICONTEXT (object), NULL);
+ gtk_im_multicontext_set_slave (GTK_IM_MULTICONTEXT (object), NULL, TRUE);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
gtk_im_multicontext_set_slave (GtkIMMulticontext *multicontext,
- GtkIMContext *slave)
+ GtkIMContext *slave,
+ gboolean finalizing)
{
+ gboolean need_preedit_changed = FALSE;
+
if (multicontext->slave)
{
+ if (!finalizing)
+ gtk_im_context_reset (multicontext->slave);
+
g_signal_handlers_disconnect_by_func (multicontext->slave,
- gtk_im_multicontext_preedit_start_cb,
+ (gpointer) gtk_im_multicontext_preedit_start_cb,
multicontext);
g_signal_handlers_disconnect_by_func (multicontext->slave,
- gtk_im_multicontext_preedit_end_cb,
+ (gpointer) gtk_im_multicontext_preedit_end_cb,
multicontext);
g_signal_handlers_disconnect_by_func (multicontext->slave,
- gtk_im_multicontext_preedit_changed_cb,
+ (gpointer) gtk_im_multicontext_preedit_changed_cb,
multicontext);
g_signal_handlers_disconnect_by_func (multicontext->slave,
- gtk_im_multicontext_commit_cb,
+ (gpointer) gtk_im_multicontext_commit_cb,
multicontext);
-
+
g_object_unref (multicontext->slave);
+ multicontext->slave = NULL;
+
+ if (!finalizing)
+ need_preedit_changed = TRUE;
}
multicontext->slave = slave;
if (multicontext->client_window)
gtk_im_context_set_client_window (slave, multicontext->client_window);
}
+
+ if (need_preedit_changed)
+ g_signal_emit_by_name (multicontext, "preedit_changed");
}
static GtkIMContext *
{
if (!multicontext->slave)
{
+ GtkIMContext *slave;
+
if (!global_context_id)
{
const char *locale;
global_context_id = _gtk_im_module_get_default_context_id (locale);
}
- gtk_im_multicontext_set_slave (multicontext, _gtk_im_module_create (global_context_id));
+ slave = _gtk_im_module_create (global_context_id);
+ gtk_im_multicontext_set_slave (multicontext, slave, FALSE);
+ g_object_unref (slave);
+
multicontext->context_id = global_context_id;
}
*/
if (!multicontext->context_id ||
strcmp (global_context_id, multicontext->context_id) != 0)
- gtk_im_multicontext_set_slave (multicontext, NULL);
+ gtk_im_multicontext_set_slave (multicontext, NULL, FALSE);
slave = gtk_im_multicontext_get_slave (multicontext);
GtkIMContext *slave = gtk_im_multicontext_get_slave (multicontext);
if (slave)
- return gtk_im_context_get_surrounding (context, text, cursor_index);
+ return gtk_im_context_get_surrounding (slave, text, cursor_index);
else
{
if (text)
gtk_im_context_reset (GTK_IM_CONTEXT (context));
global_context_id = id;
- gtk_im_multicontext_set_slave (context, NULL);
+ gtk_im_multicontext_set_slave (context, NULL, FALSE);
}
}
gtk_widget_show (menuitem);
gtk_menu_shell_append (menushell, menuitem);
}
+
+ g_free (contexts);
}