From: Eli Zaretskii Date: Wed, 31 Mar 2010 14:28:16 +0000 (+0300) Subject: Fix highlight of trailing whitespace is right-to-left lines. X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~438^2~615 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=52c3078336b724f3d657e2405136f66524483ecb;p=emacs.git Fix highlight of trailing whitespace is right-to-left lines. xdisp.c (highlight_trailing_whitespace): Support highlight of trailing whitespace in right-to-left rows. --- diff --git a/src/ChangeLog b/src/ChangeLog index 9d70a3327b6..3c43c80764a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2010-03-31 Eli Zaretskii + + * xdisp.c (highlight_trailing_whitespace): Support highlight of + trailing whitespace in right-to-left rows. + 2010-03-31 Stefan Monnier Get rid of the direct_output optimizations. diff --git a/src/xdisp.c b/src/xdisp.c index b3aaa52e2e5..709ff5f6d68 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -16868,19 +16868,37 @@ highlight_trailing_whitespace (f, row) struct glyph *start = row->glyphs[TEXT_AREA]; struct glyph *glyph = start + used - 1; + if (row->reversed_p) + { + /* Right-to-left rows need to be processed in the opposite + direction, so swap the edge pointers. */ + glyph = start; + start = row->glyphs[TEXT_AREA] + used - 1; + } + /* Skip over glyphs inserted to display the cursor at the end of a line, for extending the face of the last glyph to the end of the line on terminals, and for truncation and continuation glyphs. */ - while (glyph >= start - && glyph->type == CHAR_GLYPH - && INTEGERP (glyph->object)) - --glyph; + if (!row->reversed_p) + { + while (glyph >= start + && glyph->type == CHAR_GLYPH + && INTEGERP (glyph->object)) + --glyph; + } + else + { + while (glyph <= start + && glyph->type == CHAR_GLYPH + && INTEGERP (glyph->object)) + ++glyph; + } /* If last glyph is a space or stretch, and it's trailing whitespace, set the face of all trailing whitespace glyphs in IT->glyph_row to `trailing-whitespace'. */ - if (glyph >= start + if ((row->reversed_p ? glyph <= start : glyph >= start) && BUFFERP (glyph->object) && (glyph->type == STRETCH_GLYPH || (glyph->type == CHAR_GLYPH @@ -16891,12 +16909,24 @@ highlight_trailing_whitespace (f, row) if (face_id < 0) return; - while (glyph >= start - && BUFFERP (glyph->object) - && (glyph->type == STRETCH_GLYPH - || (glyph->type == CHAR_GLYPH - && glyph->u.ch == ' '))) - (glyph--)->face_id = face_id; + if (!row->reversed_p) + { + while (glyph >= start + && BUFFERP (glyph->object) + && (glyph->type == STRETCH_GLYPH + || (glyph->type == CHAR_GLYPH + && glyph->u.ch == ' '))) + (glyph--)->face_id = face_id; + } + else + { + while (glyph <= start + && BUFFERP (glyph->object) + && (glyph->type == STRETCH_GLYPH + || (glyph->type == CHAR_GLYPH + && glyph->u.ch == ' '))) + (glyph++)->face_id = face_id; + } } } }