To:
[email protected]
Subject: Patch 6.3b.007
Fcc: outbox
From: Bram Moolenaar <
[email protected]>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
Patch 6.3b.007
Problem: Session file doesn't restore view on windows properly. (Robert
Webb)
Solution: Restore window sizes both before and after restoring the view, so
that the view, cursor position and size are restored properly.
Files: src/ex_docmd.c
*** ../vim-6.3b.006/src/ex_docmd.c Sun May 16 22:38:42 2004
--- src/ex_docmd.c Wed May 26 17:44:00 2004
***************
*** 8544,8549 ****
--- 8547,8553 ----
#endif
#ifdef FEAT_SESSION
+ static int ses_winsizes __ARGS((FILE *fd, int restore_size));
static int ses_win_rec __ARGS((FILE *fd, frame_T *fr));
static frame_T *ses_skipframe __ARGS((frame_T *fr));
static int ses_do_frame __ARGS((frame_T *fr));
***************
*** 8714,8722 ****
--- 8718,8730 ----
* If more than one window, see if sizes can be restored.
* First set 'winheight' and 'winwidth' to 1 to avoid the windows being
* resized when moving between windows.
+ * Do this before restoring the view, so that the topline and the cursor
+ * can be set. This is done again below.
*/
if (put_line(fd, "set winheight=1 winwidth=1") == FAIL)
return FAIL;
+ if (nr > 1 && ses_winsizes(fd, restore_size) == FAIL)
+ return FAIL;
/*
* Restore the view of the window (options, file, cursor, etc.).
***************
*** 8738,8781 ****
return FAIL;
/*
! * Restore window sizes. Do this after jumping around in windows, because
! * the current window has a minimum size while others may not.
*/
! if (nr > 1)
! {
! if (restore_size && (ssop_flags & SSOP_WINSIZE))
! {
! int n = 0;
!
! for (wp = firstwin; wp != NULL; wp = wp->w_next)
! {
! if (!ses_do_win(wp))
! continue;
! ++n;
!
! /* restore height when not full height */
! if (wp->w_height + wp->w_status_height < topframe->fr_height
! && (fprintf(fd,
! "exe '%dresize ' . ((&lines * %ld + %ld) / %ld)",
! n, (long)wp->w_height, Rows / 2, Rows) < 0
! || put_eol(fd) == FAIL))
! return FAIL;
!
! /* restore width when not full width */
! if (wp->w_width < Columns && (fprintf(fd,
! "exe 'vert %dresize ' . ((&columns * %ld + %ld) / %ld)",
! n, (long)wp->w_width, Columns / 2, Columns) < 0
! || put_eol(fd) == FAIL))
! return FAIL;
! }
! }
! else
! {
! /* Just equalise window sizes */
! if (put_line(fd, "wincmd =") == FAIL)
! return FAIL;
! }
! }
/* Re-apply 'winheight', 'winwidth' and 'shortmess'. */
if (fprintf(fd, "set winheight=%ld winwidth=%ld shortmess=%s",
--- 8746,8756 ----
return FAIL;
/*
! * Restore window sizes again after jumping around in windows, because the
! * current window has a minimum size while others may not.
*/
! if (nr > 1 && ses_winsizes(fd, restore_size) == FAIL)
! return FAIL;
/* Re-apply 'winheight', 'winwidth' and 'shortmess'. */
if (fprintf(fd, "set winheight=%ld winwidth=%ld shortmess=%s",
***************
*** 8791,8796 ****
--- 8766,8812 ----
|| put_line(fd, "endif") == FAIL)
return FAIL;
+ return OK;
+ }
+
+ static int
+ ses_winsizes(fd, restore_size)
+ FILE *fd;
+ int restore_size;
+ {
+ int n = 0;
+ win_T *wp;
+
+ if (restore_size && (ssop_flags & SSOP_WINSIZE))
+ {
+ for (wp = firstwin; wp != NULL; wp = wp->w_next)
+ {
+ if (!ses_do_win(wp))
+ continue;
+ ++n;
+
+ /* restore height when not full height */
+ if (wp->w_height + wp->w_status_height < topframe->fr_height
+ && (fprintf(fd,
+ "exe '%dresize ' . ((&lines * %ld + %ld) / %ld)",
+ n, (long)wp->w_height, Rows / 2, Rows) < 0
+ || put_eol(fd) == FAIL))
+ return FAIL;
+
+ /* restore width when not full width */
+ if (wp->w_width < Columns && (fprintf(fd,
+ "exe 'vert %dresize ' . ((&columns * %ld + %ld) / %ld)",
+ n, (long)wp->w_width, Columns / 2, Columns) < 0
+ || put_eol(fd) == FAIL))
+ return FAIL;
+ }
+ }
+ else
+ {
+ /* Just equalise window sizes */
+ if (put_line(fd, "wincmd =") == FAIL)
+ return FAIL;
+ }
return OK;
}
*** ../vim-6.3b.006/src/version.c Wed May 26 17:17:08 2004
--- src/version.c Wed May 26 18:32:17 2004
***************
*** 643,644 ****
--- 643,646 ----
{ /* Add new patch number below this line */
+ /**/
+ 7,
/**/
--
If your company is not involved in something called "ISO 9000" you probably
have no idea what it is. If your company _is_ involved in ISO 9000 then you
definitely have no idea what it is.
(Scott Adams - The Dilbert principle)
/// Bram Moolenaar --
[email protected] --
http://www.Moolenaar.net \\\
/// Sponsor Vim, vote for features --
http://www.Vim.org/sponsor/ \\\
\\\ Project leader for A-A-P --
http://www.A-A-P.org ///
\\\ Buy at Amazon and help AIDS victims --
http://ICCF.nl/click1.html ///