From: Eli Zaretskii Date: Wed, 12 Sep 2012 17:12:10 +0000 (+0300) Subject: Fix bug #12403 with garbled display under non-zero scroll-margin. X-Git-Url: http://git.hcoop.net/bpt/emacs.git/commitdiff_plain/aa36e4d28b7a405fa542d9fa1dbbfd9758980f22 Fix bug #12403 with garbled display under non-zero scroll-margin. src/xdisp.c (try_window_reusing_current_matrix): Under bidi reordering, locate the cursor by calling set_cursor_from_row; if that fails, clear the desired glyph matrix before returning a failure indication to the caller. Fixes leaving garbled display when fast scrolling with a down-key when scroll-margin is non-zero. --- diff --git a/src/ChangeLog b/src/ChangeLog index 49c1fa345b..39bdd19118 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,11 @@ +2012-09-12 Eli Zaretskii + + * xdisp.c (try_window_reusing_current_matrix): Under bidi + reordering, locate the cursor by calling set_cursor_from_row; if + that fails, clear the desired glyph matrix before returning a + failure indication to the caller. Fixes leaving garbled display + when fast scrolling with a down-key. (Bug#12403) + 2012-09-12 Jan Djärv * gtkutil.c (x_wm_set_size_hint): Use 1 col for base_width so it diff --git a/src/xdisp.c b/src/xdisp.c index 6762bf85eb..3fab4b54cf 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -16593,28 +16593,33 @@ try_window_reusing_current_matrix (struct window *w) } if (row < bottom_row) { - struct glyph *glyph = row->glyphs[TEXT_AREA] + w->cursor.hpos; - struct glyph *end = row->glyphs[TEXT_AREA] + row->used[TEXT_AREA]; - - /* Can't use this optimization with bidi-reordered glyph - rows, unless cursor is already at point. */ + /* Can't simply scan the row for point with + bidi-reordered glyph rows. Let set_cursor_from_row + figure out where to put the cursor, and if it fails, + give up. */ if (!NILP (BVAR (XBUFFER (w->buffer), bidi_display_reordering))) { - if (!(w->cursor.hpos >= 0 - && w->cursor.hpos < row->used[TEXT_AREA] - && BUFFERP (glyph->object) - && glyph->charpos == PT)) - return 0; + if (!set_cursor_from_row (w, row, w->current_matrix, + 0, 0, 0, 0)) + { + clear_glyph_matrix (w->desired_matrix); + return 0; + } } else - for (; glyph < end - && (!BUFFERP (glyph->object) - || glyph->charpos < PT); - glyph++) - { - w->cursor.hpos++; - w->cursor.x += glyph->pixel_width; - } + { + struct glyph *glyph = row->glyphs[TEXT_AREA] + w->cursor.hpos; + struct glyph *end = row->glyphs[TEXT_AREA] + row->used[TEXT_AREA]; + + for (; glyph < end + && (!BUFFERP (glyph->object) + || glyph->charpos < PT); + glyph++) + { + w->cursor.hpos++; + w->cursor.x += glyph->pixel_width; + } + } } }