]> git.eshelyaron.com Git - emacs.git/commitdiff
Support `display' text properties and overlays.
authorEli Zaretskii <eliz@gnu.org>
Fri, 23 Apr 2010 15:05:23 +0000 (18:05 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 23 Apr 2010 15:05:23 +0000 (18:05 +0300)
 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
src/xdisp.c

index 9e08f6a89778d69a5cad58aaeecafc26533432f4..25f5a2af42a1f4ecd4e7ff9265c57b5bfe36bafa 100644 (file)
@@ -1,3 +1,9 @@
+2010-04-23  Eli Zaretskii  <eliz@gnu.org>
+
+       * 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>
 
        * s/netbsd.h (LD_SWITCH_SYSTEM_TEMACS): Remove, configure sets nocombreloc.
index a0f97acdcb1bec39301bcaf88856ca96a3f19303..e68c4f6f2929dedf96f105c40fb51d718037d4a1 100644 (file)
@@ -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;