]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bug #11261 with cursor movement in a continued line when header line is present.
authorEli Zaretskii <eliz@gnu.org>
Tue, 17 Apr 2012 15:25:17 +0000 (18:25 +0300)
committerEli Zaretskii <eliz@gnu.org>
Tue, 17 Apr 2012 15:25:17 +0000 (18:25 +0300)
 src/xdisp.c (string_buffer_position_lim): Limit starting position to BEGV.
 (set_cursor_from_row): If called for a mode-line or header-line
 row, return zero immediately.
 (try_cursor_movement): If inside continuation line, don't back up
 farther than the first row after the header line, if any.  Don't
 consider the header-line row as "partially visible", even if
 MATRIX_ROW_PARTIALLY_VISIBLE_P returns non-zero.

src/ChangeLog
src/xdisp.c

index 73c67125257ada1fcf0adde95d44484974fc7d70..42c582994cfe326b4c716631d58a1ea27e5acde9 100644 (file)
@@ -1,3 +1,14 @@
+2012-04-17  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (string_buffer_position_lim): Limit starting position to
+       BEGV.
+       (set_cursor_from_row): If called for a mode-line or header-line
+       row, return zero immediately.
+       (try_cursor_movement): If inside continuation line, don't back up
+       farther than the first row after the header line, if any.  Don't
+       consider the header-line row as "partially visible", even if
+       MATRIX_ROW_PARTIALLY_VISIBLE_P returns non-zero.  (Bug#11261)
+
 2012-04-13  Atsuo Ohki  <ohki@gssm.otsuka.tsukuba.ac.jp>  (tiny change)
 
        * lread.c (lisp_file_lexically_bound_p): Fix hang at ";-*-\n" (bug#11238).
index 61b0b9df5e1a6fdd6f822d0f1aafffa78e936333..9881adfa34d33ff221cb07e52f59653ea01b9eea 100644 (file)
@@ -4979,7 +4979,7 @@ string_buffer_position_lim (Lisp_Object string,
   Lisp_Object limit, prop, pos;
   int found = 0;
 
-  pos = make_number (from);
+  pos = make_number (max (from, BEGV));
 
   if (!back_p) /* looking forward */
     {
@@ -13690,6 +13690,13 @@ set_cursor_from_row (struct window *w, struct glyph_row *row,
      comes from a text property, not from an overlay.  */
   int string_from_text_prop = 0;
 
+  /* Don't even try doing anything if called for a mode-line or
+     header-line row, since the rest of the code isn't prepared to
+     deal with such calamities.  */
+  xassert (!row->mode_line_p);
+  if (row->mode_line_p)
+    return 0;
+
   /* Skip over glyphs not having an object at the start and the end of
      the row.  These are special glyphs like truncation marks on
      terminal frames.  */
@@ -14906,6 +14913,8 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, int *scroll_ste
          else if (rc != CURSOR_MOVEMENT_SUCCESS
                   && !NILP (BVAR (XBUFFER (w->buffer), bidi_display_reordering)))
            {
+             struct glyph_row *row1;
+
              /* If rows are bidi-reordered and point moved, back up
                 until we find a row that does not belong to a
                 continuation line.  This is because we must consider
@@ -14916,24 +14925,28 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, int *scroll_ste
              /* FIXME: Revisit this when glyph ``spilling'' in
                 continuation lines' rows is implemented for
                 bidi-reordered rows.  */
-             while (MATRIX_ROW_CONTINUATION_LINE_P (row))
+             for (row1 = MATRIX_FIRST_TEXT_ROW (w->current_matrix);
+                  MATRIX_ROW_CONTINUATION_LINE_P (row);
+                  --row)
                {
                  /* If we hit the beginning of the displayed portion
                     without finding the first row of a continued
                     line, give up.  */
-                 if (row <= w->current_matrix->rows)
+                 if (row <= row1)
                    {
                      rc = CURSOR_MOVEMENT_MUST_SCROLL;
                      break;
                    }
                  xassert (row->enabled_p);
-                 --row;
                }
            }
          if (must_scroll)
            ;
          else if (rc != CURSOR_MOVEMENT_SUCCESS
              && MATRIX_ROW_PARTIALLY_VISIBLE_P (w, row)
+             /* Make sure this isn't a header line by any chance, since
+                then MATRIX_ROW_PARTIALLY_VISIBLE_P might yield non-zero.  */
+             && !row->mode_line_p
              && make_cursor_line_fully_visible_p)
            {
              if (PT == MATRIX_ROW_END_CHARPOS (row)