Mercurial > emacs
changeset 108080:78e19c135981
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)
author | Eli Zaretskii <eliz@gnu.org> |
---|---|
date | Fri, 23 Apr 2010 18:09:11 +0300 |
parents | 44c107eab0b8 (current diff) 216b6ef76da7 (diff) |
children | 33a95d8ffa43 |
files | src/ChangeLog |
diffstat | 2 files changed, 38 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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 <eliz@gnu.org> + + 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 <dann@ics.uci.edu> * m/macppc.h (LD_SWITCH_SYSTEM_TEMACS): Remove #undef.
--- 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;