[gnome-builder] sourceview: simply character overwrite



commit 6873ee5d6a7a783dbceff997a4e3802871891442
Author: Christian Hergert <chergert redhat com>
Date:   Thu Nov 17 02:58:01 2016 -0800

    sourceview: simply character overwrite
    
    This can be simplified a bunch and fix our issue where ) is not matching.

 libide/sourceview/ide-source-view.c |   62 +++++++++++++++-------------------
 1 files changed, 27 insertions(+), 35 deletions(-)
---
diff --git a/libide/sourceview/ide-source-view.c b/libide/sourceview/ide-source-view.c
index b9d312e..2d905aa 100644
--- a/libide/sourceview/ide-source-view.c
+++ b/libide/sourceview/ide-source-view.c
@@ -1721,9 +1721,10 @@ ide_source_view_maybe_overwrite (IdeSourceView *self,
 {
   IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
   GtkTextBuffer *buffer;
+  GtkTextIter insert;
+  GtkTextIter next;
   gunichar ch;
-  gunichar prev_ch;
-  gboolean ignore = FALSE;
+  gunichar next_ch;
 
   g_assert (IDE_IS_SOURCE_VIEW (self));
   g_assert (iter != NULL);
@@ -1756,47 +1757,38 @@ ide_source_view_maybe_overwrite (IdeSourceView *self,
   if (len != 1)
     return;
 
-  ch = gtk_text_iter_get_char (iter);
-  prev_ch = g_utf8_get_char (text);
-
-  switch (prev_ch)
-    {
-    case '(':
-      ignore = (ch == ')');
-      break;
-
-    case '[':
-      ignore = (ch == ']');
-      break;
-
-    case '{':
-      ignore = (ch == '}');
-      break;
-
-    case '"':
-      ignore = (ch == '"') && (prev_ch != '\\');
-      break;
+  /*
+   * Short circuit if there is already a selection.
+   */
+  buffer = gtk_text_iter_get_buffer (iter);
+  if (gtk_text_buffer_get_has_selection (buffer))
+      return;
 
-    case '\'':
-      ignore = (ch == '\'');
-      break;
+  /*
+   * @iter is pointing at the location we just inserted text. Since we
+   * know we only inserted one character, lets move past it and compare
+   * to see if we want to overwrite.
+   */
+  gtk_text_buffer_get_iter_at_mark (buffer, &insert, gtk_text_buffer_get_insert (buffer));
+  ch = g_utf8_get_char (text);
+  next_ch = gtk_text_iter_get_char (&insert);
 
+  switch (ch)
+    {
+    case ')': case ']': case '}': case '"': case '\'':
+      if (ch == next_ch)
+        break;
+      /* fall through */
     default:
       return;
     }
 
-  if (!ignore)
-    return;
-
-  buffer = gtk_text_iter_get_buffer (iter);
+  next = insert;
 
-  if (!gtk_text_buffer_get_has_selection (buffer))
+  if (gtk_text_iter_forward_char (&next))
     {
-      GtkTextIter next = *iter;
-
-      if (!gtk_text_iter_forward_char (&next))
-        gtk_text_buffer_get_end_iter (buffer, &next);
-      gtk_text_buffer_delete (buffer, iter, &next);
+      gtk_text_buffer_delete (buffer, &insert, &next);
+      *iter = insert;
     }
 }
 


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