changeset 108088:d9c182b86800

Fix display of composed characters from L2R scripts in bidi buffers. 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)
author Eli Zaretskii <eliz@gnu.org>
date Fri, 23 Apr 2010 21:10:31 +0300
parents 216b6ef76da7
children 2bdfb77de643 0d2395808fa3
files src/ChangeLog src/xdisp.c
diffstat 2 files changed, 22 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Fri Apr 23 18:05:23 2010 +0300
+++ b/src/ChangeLog	Fri Apr 23 21:10:31 2010 +0300
@@ -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>
 
--- a/src/xdisp.c	Fri Apr 23 18:05:23 2010 +0300
+++ b/src/xdisp.c	Fri Apr 23 21:10:31 2010 +0300
@@ -5309,7 +5309,7 @@
 	     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 @@
 	{
 	  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 @@
 	{
 	  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;