[gnome-builder] sourceview: simply character overwrite
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] sourceview: simply character overwrite
- Date: Thu, 17 Nov 2016 10:58:11 +0000 (UTC)
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]