Retrospective commit from 2009-08-29.
authorEli Zaretskii <eliz@gnu.org>
Thu, 31 Dec 2009 20:56:07 +0000 (15:56 -0500)
committerEli Zaretskii <eliz@gnu.org>
Thu, 31 Dec 2009 20:56:07 +0000 (15:56 -0500)
Started working on cursor motion.

 xdisp.c (set_cursor_from_row): Don't assume glyph->charpos
 increments linearly.
 (try_window_reusing_current_matrix): Don't assume glyph->charpos
 increments linearly.
 bidi.c <bidi_overriding_paragraph_direction>: Default to L2R, for now.

src/ChangeLog.bidi
src/bidi.c
src/xdisp.c

index eab5642..c36ab23 100644 (file)
@@ -1,3 +1,15 @@
+2009-08-29  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (set_cursor_from_row): Don't assume glyph->charpos
+       increments linearly.
+       (try_window_reusing_current_matrix): Don't assume glyph->charpos
+       increments linearly.
+
+2009-08-28  Eli Zaretskii  <eliz@gnu.org>
+
+       * bidi.c <bidi_overriding_paragraph_direction>: Default to L2R,
+       for now.
+
 2009-08-22  Eli Zaretskii  <eliz@gnu.org>
 
        * bidi.c (bidi_initialize): staticpro bidi_char_table.
index 697909a..e558b73 100644 (file)
@@ -155,7 +155,8 @@ typedef enum {
 
 int bidi_ignore_explicit_marks_for_paragraph_level = 1;
 
-bidi_dir_t bidi_overriding_paragraph_direction = NEUTRAL_DIR;
+/* FIXME: Should be user-definable.  */
+bidi_dir_t bidi_overriding_paragraph_direction = L2R;
 
 /* FIXME: Unused? */
 #define ASCII_BIDI_TYPE_SET(STR, TYPE)                 \
index bd9300a..54ac640 100644 (file)
@@ -12377,7 +12377,7 @@ set_cursor_from_row (w, row, matrix, delta, delta_bytes, dy, dvpos)
   while (glyph < end
         && !INTEGERP (glyph->object)
         && (!BUFFERP (glyph->object)
-            || (last_pos = glyph->charpos) < pt_old
+            || (last_pos = glyph->charpos) != pt_old
             || glyph->avoid_cursor_p))
     {
       if (! STRINGP (glyph->object))
@@ -14497,15 +14497,39 @@ try_window_reusing_current_matrix (w)
            {
              struct glyph *glyph = row->glyphs[TEXT_AREA] + w->cursor.hpos;
              struct glyph *end = glyph + row->used[TEXT_AREA];
+             struct glyph *orig_glyph = glyph;
+             struct cursor_pos orig_cursor = w->cursor;
 
              for (; glyph < end
                     && (!BUFFERP (glyph->object)
-                        || glyph->charpos < PT);
+                        || glyph->charpos != PT);
                   glyph++)
                {
                  w->cursor.hpos++;
                  w->cursor.x += glyph->pixel_width;
                }
+             /* With bidi reordering, charpos changes non-linearly
+                with hpos, so the right glyph could be to the
+                left.  */
+             if (!NILP (XBUFFER (w->buffer)->bidi_display_reordering)
+                 && (!BUFFERP (glyph->object) || glyph->charpos != PT))
+               {
+                 struct glyph *start_glyph = row->glyphs[TEXT_AREA];
+
+                 glyph = orig_glyph - 1;
+                 orig_cursor.hpos--;
+                 orig_cursor.x -= glyph->pixel_width;
+                 for (; glyph >= start_glyph
+                        && (!BUFFERP (glyph->object)
+                            || glyph->charpos != PT);
+                      glyph--)
+                   {
+                     w->cursor.hpos--;
+                     w->cursor.x -= glyph->pixel_width;
+                   }
+                 if (BUFFERP (glyph->object) && glyph->charpos == PT)
+                   w->cursor = orig_cursor;
+               }
            }
        }