Commit 07525f77 authored by Eli Zaretskii's avatar Eli Zaretskii
Browse files

Fix vertical cursor motion when there's a display string with newline at EOL.

 src/xdisp.c (row_for_charpos_p): New function, with code of
 cursor_row_p, but accepts an additional argument CHARPOS instead
 of using a hardcoded PT.
 (cursor_row_p): Call row_for_charpos_p with 2nd argument PT.
 (row_containing_pos): Call row_for_charpos_p instead of partially
 doing the same.  Fixes cursor positioning under longlines-mode
 when longlines-show-effect includes more than one newline, when
 moving the cursor vertically up.
parent 1d5963cc
2013-05-08 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (row_for_charpos_p): New function, with code of
cursor_row_p, but accepts an additional argument CHARPOS instead
of using a hardcoded PT.
(cursor_row_p): Call row_for_charpos_p with 2nd argument PT.
(row_containing_pos): Call row_for_charpos_p instead of partially
doing the same. Fixes cursor positioning under longlines-mode
when longlines-show-effect includes more than one newline, when
moving the cursor vertically up.
2013-05-08 Juanma Barranquero <lekktu@gmail.com> 2013-05-08 Juanma Barranquero <lekktu@gmail.com>
   
* makefile.w32-in (ACL_H): New macro. * makefile.w32-in (ACL_H): New macro.
......
...@@ -794,6 +794,7 @@ static void set_iterator_to_next (struct it *, int); ...@@ -794,6 +794,7 @@ static void set_iterator_to_next (struct it *, int);
static void mark_window_display_accurate_1 (struct window *, int); static void mark_window_display_accurate_1 (struct window *, int);
static int single_display_spec_string_p (Lisp_Object, Lisp_Object); static int single_display_spec_string_p (Lisp_Object, Lisp_Object);
static int display_prop_string_p (Lisp_Object, Lisp_Object); static int display_prop_string_p (Lisp_Object, Lisp_Object);
static int row_for_charpos_p (struct glyph_row *, ptrdiff_t);
static int cursor_row_p (struct glyph_row *); static int cursor_row_p (struct glyph_row *);
static int redisplay_mode_lines (Lisp_Object, int); static int redisplay_mode_lines (Lisp_Object, int);
static char *decode_mode_spec_coding (Lisp_Object, char *, int); static char *decode_mode_spec_coding (Lisp_Object, char *, int);
...@@ -16909,10 +16910,9 @@ row_containing_pos (struct window *w, ptrdiff_t charpos, ...@@ -16909,10 +16910,9 @@ row_containing_pos (struct window *w, ptrdiff_t charpos,
|| (MATRIX_ROW_END_CHARPOS (row) == charpos || (MATRIX_ROW_END_CHARPOS (row) == charpos
/* The end position of a row equals the start /* The end position of a row equals the start
position of the next row. If CHARPOS is there, we position of the next row. If CHARPOS is there, we
would rather display it in the next line, except would rather consider it displayed in the next
when this line ends in ZV. */ line, except when this line ends in ZV. */
&& !row->ends_at_zv_p && !row_for_charpos_p (row, charpos)))
&& !MATRIX_ROW_ENDS_IN_MIDDLE_OF_CHAR_P (row)))
&& charpos >= MATRIX_ROW_START_CHARPOS (row)) && charpos >= MATRIX_ROW_START_CHARPOS (row))
{ {
struct glyph *g; struct glyph *g;
...@@ -16920,10 +16920,10 @@ row_containing_pos (struct window *w, ptrdiff_t charpos, ...@@ -16920,10 +16920,10 @@ row_containing_pos (struct window *w, ptrdiff_t charpos,
if (NILP (BVAR (XBUFFER (w->contents), bidi_display_reordering)) if (NILP (BVAR (XBUFFER (w->contents), bidi_display_reordering))
|| (!best_row && !row->continued_p)) || (!best_row && !row->continued_p))
return row; return row;
/* In bidi-reordered rows, there could be several rows /* In bidi-reordered rows, there could be several rows whose
occluding point, all of them belonging to the same edges surround CHARPOS, all of these rows belonging to
continued line. We need to find the row which fits the same continued line. We need to find the row which
CHARPOS the best. */ fits CHARPOS the best. */
for (g = row->glyphs[TEXT_AREA]; for (g = row->glyphs[TEXT_AREA];
g < row->glyphs[TEXT_AREA] + row->used[TEXT_AREA]; g < row->glyphs[TEXT_AREA] + row->used[TEXT_AREA];
g++) g++)
...@@ -18727,15 +18727,15 @@ highlight_trailing_whitespace (struct frame *f, struct glyph_row *row) ...@@ -18727,15 +18727,15 @@ highlight_trailing_whitespace (struct frame *f, struct glyph_row *row)
   
   
/* Value is non-zero if glyph row ROW should be /* Value is non-zero if glyph row ROW should be
used to hold the cursor. */ considered to hold the buffer position CHARPOS. */
   
static int static int
cursor_row_p (struct glyph_row *row) row_for_charpos_p (struct glyph_row *row, ptrdiff_t charpos)
{ {
int result = 1; int result = 1;
   
if (PT == CHARPOS (row->end.pos) if (charpos == CHARPOS (row->end.pos)
|| PT == MATRIX_ROW_END_CHARPOS (row)) || charpos == MATRIX_ROW_END_CHARPOS (row))
{ {
/* Suppose the row ends on a string. /* Suppose the row ends on a string.
Unless the row is continued, that means it ends on a newline Unless the row is continued, that means it ends on a newline
...@@ -18761,7 +18761,7 @@ cursor_row_p (struct glyph_row *row) ...@@ -18761,7 +18761,7 @@ cursor_row_p (struct glyph_row *row)
if (STRINGP (glyph->object)) if (STRINGP (glyph->object))
{ {
Lisp_Object prop Lisp_Object prop
= Fget_char_property (make_number (PT), = Fget_char_property (make_number (charpos),
Qdisplay, Qnil); Qdisplay, Qnil);
result = result =
(!NILP (prop) (!NILP (prop)
...@@ -18815,6 +18815,15 @@ cursor_row_p (struct glyph_row *row) ...@@ -18815,6 +18815,15 @@ cursor_row_p (struct glyph_row *row)
return result; return result;
} }
   
/* Value is non-zero if glyph row ROW should be
used to hold the cursor. */
static int
cursor_row_p (struct glyph_row *row)
{
return row_for_charpos_p (row, PT);
}
   
/* Push the property PROP so that it will be rendered at the current /* Push the property PROP so that it will be rendered at the current
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment