]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkimmulticontext.c
Fix some cases where signal connection IDs where being assigned to guint
[~andy/gtk] / gtk / gtkimmulticontext.c
index ea51bab2d1ccb9b55b37dd4bf227f1560f3599db..92279de980cf1cc288e9c9598084e2060e37fb48 100644 (file)
@@ -30,7 +30,8 @@ static void     gtk_im_multicontext_init               (GtkIMMulticontext
 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);
@@ -146,31 +147,41 @@ gtk_im_multicontext_new (void)
 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;
@@ -201,6 +212,9 @@ gtk_im_multicontext_set_slave (GtkIMMulticontext *multicontext,
       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 *
@@ -208,6 +222,8 @@ gtk_im_multicontext_get_slave (GtkIMMulticontext *multicontext)
 {
   if (!multicontext->slave)
     {
+      GtkIMContext *slave;
+
       if (!global_context_id)
        {
          const char *locale;
@@ -220,7 +236,10 @@ gtk_im_multicontext_get_slave (GtkIMMulticontext *multicontext)
          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;
     }
 
@@ -285,7 +304,7 @@ gtk_im_multicontext_focus_in (GtkIMContext   *context)
    */
   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);
 
@@ -344,7 +363,7 @@ gtk_im_multicontext_get_surrounding (GtkIMContext  *context,
   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)
@@ -434,7 +453,7 @@ activate_cb (GtkWidget         *menuitem,
       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);
     }
 }
 
@@ -480,5 +499,7 @@ gtk_im_multicontext_append_menuitems (GtkIMMulticontext *context,
       gtk_widget_show (menuitem);
       gtk_menu_shell_append (menushell, menuitem);
     }
+
+  g_free (contexts);
 }