GNU bug report logs - #11261
24.1.50; cursor doesn't move in a long line

Previous Next

Package: emacs;

Reported by: Katsumi Yamaoka <yamaoka <at> jpl.org>

Date: Mon, 16 Apr 2012 23:42:02 UTC

Severity: normal

Found in version 24.1.50

Done: Eli Zaretskii <eliz <at> gnu.org>

Bug is archived. No further changes may be made.

Full log


Message #13 received at 11261-done <at> debbugs.gnu.org (full text, mbox):

From: Eli Zaretskii <eliz <at> gnu.org>
To: yamaoka <at> jpl.org
Cc: 11261-done <at> debbugs.gnu.org
Subject: Re: bug#11261: 24.1.50; cursor doesn't move in a long line
Date: Tue, 17 Apr 2012 18:29:22 +0300
> Date: Tue, 17 Apr 2012 05:56:52 +0300
> From: Eli Zaretskii <eliz <at> gnu.org>
> Cc: 11261 <at> debbugs.gnu.org
> 
> > Date: Tue, 17 Apr 2012 08:40:40 +0900
> > From: Katsumi Yamaoka <yamaoka <at> jpl.org>
> > 
> > (let ((fox "The quick brown fox jumps over the lazy dog."))
> >   (pop-to-buffer "*testing*")
> >   (erase-buffer)
> >   (setq header-line-format fox)
> >   (dotimes (var 1000)
> >     (insert fox "  "))
> >   (goto-char (point-min))
> >   (search-forward "fox" nil t 500))
> > 
> > Could this be fixed?
> 
> This is a clear regression, so I will look into it ASAP.

Fixed in revision 107846 on the emacs-24 branch.  The patch is below,
if you don't want to wait for the next pretest.

Thanks.

=== modified file 'src/ChangeLog'
--- src/ChangeLog	2012-04-13 18:08:18 +0000
+++ src/ChangeLog	2012-04-17 15:25:17 +0000
@@ -1,3 +1,14 @@
+2012-04-17  Eli Zaretskii  <eliz <at> 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 <at> gssm.otsuka.tsukuba.ac.jp>  (tiny change)
 
 	* lread.c (lisp_file_lexically_bound_p): Fix hang at ";-*-\n" (bug#11238).

=== modified file 'src/xdisp.c'
--- src/xdisp.c	2012-04-09 12:46:34 +0000
+++ src/xdisp.c	2012-04-17 15:25:17 +0000
@@ -4979,7 +4979,7 @@ string_buffer_position_lim (Lisp_Object 
   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, s
      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,
 	  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,
 	      /* 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)





This bug report was last modified 13 years and 90 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.