From 8785b8887a35e22970b65409de0738302b91c982 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 23 Apr 2010 18:05:23 +0300 Subject: [PATCH] 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) --- src/ChangeLog | 6 ++++++ src/xdisp.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index 9e08f6a8977..25f5a2af42a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -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 --git a/src/xdisp.c b/src/xdisp.c index a0f97acdcb1..e68c4f6f292 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -5299,6 +5299,36 @@ pop_it (it) 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; -- 2.39.5