]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix cursor motion with long continued lines near window bottom.
authorEli Zaretskii <eliz@gnu.org>
Thu, 25 Aug 2011 16:33:16 +0000 (19:33 +0300)
committerEli Zaretskii <eliz@gnu.org>
Thu, 25 Aug 2011 16:33:16 +0000 (19:33 +0300)
 src/xdisp.c (try_cursor_movement): Check for the need to scroll more
 accurately, and prefer exact match for point under bidi.

src/ChangeLog
src/xdisp.c

index b2f2334427cfe06fdb2811652ce25b4aefb26eb4..1176c9254eaaea56844f27b8bc485e0d29a4dbe6 100644 (file)
@@ -7,6 +7,8 @@
        (handle_single_display_spec): If the display spec is of the form
        `(space ...)', and specifies display in the text area, return 2
        rather than 1.
+       (try_cursor_movement): Check for the need to scroll more
+       accurately, and prefer exact match for point under bidi.
 
        * dispextern.h (struct bidi_it): Rename the disp_prop_p member
        into disp_prop; all users changed.
index 5cbc7747f2f7b7a2cc61416ef9afb13024702eb9..55bbb7cf62ed889aaae1f95b3c442db48183cb03 100644 (file)
@@ -14593,15 +14593,33 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, int *scroll_ste
 
              do
                {
+                 int at_zv_p = 0, exact_match_p = 0;
+
                  if (MATRIX_ROW_START_CHARPOS (row) <= PT
                      && PT <= MATRIX_ROW_END_CHARPOS (row)
                      && cursor_row_p (row))
                    rv |= set_cursor_from_row (w, row, w->current_matrix,
                                               0, 0, 0, 0);
-                 /* As soon as we've found the first suitable row
-                    whose ends_at_zv_p flag is set, we are done.  */
-                 if (rv
-                     && MATRIX_ROW (w->current_matrix, w->cursor.vpos)->ends_at_zv_p)
+                 /* As soon as we've found the exact match for point,
+                    or the first suitable row whose ends_at_zv_p flag
+                    is set, we are done.  */
+                 at_zv_p =
+                   MATRIX_ROW (w->current_matrix, w->cursor.vpos)->ends_at_zv_p;
+                 if (!at_zv_p)
+                   {
+                     struct glyph_row *candidate =
+                       MATRIX_ROW (w->current_matrix, w->cursor.vpos);
+                     struct glyph *g =
+                       candidate->glyphs[TEXT_AREA] + w->cursor.hpos;
+                     EMACS_INT endpos = MATRIX_ROW_END_CHARPOS (candidate);
+
+                     exact_match_p =
+                       (BUFFERP (g->object) && g->charpos == PT)
+                       || (INTEGERP (g->object)
+                           && (g->charpos == PT
+                               || (g->charpos == 0 && endpos - 1 == PT)));
+                   }
+                 if (rv && (at_zv_p || exact_match_p))
                    {
                      rc = CURSOR_MOVEMENT_SUCCESS;
                      break;
@@ -14617,7 +14635,9 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, int *scroll_ste
                 loop before all the candidates were examined, signal
                 to the caller that this method failed.  */
              if (rc != CURSOR_MOVEMENT_SUCCESS
-                 && (!rv || MATRIX_ROW_CONTINUATION_LINE_P (row)))
+                 && !(rv
+                      && !MATRIX_ROW_CONTINUATION_LINE_P (row)
+                      && !row->continued_p))
                rc = CURSOR_MOVEMENT_MUST_SCROLL;
              else if (rv)
                rc = CURSOR_MOVEMENT_SUCCESS;