# HG changeset patch # User Eli Zaretskii # Date 1270045696 -10800 # Node ID 22e41874fef49b1798b4c3a513d2c632d6c0f24e # Parent 7e3e614f8fe135c72eb2cef50da17cc2dd6bcb25 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 -r 7e3e614f8fe1 -r 22e41874fef4 src/ChangeLog --- a/src/ChangeLog Wed Mar 31 06:48:04 2010 +0000 +++ b/src/ChangeLog Wed Mar 31 17:28:16 2010 +0300 @@ -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 -r 7e3e614f8fe1 -r 22e41874fef4 src/xdisp.c --- a/src/xdisp.c Wed Mar 31 06:48:04 2010 +0000 +++ b/src/xdisp.c Wed Mar 31 17:28:16 2010 +0300 @@ -16868,19 +16868,37 @@ 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 @@ 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; + } } } }