# HG changeset patch # User Eli Zaretskii # Date 1272035351 -10800 # Node ID 78e19c1359819b6f2a09a08ac627b1a6722e7d44 # Parent 44c107eab0b83fd2c956dbfa00ebf5e056379eac# Parent 216b6ef76da7ca8e8081fb495ce0c805e391a403 Support `display' text properties and overlay strings in bidi buffers. xdisp.c (pop_it): When the stack is popped after displaying from a string, bidi-iterate to exit from the text portion covered by the `display' property or overlay. (Bug#5988, bug#5920) diff -r 44c107eab0b8 -r 78e19c135981 src/ChangeLog --- a/src/ChangeLog Fri Apr 23 16:19:44 2010 +0200 +++ b/src/ChangeLog Fri Apr 23 18:09:11 2010 +0300 @@ -1,3 +1,11 @@ +2010-04-23 Eli Zaretskii + + Support `display' text properties and overlay strings in bidi + buffers. + * xdisp.c (pop_it): When the stack is popped after displaying + from a string, bidi-iterate to exit from the text portion covered + by the `display' property or overlay. (Bug#5988, bug#5920) + 2010-04-23 Dan Nicolaescu * m/macppc.h (LD_SWITCH_SYSTEM_TEMACS): Remove #undef. diff -r 44c107eab0b8 -r 78e19c135981 src/xdisp.c --- a/src/xdisp.c Fri Apr 23 16:19:44 2010 +0200 +++ b/src/xdisp.c Fri Apr 23 18:09:11 2010 +0300 @@ -5299,6 +5299,36 @@ break; case GET_FROM_BUFFER: it->object = it->w->buffer; + if (it->bidi_p) + { + /* Bidi-iterate until we get out of the portion of text, if + any, covered by a `display' text property or an overlay + with `display' property. (We cannot just jump there, + because the internal coherency of the bidi iterator state + can not be preserved across such jumps.) We also must + determine the paragraph base direction if the overlay we + just processed is at the beginning of a new + paragraph. */ + if (it->bidi_it.first_elt) + bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it); + /* prev_stop can be zero, so check against BEGV as well. */ + while (it->bidi_it.charpos >= BEGV + && it->prev_stop <= it->bidi_it.charpos + && it->bidi_it.charpos < CHARPOS (it->position)) + bidi_get_next_char_visually (&it->bidi_it); + /* Record the stop_pos we just crossed, for when we cross it + back, maybe. */ + if (it->bidi_it.charpos > CHARPOS (it->position)) + it->prev_stop = CHARPOS (it->position); + /* If we ended up not where pop_it put us, resync IT's + positional members with the bidi iterator. */ + if (it->bidi_it.charpos != CHARPOS (it->position)) + { + SET_TEXT_POS (it->position, + it->bidi_it.charpos, it->bidi_it.bytepos); + it->current.pos = it->position; + } + } break; case GET_FROM_STRING: it->object = it->string;