[gtk/preedit-selection-fix: 7/8] textview: Send anchor with surrounding




commit d1fbfb9c4ed5ebf456f8bbcf16b6ba3a5e2e796a
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Mar 4 14:46:46 2021 -0500

    textview: Send anchor with surrounding
    
    We have the api to do it now.

 gtk/gtktextview.c | 49 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 42 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index bece4d5839..c3289a0ce8 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -8259,19 +8259,54 @@ gtk_text_view_retrieve_surrounding_handler (GtkIMContext  *context,
 {
   GtkTextIter start;
   GtkTextIter end;
-  int pos;
+  GtkTextIter start1;
+  GtkTextIter end1;
+  int cursor_pos;
+  int anchor_pos;
   char *text;
+  char *pre;
+  char *sel;
+  char *post;
+  gboolean flip;
 
   gtk_text_buffer_get_iter_at_mark (text_view->priv->buffer, &start,
-                                   gtk_text_buffer_get_insert (text_view->priv->buffer));
-  end = start;
+                                    gtk_text_buffer_get_insert (text_view->priv->buffer));
+  gtk_text_buffer_get_iter_at_mark (text_view->priv->buffer, &end,
+                                    gtk_text_buffer_get_selection_bound (text_view->priv->buffer));
+
+  flip = gtk_text_iter_compare (&start, &end) < 0;
+
+  gtk_text_iter_order (&start, &end);
+
+  start1 = start;
+  end1 = end;
 
-  pos = gtk_text_iter_get_line_index (&start);
   gtk_text_iter_set_line_offset (&start, 0);
-  gtk_text_iter_forward_to_line_end (&end);
+  gtk_text_iter_forward_to_line_end (&end1);
+
+  pre = gtk_text_iter_get_slice (&start1, &start);
+  sel = gtk_text_iter_get_slice (&start, &end);
+  post = gtk_text_iter_get_slice (&end, &end1);
+
+  if (flip)
+    {
+      anchor_pos = strlen (pre);
+      cursor_pos = anchor_pos + strlen (sel);
+    }
+  else
+    {
+      cursor_pos = strlen (pre);
+      anchor_pos = cursor_pos + strlen (sel);
+    }
+
+  text = g_strconcat (pre, sel, post, NULL);
+
+  g_free (pre);
+  g_free (sel);
+  g_free (post);
+
+  gtk_im_context_set_surrounding_with_selection (context, text, -1, cursor_pos, anchor_pos);
 
-  text = gtk_text_iter_get_slice (&start, &end);
-  gtk_im_context_set_surrounding (context, text, -1, pos);
   g_free (text);
 
   return TRUE;


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