From: Eli Zaretskii Date: Mon, 14 Apr 2014 15:32:27 +0000 (+0300) Subject: Fix bidirectional redisplay when deletion creates a paragraph start. X-Git-Tag: emacs-24.3.91~145 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ac6ec89c158aae5c4e78fcf70efd19d42c0abbe3;p=emacs.git Fix bidirectional redisplay when deletion creates a paragraph start. src/insdel.c (invalidate_buffer_caches): When deleting or replacing text, invalidate the bidi_paragraph_cache upto and including the preceding newline. --- diff --git a/src/ChangeLog b/src/ChangeLog index be4ce13129c..6b6bd06634a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2014-04-14 Eli Zaretskii + + * insdel.c (invalidate_buffer_caches): When deleting or replacing + text, invalidate the bidi_paragraph_cache upto and including the + preceding newline. + 2014-04-13 Paul Eggert Port to IRIX 6.5 (Bug#9684). diff --git a/src/insdel.c b/src/insdel.c index 30b22ec7b26..ea5f6301501 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -1866,9 +1866,35 @@ invalidate_buffer_caches (struct buffer *buf, ptrdiff_t start, ptrdiff_t end) buf->width_run_cache, start - BUF_BEG (buf), BUF_Z (buf) - end); if (buf->bidi_paragraph_cache) - invalidate_region_cache (buf, - buf->bidi_paragraph_cache, - start - BUF_BEG (buf), BUF_Z (buf) - end); + { + if (start != end + && start > BUF_BEG (buf)) + { + /* If we are deleting or replacing characters, we could + create a paragraph start, because all of the characters + from START to the beginning of START's line are + whitespace. Therefore, we must extend the region to be + invalidated up to the newline before START. */ + ptrdiff_t line_beg = start; + ptrdiff_t start_byte = buf_charpos_to_bytepos (buf, start); + + if (BUF_FETCH_BYTE (buf, start_byte - 1) != '\n') + { + struct buffer *old = current_buffer; + + set_buffer_internal (buf); + + line_beg = find_newline_no_quit (start, start_byte, -1, + &start_byte); + set_buffer_internal (old); + } + if (line_beg > BUF_BEG (buf)) + start = line_beg - 1; + } + invalidate_region_cache (buf, + buf->bidi_paragraph_cache, + start - BUF_BEG (buf), BUF_Z (buf) - end); + } } /* These macros work with an argument named `preserve_ptr'