diff options
author | Paolo Borelli <pborelli@katamail.com> | 2006-04-05 18:30:46 +0000 |
---|---|---|
committer | Paolo Borelli <pborelli@src.gnome.org> | 2006-04-05 18:30:46 +0000 |
commit | f58c7f1ae8755e4da073f5fafa83dd5e45849024 (patch) | |
tree | a08d4ee479ee998ae0035c946cf511562ffe6073 | |
parent | 3797d5a34e6a443cc12cc4b6b1f513e4d3794556 (diff) | |
download | gtk+-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-- | ChangeLog | 6 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 6 | ||||
-rw-r--r-- | gtk/gtktextiter.c | 17 | ||||
-rw-r--r-- | tests/testtextbuffer.c | 30 |
4 files changed, 57 insertions, 2 deletions
@@ -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"); } |