[gtk/preedit-selection-fix: 8/8] textview: Delete selection when preedit starts




commit d28df0b87e1422a0491970c1b0f9c9bcc5e7689c
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Mar 4 14:55:40 2021 -0500

    textview: Delete selection when preedit starts
    
    This prevents confusing misrendering when the preedit text
    pushes the selection text out of the rendered selection.
    
    Fixes: #1123

 gtk/gtktextview.c | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
---
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index c3289a0ce8..5b8bca680a 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -504,8 +504,10 @@ static void     gtk_text_view_commit_handler               (GtkIMContext  *conte
                                                            GtkTextView   *text_view);
 static void     gtk_text_view_commit_text                  (GtkTextView   *text_view,
                                                             const char    *text);
+static void     gtk_text_view_preedit_start_handler        (GtkIMContext  *context,
+                                                            GtkTextView   *text_view);
 static void     gtk_text_view_preedit_changed_handler      (GtkIMContext  *context,
-                                                           GtkTextView   *text_view);
+                                                            GtkTextView   *text_view);
 static gboolean gtk_text_view_retrieve_surrounding_handler (GtkIMContext  *context,
                                                            GtkTextView   *text_view);
 static gboolean gtk_text_view_delete_surrounding_handler   (GtkIMContext  *context,
@@ -1883,6 +1885,8 @@ gtk_text_view_init (GtkTextView *text_view)
 
   g_signal_connect (priv->im_context, "commit",
                     G_CALLBACK (gtk_text_view_commit_handler), text_view);
+  g_signal_connect (priv->im_context, "preedit-start",
+                    G_CALLBACK (gtk_text_view_preedit_start_handler), text_view);
   g_signal_connect (priv->im_context, "preedit-changed",
                    G_CALLBACK (gtk_text_view_preedit_changed_handler), text_view);
   g_signal_connect (priv->im_context, "retrieve-surrounding",
@@ -8212,6 +8216,13 @@ gtk_text_view_commit_text (GtkTextView   *text_view,
                                       gtk_text_buffer_get_insert (get_buffer (text_view)));
 }
 
+static void
+gtk_text_view_preedit_start_handler (GtkIMContext *context,
+                                     GtkTextView  *self)
+{
+  gtk_text_buffer_delete_selection (self->priv->buffer, TRUE, self->priv->editable);
+}
+
 static void
 gtk_text_view_preedit_changed_handler (GtkIMContext *context,
                                       GtkTextView  *text_view)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]