changeset 96619:029de4e224b6

(Fvertical_motion): Restore hscroll before moving to goal column.
author Chong Yidong <cyd@stupidchicken.com>
date Sat, 12 Jul 2008 03:19:38 +0000
parents 44d71ca880f5
children 3bea8ede5bd0
files src/indent.c
diffstat 1 files changed, 16 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/indent.c	Sat Jul 12 03:19:25 2008 +0000
+++ b/src/indent.c	Sat Jul 12 03:19:38 2008 +0000
@@ -2055,12 +2055,11 @@
     }
   else
     {
-      int it_start;
-      int oselective;
-      int it_overshoot_expected;
+      int it_start, oselective, it_overshoot_expected, first_x;
 
       SET_TEXT_POS (pt, PT, PT_BYTE);
       start_display (&it, w, pt);
+      first_x = it.first_visible_x;
 
       /* Scan from the start of the line containing PT.  If we don't
 	 do this, we start moving with IT->current_x == 0, while PT is
@@ -2118,11 +2117,21 @@
       if (XINT (lines) >= 0 || IT_CHARPOS (it) > 0)
 	move_it_by_lines (&it, XINT (lines), 0);
 
+      /* Move to the goal column, if one was specified.  */
       if (!NILP (lcols))
-	move_it_in_display_line
-	  (&it, ZV,
-	   (int)(cols * FRAME_COLUMN_WIDTH (XFRAME (w->frame)) + 0.5),
-	   MOVE_TO_X);
+	{
+	  /* If the window was originally hscrolled, move forward by
+	     the hscrolled amount first.  */
+	  if (first_x > 0)
+	    {
+	      move_it_in_display_line (&it, ZV, first_x, MOVE_TO_X);
+	      it.current_x = 0;
+	    }
+	  move_it_in_display_line
+	    (&it, ZV,
+	     (int)(cols * FRAME_COLUMN_WIDTH (XFRAME (w->frame)) + 0.5),
+	     MOVE_TO_X);
+	}
 
       SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it));
     }