From: Eli Zaretskii Date: Thu, 31 Dec 2009 20:56:07 +0000 (-0500) Subject: Retrospective commit from 2009-08-29. X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~438^2~635^2~60 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=a88bbf05709b0ac38669479a80465f7334fa62b2;p=emacs.git Retrospective commit from 2009-08-29. 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 : Default to L2R, for now. --- diff --git a/src/ChangeLog.bidi b/src/ChangeLog.bidi index eab5642cb14..c36ab231fa8 100644 --- a/src/ChangeLog.bidi +++ b/src/ChangeLog.bidi @@ -1,3 +1,15 @@ +2009-08-29 Eli Zaretskii + + * 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 + + * bidi.c : Default to L2R, + for now. + 2009-08-22 Eli Zaretskii * bidi.c (bidi_initialize): staticpro bidi_char_table. diff --git a/src/bidi.c b/src/bidi.c index 697909ae8be..e558b732f40 100644 --- a/src/bidi.c +++ b/src/bidi.c @@ -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) \ diff --git a/src/xdisp.c b/src/xdisp.c index bd9300a40a2..54ac640da64 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -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; + } } }