]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix display of composed characters from L2R scripts in bidi buffers.
authorEli Zaretskii <eliz@gnu.org>
Fri, 23 Apr 2010 18:10:31 +0000 (21:10 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 23 Apr 2010 18:10:31 +0000 (21:10 +0300)
 xdisp.c (set_iterator_to_next, next_element_from_composition): After
 advancing IT past the composition, resync the bidi iterator with
 IT's position.  (Bug#5977)

src/ChangeLog
src/xdisp.c

index 25f5a2af42a1f4ecd4e7ff9265c57b5bfe36bafa..f5f6e8c4421cbeda7a322487bd5036be82b22b3d 100644 (file)
@@ -3,6 +3,9 @@
        * 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)
+       (set_iterator_to_next, next_element_from_composition): Fix display
+       of composed characters from L2R scripts in bidi buffers.
+       (Bug#5977)
 
 2010-04-23  Dan Nicolaescu  <dann@ics.uci.edu>
 
index e68c4f6f2929dedf96f105c40fb51d718037d4a1..753ea16db01c37895d57688a2501b95023c9cbd6 100644 (file)
@@ -5309,7 +5309,7 @@ pop_it (it)
             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)
+         if (it->bidi_it.first_elt && it->bidi_it.charpos < ZV)
            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
@@ -6274,6 +6274,15 @@ set_iterator_to_next (it, reseat_p)
        {
          IT_CHARPOS (*it) += it->cmp_it.nchars;
          IT_BYTEPOS (*it) += it->cmp_it.nbytes;
+         if (it->bidi_p)
+           {
+             if (it->bidi_it.new_paragraph)
+               bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
+             /* Resync the bidi iterator with IT's new position.
+                FIXME: this doesn't support bidirectional text.  */
+             while (it->bidi_it.charpos < IT_CHARPOS (*it))
+               bidi_get_next_char_visually (&it->bidi_it);
+           }
          if (it->cmp_it.to < it->cmp_it.nglyphs)
            it->cmp_it.from = it->cmp_it.to;
          else
@@ -6995,6 +7004,15 @@ next_element_from_composition (it)
        {
          IT_CHARPOS (*it) += it->cmp_it.nchars;
          IT_BYTEPOS (*it) += it->cmp_it.nbytes;
+         if (it->bidi_p)
+           {
+             if (it->bidi_it.new_paragraph)
+               bidi_paragraph_init (it->paragraph_embedding, &it->bidi_it);
+             /* Resync the bidi iterator with IT's new position.
+                FIXME: this doesn't support bidirectional text.  */
+             while (it->bidi_it.charpos < IT_CHARPOS (*it))
+               bidi_get_next_char_visually (&it->bidi_it);
+           }
          return 0;
        }
       it->position = it->current.pos;