gtktext: Shuffle the places doing IM reset
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 17 Aug 2022 22:55:30 +0000 (00:55 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Wed, 17 Aug 2022 22:55:30 +0000 (00:55 +0200)
During text widget manipulation (inserting or deleting text via keyboard)
the IM context is reset somewhat early, before the actual change took place.
This makes IM lag behind in terms of surrounding text and cursor position.

Shuffle these IM reset calls so that they happen after the changes, and
ensure that the IM is actually reset, since that is currently toggled on
a pretty narrow set of circumstances.

gtk/gtktext.c

index 3a390fcc11ba3149a78cef2498ab38be22093f69..70b100fa55499862f08853daa1d5ef08cad77757 100644 (file)
@@ -1910,7 +1910,7 @@ gtk_text_init (GtkText *self)
   g_signal_connect (priv->key_controller, "key-pressed",
                     G_CALLBACK (gtk_text_key_controller_key_pressed), self);
   g_signal_connect_swapped (priv->key_controller, "im-update",
-                            G_CALLBACK (gtk_text_schedule_im_reset), self);
+                            G_CALLBACK (gtk_im_context_reset), priv->im_context);
   gtk_event_controller_key_set_im_context (GTK_EVENT_CONTROLLER_KEY (priv->key_controller),
                                            priv->im_context);
   gtk_widget_add_controller (GTK_WIDGET (self), priv->key_controller);
@@ -3773,8 +3773,6 @@ gtk_text_move_cursor (GtkText         *self,
   GtkTextPrivate *priv = gtk_text_get_instance_private (self);
   int new_pos = priv->current_pos;
 
-  gtk_text_reset_im_context (self);
-
   if (priv->current_pos != priv->selection_bound && !extend_selection)
     {
       /* If we have a current selection and aren't extending it, move to the
@@ -3901,6 +3899,9 @@ gtk_text_move_cursor (GtkText         *self,
     gtk_text_set_selection_bounds (self, new_pos, new_pos);
 
   gtk_text_pend_cursor_blink (self);
+
+  priv->need_im_reset = TRUE;
+  gtk_text_reset_im_context (self);
 }
 
 static void
@@ -3928,8 +3929,6 @@ gtk_text_delete_from_cursor (GtkText       *self,
   int end_pos = priv->current_pos;
   int old_n_bytes = gtk_entry_buffer_get_bytes (get_buffer (self));
 
-  gtk_text_reset_im_context (self);
-
   if (!priv->editable)
     {
       gtk_widget_error_bell (GTK_WIDGET (self));
@@ -3939,6 +3938,8 @@ gtk_text_delete_from_cursor (GtkText       *self,
   if (priv->selection_bound != priv->current_pos)
     {
       gtk_text_delete_selection (self);
+      gtk_text_schedule_im_reset (self);
+      gtk_text_reset_im_context (self);
       return;
     }
 
@@ -4003,6 +4004,11 @@ gtk_text_delete_from_cursor (GtkText       *self,
 
   if (gtk_entry_buffer_get_bytes (get_buffer (self)) == old_n_bytes)
     gtk_widget_error_bell (GTK_WIDGET (self));
+  else
+    {
+      gtk_text_schedule_im_reset (self);
+      gtk_text_reset_im_context (self);
+    }
 
   gtk_text_pend_cursor_blink (self);
 }
@@ -4013,8 +4019,6 @@ gtk_text_backspace (GtkText *self)
   GtkTextPrivate *priv = gtk_text_get_instance_private (self);
   int prev_pos;
 
-  gtk_text_reset_im_context (self);
-
   if (!priv->editable)
     {
       gtk_widget_error_bell (GTK_WIDGET (self));
@@ -4024,6 +4028,8 @@ gtk_text_backspace (GtkText *self)
   if (priv->selection_bound != priv->current_pos)
     {
       gtk_text_delete_selection (self);
+      gtk_text_schedule_im_reset (self);
+      gtk_text_reset_im_context (self);
       return;
     }
 
@@ -4068,6 +4074,9 @@ gtk_text_backspace (GtkText *self)
         {
           gtk_editable_delete_text (GTK_EDITABLE (self), prev_pos, priv->current_pos);
         }
+
+      gtk_text_schedule_im_reset (self);
+      gtk_text_reset_im_context (self);
     }
   else
     {