From d1fbfb9c4ed5ebf456f8bbcf16b6ba3a5e2e796a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 4 Mar 2021 14:46:46 -0500 Subject: [PATCH] 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;