summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Borelli <pborelli@katamail.com>2006-04-05 18:30:46 +0000
committerPaolo Borelli <pborelli@src.gnome.org>2006-04-05 18:30:46 +0000
commitf58c7f1ae8755e4da073f5fafa83dd5e45849024 (patch)
treea08d4ee479ee998ae0035c946cf511562ffe6073
parent3797d5a34e6a443cc12cc4b6b1f513e4d3794556 (diff)
downloadgtk+-f58c7f1ae8755e4da073f5fafa83dd5e45849024.tar.gz
handle the case of \r and \n split across lines. Bug #337022. add unit
2006-04-05 Paolo Borelli <pborelli@katamail.com> * gtk/gtktextiter.c (gtk_text_iter_ends_line): handle the case of \r and \n split across lines. Bug #337022. * tests/testtextbuffer.c: add unit test.
-rw-r--r--ChangeLog6
-rw-r--r--ChangeLog.pre-2-106
-rw-r--r--gtk/gtktextiter.c17
-rw-r--r--tests/testtextbuffer.c30
4 files changed, 57 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 45862ac2a4..651a9defeb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-04-05 Paolo Borelli <pborelli@katamail.com>
+
+ * gtk/gtktextiter.c (gtk_text_iter_ends_line): handle the case of \r
+ and \n split across lines. Bug #337022.
+ * tests/testtextbuffer.c: add unit test.
+
Tue Apr 4 12:25:36 2006 Søren Sandmann <sandmann@redhat.com>
* gdk/x11/gdkimage-x11.c (gdk_image_class_init): Add "_private" to
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 45862ac2a4..651a9defeb 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,9 @@
+2006-04-05 Paolo Borelli <pborelli@katamail.com>
+
+ * gtk/gtktextiter.c (gtk_text_iter_ends_line): handle the case of \r
+ and \n split across lines. Bug #337022.
+ * tests/testtextbuffer.c: add unit test.
+
Tue Apr 4 12:25:36 2006 Søren Sandmann <sandmann@redhat.com>
* gdk/x11/gdkimage-x11.c (gdk_image_class_init): Add "_private" to
diff --git a/gtk/gtktextiter.c b/gtk/gtktextiter.c
index f233e6a288..4ba37f9cf5 100644
--- a/gtk/gtktextiter.c
+++ b/gtk/gtktextiter.c
@@ -1564,10 +1564,23 @@ gtk_text_iter_ends_line (const GtkTextIter *iter)
return TRUE;
else if (wc == '\n')
{
+ GtkTextIter tmp = *iter;
+
/* need to determine if a \r precedes the \n, in which case
- * we aren't the end of the line
+ * we aren't the end of the line.
+ * Note however that if \r and \n are on different lines, they
+ * both are terminators. This for instance may happen after
+ * deleting some text:
+
+ 1 some text\r delete 'a' 1 some text\r
+ 2 a\n ---------> 2 \n
+ 3 ... 3 ...
+
*/
- GtkTextIter tmp = *iter;
+
+ if (gtk_text_iter_get_line_offset (&tmp) == 0)
+ return TRUE;
+
if (!gtk_text_iter_backward_char (&tmp))
return TRUE;
diff --git a/tests/testtextbuffer.c b/tests/testtextbuffer.c
index 5da1cab0d6..b739deadcc 100644
--- a/tests/testtextbuffer.c
+++ b/tests/testtextbuffer.c
@@ -960,6 +960,34 @@ test_line_separation (const char* str,
g_object_unref (buffer);
}
+/* there are cases where \r and \n should not be treated like \r\n,
+ * originally bug #337022. */
+static void
+split_r_n_separators_test (void)
+{
+ GtkTextBuffer *buffer;
+ GtkTextIter iter;
+
+ buffer = gtk_text_buffer_new (NULL);
+
+ gtk_text_buffer_set_text (buffer, "foo\ra\nbar\n", -1);
+
+ /* delete 'a' so that we have
+
+ 1 foo\r
+ 2 \n
+ 3 bar\n
+
+ * and both \r and \n are line separators */
+
+ gtk_text_buffer_get_iter_at_offset (buffer, &iter, 5);
+ gtk_text_buffer_backspace (buffer, &iter, TRUE, TRUE);
+
+ g_assert (gtk_text_iter_ends_line (&iter));
+
+ gtk_text_buffer_get_iter_at_offset (buffer, &iter, 3);
+ g_assert (gtk_text_iter_ends_line (&iter));
+}
static void
line_separator_tests (void)
@@ -989,6 +1017,8 @@ line_separator_tests (void)
test_line_separation (str, TRUE, FALSE, 2, 4, 5);
g_free (str);
+ split_r_n_separators_test ();
+
g_print ("Line separator tests passed\n");
}