summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2001-10-22 23:35:03 +0000
committerHavoc Pennington <hp@src.gnome.org>2001-10-22 23:35:03 +0000
commit0d5635b36613c0e5eca772e223001d1858433c28 (patch)
tree7e1ecb35c78379de14107396ff045dab6ceeddf2
parent60ef9dd421b3050581f6e540541d1cc5a5e0bef3 (diff)
downloadgtk+-0d5635b36613c0e5eca772e223001d1858433c28.tar.gz
don't back up a char from the end iterator, fixes #61859 ("can't put
2001-10-22 Havoc Pennington <hp@redhat.com> * gtk/gtktextbuffer.c (gtk_text_buffer_place_cursor): don't back up a char from the end iterator, fixes #61859 ("can't put cursor at the end of the buffer") * gtk/gtktextiter.c (gtk_text_iter_forward_to_line_end): fix this to work with delimiters other than newline. * tests/testtextbuffer.c: add some tests for get_chars_in_line, get_bytes_in_line * gtk/gtktextiter.c (gtk_text_iter_get_chars_in_line): fix for the last line, since the newline is no longer counted. (gtk_text_iter_get_bytes_in_line): ditto
-rw-r--r--ChangeLog16
-rw-r--r--ChangeLog.pre-2-016
-rw-r--r--ChangeLog.pre-2-1016
-rw-r--r--ChangeLog.pre-2-216
-rw-r--r--ChangeLog.pre-2-416
-rw-r--r--ChangeLog.pre-2-616
-rw-r--r--ChangeLog.pre-2-816
-rw-r--r--gtk/gtktextbuffer.c3
-rw-r--r--gtk/gtktextiter.c42
-rw-r--r--tests/testtextbuffer.c39
10 files changed, 187 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 37002e8f17..541a77a292 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
2001-10-22 Havoc Pennington <hp@redhat.com>
+ * gtk/gtktextbuffer.c (gtk_text_buffer_place_cursor): don't back
+ up a char from the end iterator, fixes #61859 ("can't put cursor
+ at the end of the buffer")
+
+ * gtk/gtktextiter.c (gtk_text_iter_forward_to_line_end): fix this
+ to work with delimiters other than newline.
+
+ * tests/testtextbuffer.c: add some tests for get_chars_in_line,
+ get_bytes_in_line
+
+ * gtk/gtktextiter.c (gtk_text_iter_get_chars_in_line): fix for the
+ last line, since the newline is no longer counted.
+ (gtk_text_iter_get_bytes_in_line): ditto
+
+2001-10-22 Havoc Pennington <hp@redhat.com>
+
* gtk/gtktextbtree.c (_gtk_text_btree_insert): add assertion that
#58290 would trigger if it reappeared, I think
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index 37002e8f17..541a77a292 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,5 +1,21 @@
2001-10-22 Havoc Pennington <hp@redhat.com>
+ * gtk/gtktextbuffer.c (gtk_text_buffer_place_cursor): don't back
+ up a char from the end iterator, fixes #61859 ("can't put cursor
+ at the end of the buffer")
+
+ * gtk/gtktextiter.c (gtk_text_iter_forward_to_line_end): fix this
+ to work with delimiters other than newline.
+
+ * tests/testtextbuffer.c: add some tests for get_chars_in_line,
+ get_bytes_in_line
+
+ * gtk/gtktextiter.c (gtk_text_iter_get_chars_in_line): fix for the
+ last line, since the newline is no longer counted.
+ (gtk_text_iter_get_bytes_in_line): ditto
+
+2001-10-22 Havoc Pennington <hp@redhat.com>
+
* gtk/gtktextbtree.c (_gtk_text_btree_insert): add assertion that
#58290 would trigger if it reappeared, I think
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 37002e8f17..541a77a292 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,5 +1,21 @@
2001-10-22 Havoc Pennington <hp@redhat.com>
+ * gtk/gtktextbuffer.c (gtk_text_buffer_place_cursor): don't back
+ up a char from the end iterator, fixes #61859 ("can't put cursor
+ at the end of the buffer")
+
+ * gtk/gtktextiter.c (gtk_text_iter_forward_to_line_end): fix this
+ to work with delimiters other than newline.
+
+ * tests/testtextbuffer.c: add some tests for get_chars_in_line,
+ get_bytes_in_line
+
+ * gtk/gtktextiter.c (gtk_text_iter_get_chars_in_line): fix for the
+ last line, since the newline is no longer counted.
+ (gtk_text_iter_get_bytes_in_line): ditto
+
+2001-10-22 Havoc Pennington <hp@redhat.com>
+
* gtk/gtktextbtree.c (_gtk_text_btree_insert): add assertion that
#58290 would trigger if it reappeared, I think
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index 37002e8f17..541a77a292 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,5 +1,21 @@
2001-10-22 Havoc Pennington <hp@redhat.com>
+ * gtk/gtktextbuffer.c (gtk_text_buffer_place_cursor): don't back
+ up a char from the end iterator, fixes #61859 ("can't put cursor
+ at the end of the buffer")
+
+ * gtk/gtktextiter.c (gtk_text_iter_forward_to_line_end): fix this
+ to work with delimiters other than newline.
+
+ * tests/testtextbuffer.c: add some tests for get_chars_in_line,
+ get_bytes_in_line
+
+ * gtk/gtktextiter.c (gtk_text_iter_get_chars_in_line): fix for the
+ last line, since the newline is no longer counted.
+ (gtk_text_iter_get_bytes_in_line): ditto
+
+2001-10-22 Havoc Pennington <hp@redhat.com>
+
* gtk/gtktextbtree.c (_gtk_text_btree_insert): add assertion that
#58290 would trigger if it reappeared, I think
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index 37002e8f17..541a77a292 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,5 +1,21 @@
2001-10-22 Havoc Pennington <hp@redhat.com>
+ * gtk/gtktextbuffer.c (gtk_text_buffer_place_cursor): don't back
+ up a char from the end iterator, fixes #61859 ("can't put cursor
+ at the end of the buffer")
+
+ * gtk/gtktextiter.c (gtk_text_iter_forward_to_line_end): fix this
+ to work with delimiters other than newline.
+
+ * tests/testtextbuffer.c: add some tests for get_chars_in_line,
+ get_bytes_in_line
+
+ * gtk/gtktextiter.c (gtk_text_iter_get_chars_in_line): fix for the
+ last line, since the newline is no longer counted.
+ (gtk_text_iter_get_bytes_in_line): ditto
+
+2001-10-22 Havoc Pennington <hp@redhat.com>
+
* gtk/gtktextbtree.c (_gtk_text_btree_insert): add assertion that
#58290 would trigger if it reappeared, I think
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 37002e8f17..541a77a292 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,5 +1,21 @@
2001-10-22 Havoc Pennington <hp@redhat.com>
+ * gtk/gtktextbuffer.c (gtk_text_buffer_place_cursor): don't back
+ up a char from the end iterator, fixes #61859 ("can't put cursor
+ at the end of the buffer")
+
+ * gtk/gtktextiter.c (gtk_text_iter_forward_to_line_end): fix this
+ to work with delimiters other than newline.
+
+ * tests/testtextbuffer.c: add some tests for get_chars_in_line,
+ get_bytes_in_line
+
+ * gtk/gtktextiter.c (gtk_text_iter_get_chars_in_line): fix for the
+ last line, since the newline is no longer counted.
+ (gtk_text_iter_get_bytes_in_line): ditto
+
+2001-10-22 Havoc Pennington <hp@redhat.com>
+
* gtk/gtktextbtree.c (_gtk_text_btree_insert): add assertion that
#58290 would trigger if it reappeared, I think
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 37002e8f17..541a77a292 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,5 +1,21 @@
2001-10-22 Havoc Pennington <hp@redhat.com>
+ * gtk/gtktextbuffer.c (gtk_text_buffer_place_cursor): don't back
+ up a char from the end iterator, fixes #61859 ("can't put cursor
+ at the end of the buffer")
+
+ * gtk/gtktextiter.c (gtk_text_iter_forward_to_line_end): fix this
+ to work with delimiters other than newline.
+
+ * tests/testtextbuffer.c: add some tests for get_chars_in_line,
+ get_bytes_in_line
+
+ * gtk/gtktextiter.c (gtk_text_iter_get_chars_in_line): fix for the
+ last line, since the newline is no longer counted.
+ (gtk_text_iter_get_bytes_in_line): ditto
+
+2001-10-22 Havoc Pennington <hp@redhat.com>
+
* gtk/gtktextbtree.c (_gtk_text_btree_insert): add assertion that
#58290 would trigger if it reappeared, I think
diff --git a/gtk/gtktextbuffer.c b/gtk/gtktextbuffer.c
index ebd33443d9..e97cff8384 100644
--- a/gtk/gtktextbuffer.c
+++ b/gtk/gtktextbuffer.c
@@ -1866,9 +1866,6 @@ gtk_text_buffer_place_cursor (GtkTextBuffer *buffer,
real = *where;
- if (gtk_text_iter_is_end (&real))
- gtk_text_iter_backward_char (&real);
-
_gtk_text_btree_place_cursor (get_btree (buffer), &real);
gtk_text_buffer_mark_set (buffer, &real,
gtk_text_buffer_get_mark (buffer,
diff --git a/gtk/gtktextiter.c b/gtk/gtktextiter.c
index 501b077fab..d508eda49d 100644
--- a/gtk/gtktextiter.c
+++ b/gtk/gtktextiter.c
@@ -1658,6 +1658,9 @@ gtk_text_iter_get_chars_in_line (const GtkTextIter *iter)
seg = seg->next;
}
+ if (_gtk_text_line_contains_end_iter (real->line, real->tree))
+ count -= 1; /* Dump the newline that was in the last segment of the end iter line */
+
return count;
}
@@ -1706,6 +1709,9 @@ gtk_text_iter_get_bytes_in_line (const GtkTextIter *iter)
seg = seg->next;
}
+ if (_gtk_text_line_contains_end_iter (real->line, real->tree))
+ count -= 1; /* Dump the newline that was in the last segment of the end iter line */
+
return count;
}
@@ -3486,7 +3492,7 @@ gtk_text_iter_set_line_offset (GtkTextIter *iter,
iter_set_from_char_offset (real, real->line, char_on_line);
else
gtk_text_iter_forward_line (iter); /* set to start of next line */
-
+
check_invariants (iter);
}
@@ -3735,6 +3741,30 @@ gtk_text_iter_forward_to_end (GtkTextIter *iter)
gtk_text_buffer_get_end_iter (buffer, iter);
}
+/* FIXME this and gtk_text_iter_forward_to_line_end() could be cleaned up
+ * and made faster. Look at iter_ends_line() for inspiration, perhaps.
+ * If all else fails we could cache the para delimiter pos in the iter.
+ * I think forward_to_line_end() actually gets called fairly often.
+ */
+static int
+find_paragraph_delimiter_for_line (GtkTextIter *iter)
+{
+ GtkTextIter end;
+ end = *iter;
+
+ /* if we aren't on the last line, go forward to start of next line, then scan
+ * back for the delimiters on the previous line
+ */
+ if (gtk_text_iter_forward_line (&end))
+ {
+ gtk_text_iter_backward_char (&end);
+ while (!gtk_text_iter_ends_line (&end))
+ gtk_text_iter_backward_char (&end);
+ }
+
+ return gtk_text_iter_get_line_offset (&end);
+}
+
/**
* gtk_text_iter_forward_to_line_end:
* @iter: a #GtkTextIter
@@ -3744,7 +3774,9 @@ gtk_text_iter_forward_to_end (GtkTextIter *iter)
* return/newline in sequence, or the Unicode paragraph separator
* character. If the iterator is already at the paragraph delimiter
* characters, moves to the paragraph delimiter characters for the
- * next line.
+ * next line. If @iter is on the last line in the buffer, which does
+ * not end in paragraph delimiters, moves to the end iterator (end of
+ * the last line), and returns %FALSE.
*
* Return value: %TRUE if we moved and the new location is not the end iterator
**/
@@ -3754,12 +3786,12 @@ gtk_text_iter_forward_to_line_end (GtkTextIter *iter)
gint current_offset;
gint new_offset;
+
g_return_val_if_fail (iter != NULL, FALSE);
current_offset = gtk_text_iter_get_line_offset (iter);
- /* FIXME assumption that line ends in a newline; broken */
- new_offset = gtk_text_iter_get_chars_in_line (iter) - 1;
-
+ new_offset = find_paragraph_delimiter_for_line (iter);
+
if (current_offset < new_offset)
{
/* Move to end of this line. */
diff --git a/tests/testtextbuffer.c b/tests/testtextbuffer.c
index 0e29a0768f..f0dcd36f2d 100644
--- a/tests/testtextbuffer.c
+++ b/tests/testtextbuffer.c
@@ -67,6 +67,15 @@ main (int argc, char** argv)
if (n != 0)
g_error ("%d chars, expected 0", n);
+ /* empty first line contains 0 chars */
+ gtk_text_buffer_get_start_iter (buffer, &start);
+ n = gtk_text_iter_get_chars_in_line (&start);
+ if (n != 0)
+ g_error ("%d chars in first line, expected 0", n);
+ n = gtk_text_iter_get_bytes_in_line (&start);
+ if (n != 0)
+ g_error ("%d bytes in first line, expected 0", n);
+
/* Run gruesome alien test suite on buffer */
run_tests (buffer);
@@ -77,6 +86,8 @@ main (int argc, char** argv)
check_get_set_text (buffer, "Hello\r");
check_get_set_text (buffer, "Hello\nBar\nFoo");
check_get_set_text (buffer, "Hello\nBar\nFoo\n");
+
+ g_print ("get/set tests passed.\n");
/* Put stuff in the buffer */
@@ -112,7 +123,7 @@ static void
check_get_set_text (GtkTextBuffer *buffer,
const char *str)
{
- GtkTextIter start, end;
+ GtkTextIter start, end, iter;
char *text;
int n;
@@ -127,6 +138,32 @@ check_get_set_text (GtkTextBuffer *buffer,
g_error ("Got '%s' as buffer contents", text);
g_free (text);
+ /* line char counts */
+ iter = start;
+ n = 0;
+ do
+ {
+ n += gtk_text_iter_get_chars_in_line (&iter);
+ }
+ while (gtk_text_iter_forward_line (&iter));
+
+ if (n != gtk_text_buffer_get_char_count (buffer))
+ g_error ("Sum of chars in lines is %d but buffer char count is %d",
+ n, gtk_text_buffer_get_char_count (buffer));
+
+ /* line byte counts */
+ iter = start;
+ n = 0;
+ do
+ {
+ n += gtk_text_iter_get_bytes_in_line (&iter);
+ }
+ while (gtk_text_iter_forward_line (&iter));
+
+ if (n != strlen (str))
+ g_error ("Sum of chars in lines is %d but buffer byte count is %d",
+ n, strlen (str));
+
gtk_text_buffer_set_text (buffer, "", -1);
n = gtk_text_buffer_get_line_count (buffer);