[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs-25 cca5629: Fix cursor display when invisible text i
From: |
Eli Zaretskii |
Subject: |
[Emacs-diffs] emacs-25 cca5629: Fix cursor display when invisible text is at line beginning |
Date: |
Sun, 06 Dec 2015 17:28:30 +0000 |
branch: emacs-25
commit cca5629f7856d88de940da942acbf5ca7f95a944
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>
Fix cursor display when invisible text is at line beginning
* src/xdisp.c (redisplay_window): When scrolling fails to show
point, prefer using the desired matrix if possible for finding the
fallback glyph row for displaying the cursor. (Bug#22098)
(row_containing_pos): Exit the loop as soon as we hit the first
disabled glyph row. Otherwise we risk accessing garbled data and
departing to the no-no land.
---
src/xdisp.c | 20 +++++++++++++-------
1 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/xdisp.c b/src/xdisp.c
index d1a10ca..3930cbf 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -16720,6 +16720,7 @@ redisplay_window (Lisp_Object window, bool
just_this_one_p)
startp = run_window_scroll_functions (window, it.current.pos);
/* Redisplay the window. */
+ bool use_desired_matrix = false;
if (!current_matrix_up_to_date_p
|| windows_or_buffers_changed
|| f->cursor_type_changed
@@ -16730,7 +16731,7 @@ redisplay_window (Lisp_Object window, bool
just_this_one_p)
|| MINI_WINDOW_P (w)
|| !(used_current_matrix_p
= try_window_reusing_current_matrix (w)))
- try_window (window, startp, 0);
+ use_desired_matrix = (try_window (window, startp, 0) == 1);
/* If new fonts have been loaded (due to fontsets), give up. We
have to start a new redisplay since we need to re-adjust glyph
@@ -16770,9 +16771,15 @@ redisplay_window (Lisp_Object window, bool
just_this_one_p)
and similar ones. */
if (w->cursor.vpos < 0)
{
+ /* Prefer the desired matrix to the current matrix, if possible,
+ in the fallback calculations below. This is because using
+ the current matrix might completely goof, e.g. if its first
+ row is after point. */
+ struct glyph_matrix *matrix =
+ use_desired_matrix ? w->desired_matrix : w->current_matrix;
/* First, try locating the proper glyph row for PT. */
struct glyph_row *row =
- row_containing_pos (w, PT, w->current_matrix->rows, NULL, 0);
+ row_containing_pos (w, PT, matrix->rows, NULL, 0);
/* Sometimes point is at the beginning of invisible text that is
before the 1st character displayed in the row. In that case,
@@ -16797,8 +16804,7 @@ redisplay_window (Lisp_Object window, bool
just_this_one_p)
alt_pos = XFASTINT (invis_end);
else
alt_pos = ZV;
- row = row_containing_pos (w, alt_pos, w->current_matrix->rows,
- NULL, 0);
+ row = row_containing_pos (w, alt_pos, matrix->rows, NULL, 0);
}
}
/* Finally, fall back on the first row of the window after the
@@ -16806,11 +16812,11 @@ redisplay_window (Lisp_Object window, bool
just_this_one_p)
displaying the cursor at all. */
if (!row)
{
- row = w->current_matrix->rows;
+ row = matrix->rows;
if (row->mode_line_p)
++row;
}
- set_cursor_from_row (w, row, w->current_matrix, 0, 0, 0, 0);
+ set_cursor_from_row (w, row, matrix, 0, 0, 0, 0);
}
if (!cursor_row_fully_visible_p (w, false, false))
@@ -17795,7 +17801,7 @@ row_containing_pos (struct window *w, ptrdiff_t charpos,
while (true)
{
/* Give up if we have gone too far. */
- if (end && row >= end)
+ if (end && row >= end || !row->enabled_p)
return NULL;
/* This formerly returned if they were equal.
I think that both quantities are of a "last plus one" type;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] emacs-25 cca5629: Fix cursor display when invisible text is at line beginning,
Eli Zaretskii <=