emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] feature/gnus-select cbea6b1 145/218: Avoid redisplay probl


From: Andrew G Cohen
Subject: [Emacs-diffs] feature/gnus-select cbea6b1 145/218: Avoid redisplay problems with too wide wrap-prefix
Date: Fri, 14 Dec 2018 03:35:18 -0500 (EST)

branch: feature/gnus-select
commit cbea6b19f41b3aa74f405f9846e04968a5426d16
Author: Eli Zaretskii <address@hidden>
Commit: Andrew G Cohen <address@hidden>

    Avoid redisplay problems with too wide wrap-prefix
    
    * src/xdisp.c (display_line): Avoid looping in redisplay when
    wrap-prefix is set to a too-wide stretch of whitespace.
    (Bug#30432)
---
 src/xdisp.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/xdisp.c b/src/xdisp.c
index 4778f53..df5335e 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -21969,9 +21969,24 @@ display_line (struct it *it, int cursor_vpos)
          break;
        }
 
+      /* Detect overly-wide wrap-prefixes made of (space ...) display
+        properties.  When such a wrap prefix reaches past the right
+        margin of the window, we need to avoid the call to
+        set_iterator_to_next below, so that it->line_wrap is left at
+        its TRUNCATE value wisely set by handle_line_prefix.
+        Otherwise, set_iterator_to_next will pop the iterator stack,
+        restore it->line_wrap, and redisplay might infloop.  */
+      bool overwide_wrap_prefix =
+       CONSP (it->object) && EQ (XCAR (it->object), Qspace)
+       && it->sp > 0 && it->method == GET_FROM_STRETCH
+       && it->current_x >= it->last_visible_x
+       && it->continuation_lines_width > 0
+       && it->line_wrap == TRUNCATE && it->stack[0].line_wrap != TRUNCATE;
+
       /* Proceed with next display element.  Note that this skips
         over lines invisible because of selective display.  */
-      set_iterator_to_next (it, true);
+      if (!overwide_wrap_prefix)
+       set_iterator_to_next (it, true);
 
       /* If we truncate lines, we are done when the last displayed
         glyphs reach past the right margin of the window.  */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]