From: Eli Zaretskii Date: Wed, 4 Nov 2020 20:10:06 +0000 (+0200) Subject: Prevent redisplay from moving point behind user's back X-Git-Tag: emacs-27.1.90~81 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=89740e9cb5;p=emacs.git Prevent redisplay from moving point behind user's back * src/bidi.c (bidi_at_paragraph_end, bidi_find_paragraph_start): Bind inhibit-quit to a non-nil value around calls to fast_looking_at, to prevent breaking out of redisplay_window, which temporarily moves point in buffers shown in non-selected windows. (Bug#44448) --- diff --git a/src/bidi.c b/src/bidi.c index 3abde7fcb09..77e92c302f3 100644 --- a/src/bidi.c +++ b/src/bidi.c @@ -1458,6 +1458,11 @@ bidi_at_paragraph_end (ptrdiff_t charpos, ptrdiff_t bytepos) else start_re = paragraph_start_re; + /* Prevent quitting inside re_match_2, as redisplay_window could + have temporarily moved point. */ + ptrdiff_t count = SPECPDL_INDEX (); + specbind (Qinhibit_quit, Qt); + val = fast_looking_at (sep_re, charpos, bytepos, ZV, ZV_BYTE, Qnil); if (val < 0) { @@ -1467,6 +1472,7 @@ bidi_at_paragraph_end (ptrdiff_t charpos, ptrdiff_t bytepos) val = -2; } + unbind_to (count, Qnil); return val; } @@ -1542,6 +1548,11 @@ bidi_find_paragraph_start (ptrdiff_t pos, ptrdiff_t pos_byte) if (cache_buffer->base_buffer) cache_buffer = cache_buffer->base_buffer; + /* Prevent quitting inside re_match_2, as redisplay_window could + have temporarily moved point. */ + ptrdiff_t count = SPECPDL_INDEX (); + specbind (Qinhibit_quit, Qt); + while (pos_byte > BEGV_BYTE && n++ < MAX_PARAGRAPH_SEARCH && fast_looking_at (re, pos, pos_byte, limit, limit_byte, Qnil) < 0) @@ -1559,6 +1570,7 @@ bidi_find_paragraph_start (ptrdiff_t pos, ptrdiff_t pos_byte) else pos = find_newline_no_quit (pos, pos_byte, -1, &pos_byte); } + unbind_to (count, Qnil); if (n >= MAX_PARAGRAPH_SEARCH) pos = BEGV, pos_byte = BEGV_BYTE; if (bpc)