# HG changeset patch # User Eli Zaretskii # Date 1272035123 -10800 # Node ID 216b6ef76da7ca8e8081fb495ce0c805e391a403 # Parent a39e96e3b891b36fff40e9ddbd8b8f628bd20a44 Support `display' text properties and overlays. 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 a39e96e3b891 -r 216b6ef76da7 src/ChangeLog --- a/src/ChangeLog Fri Apr 23 00:37:42 2010 -0700 +++ b/src/ChangeLog Fri Apr 23 18:05:23 2010 +0300 @@ -1,3 +1,9 @@ +2010-04-23 Eli Zaretskii + + * 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 * s/netbsd.h (LD_SWITCH_SYSTEM_TEMACS): Remove, configure sets nocombreloc. diff -r a39e96e3b891 -r 216b6ef76da7 src/xdisp.c --- a/src/xdisp.c Fri Apr 23 00:37:42 2010 -0700 +++ b/src/xdisp.c Fri Apr 23 18:05:23 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;