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;