Blob Blame History Raw
To: vim-dev@vim.org
Subject: Patch 7.2.042
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------

Patch 7.2.042
Problem:    When using winrestview() in a BufWinEnter autocommand the window
	    is scrolled anyway. (Matt Zyzik)
Solution:   Don't recompute topline when above 'scrolloff' from the bottom.
	    Don't always put the cursor halfway when entering a buffer.  Add
	    "w_topline_was_set".
Files:	    src/buffer.c, src/move.c, src/structs.h


*** ../vim-7.2.041/src/buffer.c	Sat Nov 15 14:10:23 2008
--- src/buffer.c	Sat Nov 15 14:58:52 2008
***************
*** 1401,1406 ****
--- 1401,1409 ----
      curwin->w_cursor.coladd = 0;
  #endif
      curwin->w_set_curswant = TRUE;
+ #ifdef FEAT_AUTOCMD
+     curwin->w_topline_was_set = FALSE;
+ #endif
  
      /* Make sure the buffer is loaded. */
      if (curbuf->b_ml.ml_mfp == NULL)	/* need to load the file */
***************
*** 1440,1446 ****
      maketitle();
  #endif
  #ifdef FEAT_AUTOCMD
!     if (curwin->w_topline == 1)		/* when autocmds didn't change it */
  #endif
  	scroll_cursor_halfway(FALSE);	/* redisplay at correct position */
  
--- 1443,1450 ----
      maketitle();
  #endif
  #ifdef FEAT_AUTOCMD
! 	/* when autocmds didn't change it */
!     if (curwin->w_topline == 1 && !curwin->w_topline_was_set)
  #endif
  	scroll_cursor_halfway(FALSE);	/* redisplay at correct position */
  
*** ../vim-7.2.041/src/move.c	Sun Jul 13 19:25:23 2008
--- src/move.c	Sat Nov 15 14:56:47 2008
***************
*** 280,297 ****
  
  	if (curwin->w_botline <= curbuf->b_ml.ml_line_count)
  	{
! 	    if (curwin->w_cursor.lnum < curwin->w_botline
! 		    && ((long)curwin->w_cursor.lnum
  					     >= (long)curwin->w_botline - p_so
  #ifdef FEAT_FOLDING
  			|| hasAnyFolding(curwin)
  #endif
  			))
! 	    {
  		lineoff_T	loff;
  
! 		/* Cursor is above botline, check if there are 'scrolloff'
! 		 * window lines below the cursor.  If not, need to scroll. */
  		n = curwin->w_empty_rows;
  		loff.lnum = curwin->w_cursor.lnum;
  #ifdef FEAT_FOLDING
--- 280,299 ----
  
  	if (curwin->w_botline <= curbuf->b_ml.ml_line_count)
  	{
! 	    if (curwin->w_cursor.lnum < curwin->w_botline)
! 	    {
! 	      if (((long)curwin->w_cursor.lnum
  					     >= (long)curwin->w_botline - p_so
  #ifdef FEAT_FOLDING
  			|| hasAnyFolding(curwin)
  #endif
  			))
! 	      {
  		lineoff_T	loff;
  
! 		/* Cursor is (a few lines) above botline, check if there are
! 		 * 'scrolloff' window lines below the cursor.  If not, need to
! 		 * scroll. */
  		n = curwin->w_empty_rows;
  		loff.lnum = curwin->w_cursor.lnum;
  #ifdef FEAT_FOLDING
***************
*** 317,322 ****
--- 319,328 ----
  		if (n >= p_so)
  		    /* sufficient context, no need to scroll */
  		    check_botline = FALSE;
+ 	      }
+ 	      else
+ 		  /* sufficient context, no need to scroll */
+ 		  check_botline = FALSE;
  	    }
  	    if (check_botline)
  	    {
***************
*** 509,514 ****
--- 515,523 ----
      /* Approximate the value of w_botline */
      wp->w_botline += lnum - wp->w_topline;
      wp->w_topline = lnum;
+ #ifdef FEAT_AUTOCMD
+     wp->w_topline_was_set = TRUE;
+ #endif
  #ifdef FEAT_DIFF
      wp->w_topfill = 0;
  #endif
*** ../vim-7.2.041/src/structs.h	Sun Nov  9 13:43:25 2008
--- src/structs.h	Sat Nov 15 14:56:42 2008
***************
*** 1784,1793 ****
  #endif
  
      /*
!      * The next three specify the offsets for displaying the buffer:
       */
      linenr_T	w_topline;	    /* buffer line number of the line at the
  				       top of the window */
  #ifdef FEAT_DIFF
      int		w_topfill;	    /* number of filler lines above w_topline */
      int		w_old_topfill;	    /* w_topfill at last redraw */
--- 1784,1798 ----
  #endif
  
      /*
!      * "w_topline", "w_leftcol" and "w_skipcol" specify the offsets for
!      * displaying the buffer.
       */
      linenr_T	w_topline;	    /* buffer line number of the line at the
  				       top of the window */
+ #ifdef FEAT_AUTOCMD
+     char	w_topline_was_set;  /* flag set to TRUE when topline is set,
+ 				       e.g. by winrestview() */
+ #endif
  #ifdef FEAT_DIFF
      int		w_topfill;	    /* number of filler lines above w_topline */
      int		w_old_topfill;	    /* w_topfill at last redraw */
*** ../vim-7.2.041/src/version.c	Sat Nov 15 14:10:23 2008
--- src/version.c	Sat Nov 15 16:01:29 2008
***************
*** 678,679 ****
--- 678,681 ----
  {   /* Add new patch number below this line */
+ /**/
+     42,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
261. You find diskettes in your pockets when doing laundry.

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///