]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix redisplay glitches with RTL composed text
authorEli Zaretskii <eliz@gnu.org>
Thu, 6 Jun 2019 14:12:57 +0000 (17:12 +0300)
committerEli Zaretskii <eliz@gnu.org>
Thu, 6 Jun 2019 14:12:57 +0000 (17:12 +0300)
* src/xdisp.c (init_to_row_end): Fail if the first visible
position on the line following ROW is bidi-reordered and could
be composed.  (Bug#35811)

src/xdisp.c

index 5f438152341e5eaeaa82f4d052c091ccdf31627d..aa10abeb191e644d5b8306c902755005fdac6999 100644 (file)
@@ -3407,7 +3407,8 @@ init_to_row_start (struct it *it, struct window *w, struct glyph_row *row)
 /* Initialize IT for stepping through current_buffer in window W
    starting in the line following ROW, i.e. starting at ROW->end.
    Value is false if there are overlay strings with newlines at ROW's
-   end position.  */
+   end position, or if the following row begins with bidi-reordered
+   characters that could be composed.  */
 
 static bool
 init_to_row_end (struct it *it, struct window *w, struct glyph_row *row)
@@ -3420,7 +3421,20 @@ init_to_row_end (struct it *it, struct window *w, struct glyph_row *row)
        it->continuation_lines_width
          = row->continuation_lines_width + row->pixel_width;
       CHECK_IT (it);
-      success = true;
+      /* Initializing IT in the presense of compositions in reordered
+        rows is tricky: row->end above will generally cause us to
+        start at position that is not the first one in the logical
+        order, and we might therefore miss the composition earlier in
+        the buffer that affects how glypsh are laid out in this row.
+        So we punt instead.  Note: the test below works because
+        get_next_display_element calls get_visually_first_element,
+        which calls composition_compute_stop_pos, which populates
+        it->cmp_it.  */
+      if (get_next_display_element (it)
+         && (it->bidi_it.scan_dir == -1 && it->cmp_it.id >= 0))
+       success = false;
+      else
+       success = true;
     }
 
   return success;