home *** CD-ROM | disk | FTP | other *** search
- To: vim-dev@vim.org
- Subject: Patch 7.2.203
- Fcc: outbox
- From: Bram Moolenaar <Bram@moolenaar.net>
- Mime-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- ------------
-
- Patch 7.2.203
- Problem: When reloading a buffer or doing anything else with a buffer that
- is not displayed in a visible window, autocommands may be applied
- to the current window, folds messed up, etc.
- Solution: Instead of using the current window for the hidden buffer use a
- special window, splitting the current one temporarily.
- Files: src/fileio.c, src/globals.h, src/gui.c, src/if_perl.xs,
- src/proto/gui.pro, src/proto/window.pro, src/screen.c,
- src/structs.h, src/window.c
-
-
- *** ../vim-7.2.202/src/fileio.c 2009-06-16 15:35:46.000000000 +0200
- --- src/fileio.c 2009-06-11 21:22:37.000000000 +0200
- ***************
- *** 8365,8371 ****
-
- /* Execute the modeline settings, but don't set window-local
- * options if we are using the current window for another buffer. */
- ! do_modelines(aco.save_curwin == NULL ? OPT_NOWIN : 0);
-
- /* restore the current window */
- aucmd_restbuf(&aco);
- --- 8365,8371 ----
-
- /* Execute the modeline settings, but don't set window-local
- * options if we are using the current window for another buffer. */
- ! do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
-
- /* restore the current window */
- aucmd_restbuf(&aco);
- ***************
- *** 8381,8388 ****
-
- /*
- * Prepare for executing autocommands for (hidden) buffer "buf".
- ! * Search a window for the current buffer. Save the cursor position and
- ! * screen offset.
- * Set "curbuf" and "curwin" to match "buf".
- * When FEAT_AUTOCMD is not defined another version is used, see below.
- */
- --- 8381,8388 ----
-
- /*
- * Prepare for executing autocommands for (hidden) buffer "buf".
- ! * Search for a visible window containing the current buffer. If there isn't
- ! * one then use "aucmd_win".
- * Set "curbuf" and "curwin" to match "buf".
- * When FEAT_AUTOCMD is not defined another version is used, see below.
- */
- ***************
- *** 8392,8399 ****
- buf_T *buf; /* new curbuf */
- {
- win_T *win;
- !
- ! aco->new_curbuf = buf;
-
- /* Find a window that is for the new buffer */
- if (buf == curbuf) /* be quick when buf is curbuf */
- --- 8392,8400 ----
- buf_T *buf; /* new curbuf */
- {
- win_T *win;
- ! #ifdef FEAT_WINDOWS
- ! int save_ea;
- ! #endif
-
- /* Find a window that is for the new buffer */
- if (buf == curbuf) /* be quick when buf is curbuf */
- ***************
- *** 8407,8448 ****
- win = NULL;
- #endif
-
- ! /*
- ! * Prefer to use an existing window for the buffer, it has the least side
- ! * effects (esp. if "buf" is curbuf).
- ! * Otherwise, use curwin for "buf". It might make some items in the
- ! * window invalid. At least save the cursor and topline.
- ! */
- if (win != NULL)
- {
- ! /* there is a window for "buf", make it the curwin */
- ! aco->save_curwin = curwin;
- curwin = win;
- - aco->save_buf = win->w_buffer;
- - aco->new_curwin = win;
- }
- else
- {
- ! /* there is no window for "buf", use curwin */
- ! aco->save_curwin = NULL;
- ! aco->save_buf = curbuf;
- ! --curbuf->b_nwindows;
- curwin->w_buffer = buf;
- ++buf->b_nwindows;
-
- ! /* save cursor and topline, set them to safe values */
- ! aco->save_cursor = curwin->w_cursor;
- ! curwin->w_cursor.lnum = 1;
- ! curwin->w_cursor.col = 0;
- ! aco->save_topline = curwin->w_topline;
- ! curwin->w_topline = 1;
- ! #ifdef FEAT_DIFF
- ! aco->save_topfill = curwin->w_topfill;
- ! curwin->w_topfill = 0;
- #endif
- }
- -
- curbuf = buf;
- }
-
- /*
- --- 8408,8460 ----
- win = NULL;
- #endif
-
- ! /* Allocate "aucmd_win" when needed. If this fails (out of memory) fall
- ! * back to using the current window. */
- ! if (win == NULL && aucmd_win == NULL)
- ! {
- ! win_alloc_aucmd_win();
- ! if (aucmd_win == NULL)
- ! win = curwin;
- ! }
- !
- ! aco->save_curwin = curwin;
- ! aco->save_curbuf = curbuf;
- if (win != NULL)
- {
- ! /* There is a window for "buf" in the current tab page, make it the
- ! * curwin. This is preferred, it has the least side effects (esp. if
- ! * "buf" is curbuf). */
- curwin = win;
- }
- else
- {
- ! /* There is no window for "buf", use "aucmd_win". To minimize the side
- ! * effects, insert it in a the current tab page.
- ! * Anything related to a window (e.g., setting folds) may have
- ! * unexpected results. */
- ! curwin = aucmd_win;
- curwin->w_buffer = buf;
- ++buf->b_nwindows;
-
- ! #ifdef FEAT_WINDOWS
- ! /* Split the current window, put the aucmd_win in the upper half. */
- ! make_snapshot(SNAP_AUCMD_IDX);
- ! save_ea = p_ea;
- ! p_ea = FALSE;
- ! (void)win_split_ins(0, WSP_TOP, aucmd_win, 0);
- ! (void)win_comp_pos(); /* recompute window positions */
- ! p_ea = save_ea;
- ! #endif
- ! /* set cursor and topline to safe values */
- ! curwin_init();
- ! #ifdef FEAT_VERTSPLIT
- ! curwin->w_wincol = 0;
- ! curwin->w_width = Columns;
- #endif
- }
- curbuf = buf;
- + aco->new_curwin = curwin;
- + aco->new_curbuf = curbuf;
- }
-
- /*
- ***************
- *** 8454,8474 ****
- aucmd_restbuf(aco)
- aco_save_T *aco; /* structure holding saved values */
- {
- ! if (aco->save_curwin != NULL)
- {
- /* restore curwin */
- #ifdef FEAT_WINDOWS
- if (win_valid(aco->save_curwin))
- #endif
- {
- ! /* restore the buffer which was previously edited by curwin, if
- ! * it's still the same window and it's valid */
- if (curwin == aco->new_curwin
- ! && buf_valid(aco->save_buf)
- ! && aco->save_buf->b_ml.ml_mfp != NULL)
- {
- --curbuf->b_nwindows;
- ! curbuf = aco->save_buf;
- curwin->w_buffer = curbuf;
- ++curbuf->b_nwindows;
- }
- --- 8466,8551 ----
- aucmd_restbuf(aco)
- aco_save_T *aco; /* structure holding saved values */
- {
- ! #ifdef FEAT_WINDOWS
- ! int dummy;
- ! #endif
- !
- ! if (aco->new_curwin == aucmd_win)
- ! {
- ! --curbuf->b_nwindows;
- ! #ifdef FEAT_WINDOWS
- ! /* Find "aucmd_win", it can't be closed, but it may be in another tab
- ! * page. */
- ! if (curwin != aucmd_win)
- ! {
- ! tabpage_T *tp;
- ! win_T *wp;
- !
- ! FOR_ALL_TAB_WINDOWS(tp, wp)
- ! {
- ! if (wp == aucmd_win)
- ! {
- ! if (tp != curtab)
- ! goto_tabpage_tp(tp);
- ! win_goto(aucmd_win);
- ! break;
- ! }
- ! }
- ! }
- !
- ! /* Remove the window and frame from the tree of frames. */
- ! (void)winframe_remove(curwin, &dummy, NULL);
- ! win_remove(curwin, NULL);
- ! last_status(FALSE); /* may need to remove last status line */
- ! restore_snapshot(SNAP_AUCMD_IDX, FALSE);
- ! (void)win_comp_pos(); /* recompute window positions */
- !
- ! if (win_valid(aco->save_curwin))
- ! curwin = aco->save_curwin;
- ! else
- ! /* Hmm, original window disappeared. Just use the first one. */
- ! curwin = firstwin;
- ! # ifdef FEAT_EVAL
- ! vars_clear(&aucmd_win->w_vars.dv_hashtab); /* free all w: variables */
- ! # endif
- ! #else
- ! curwin = aco->save_curwin;
- ! #endif
- ! curbuf = curwin->w_buffer;
- !
- ! /* the buffer contents may have changed */
- ! check_cursor();
- ! if (curwin->w_topline > curbuf->b_ml.ml_line_count)
- ! {
- ! curwin->w_topline = curbuf->b_ml.ml_line_count;
- ! #ifdef FEAT_DIFF
- ! curwin->w_topfill = 0;
- ! #endif
- ! }
- ! #if defined(FEAT_GUI)
- ! /* Hide the scrollbars from the aucmd_win and update. */
- ! gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_LEFT], FALSE);
- ! gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_RIGHT], FALSE);
- ! gui_may_update_scrollbars();
- ! #endif
- ! }
- ! else
- {
- /* restore curwin */
- #ifdef FEAT_WINDOWS
- if (win_valid(aco->save_curwin))
- #endif
- {
- ! /* Restore the buffer which was previously edited by curwin, if
- ! * it was chagned, we are still the same window and the buffer is
- ! * valid. */
- if (curwin == aco->new_curwin
- ! && curbuf != aco->new_curbuf
- ! && buf_valid(aco->new_curbuf)
- ! && aco->new_curbuf->b_ml.ml_mfp != NULL)
- {
- --curbuf->b_nwindows;
- ! curbuf = aco->new_curbuf;
- curwin->w_buffer = curbuf;
- ++curbuf->b_nwindows;
- }
- ***************
- *** 8477,8510 ****
- curbuf = curwin->w_buffer;
- }
- }
- - else
- - {
- - /* restore buffer for curwin if it still exists and is loaded */
- - if (buf_valid(aco->save_buf) && aco->save_buf->b_ml.ml_mfp != NULL)
- - {
- - --curbuf->b_nwindows;
- - curbuf = aco->save_buf;
- - curwin->w_buffer = curbuf;
- - ++curbuf->b_nwindows;
- - curwin->w_cursor = aco->save_cursor;
- - check_cursor();
- - /* check topline < line_count, in case lines got deleted */
- - if (aco->save_topline <= curbuf->b_ml.ml_line_count)
- - {
- - curwin->w_topline = aco->save_topline;
- - #ifdef FEAT_DIFF
- - curwin->w_topfill = aco->save_topfill;
- - #endif
- - }
- - else
- - {
- - curwin->w_topline = curbuf->b_ml.ml_line_count;
- - #ifdef FEAT_DIFF
- - curwin->w_topfill = 0;
- - #endif
- - }
- - }
- - }
- }
-
- static int autocmd_nested = FALSE;
- --- 8554,8559 ----
- ***************
- *** 9419,9427 ****
- aco_save_T *aco; /* structure to save values in */
- buf_T *buf; /* new curbuf */
- {
- ! aco->save_buf = curbuf;
- curbuf = buf;
- curwin->w_buffer = buf;
- }
-
- /*
- --- 9468,9478 ----
- aco_save_T *aco; /* structure to save values in */
- buf_T *buf; /* new curbuf */
- {
- ! aco->save_curbuf = curbuf;
- ! --curbuf->b_nwindows;
- curbuf = buf;
- curwin->w_buffer = buf;
- + ++curbuf->b_nwindows;
- }
-
- /*
- ***************
- *** 9432,9439 ****
- aucmd_restbuf(aco)
- aco_save_T *aco; /* structure holding saved values */
- {
- ! curbuf = aco->save_buf;
- curwin->w_buffer = curbuf;
- }
-
- #endif /* FEAT_AUTOCMD */
- --- 9483,9492 ----
- aucmd_restbuf(aco)
- aco_save_T *aco; /* structure holding saved values */
- {
- ! --curbuf->b_nwindows;
- ! curbuf = aco->save_curbuf;
- curwin->w_buffer = curbuf;
- + ++curbuf->b_nwindows;
- }
-
- #endif /* FEAT_AUTOCMD */
- *** ../vim-7.2.202/src/globals.h 2009-06-16 15:23:07.000000000 +0200
- --- src/globals.h 2009-06-12 21:10:30.000000000 +0200
- ***************
- *** 539,544 ****
- --- 539,548 ----
-
- EXTERN win_T *curwin; /* currently active window */
-
- + #ifdef FEAT_AUTOCMD
- + EXTERN win_T *aucmd_win; /* window used in aucmd_prepbuf() */
- + #endif
- +
- /*
- * The window layout is kept in a tree of frames. topframe points to the top
- * of the tree.
- *** ../vim-7.2.202/src/gui.c 2009-05-21 23:25:38.000000000 +0200
- --- src/gui.c 2009-06-11 20:58:05.000000000 +0200
- ***************
- *** 3879,3884 ****
- --- 3879,3899 ----
- * Scrollbar stuff:
- */
-
- + /*
- + * Called when something in the window layout has changed.
- + */
- + void
- + gui_may_update_scrollbars()
- + {
- + if (gui.in_use && starting == 0)
- + {
- + out_flush();
- + gui_init_which_components(NULL);
- + gui_update_scrollbars(TRUE);
- + }
- + need_mouse_correct = TRUE;
- + }
- +
- void
- gui_update_scrollbars(force)
- int force; /* Force all scrollbars to get updated */
- *** ../vim-7.2.202/src/if_perl.xs 2008-12-03 13:18:16.000000000 +0100
- --- src/if_perl.xs 2009-06-03 17:52:51.000000000 +0200
- ***************
- *** 1234,1240 ****
- {
- ml_delete(lnum, 0);
- deleted_lines_mark(lnum, 1L);
- ! if (aco.save_buf == curbuf)
- check_cursor();
- }
-
- --- 1236,1242 ----
- {
- ml_delete(lnum, 0);
- deleted_lines_mark(lnum, 1L);
- ! if (aco.save_curbuf == curbuf)
- check_cursor();
- }
-
- *** ../vim-7.2.202/src/proto/gui.pro 2007-05-05 19:42:19.000000000 +0200
- --- src/proto/gui.pro 2009-06-11 20:58:08.000000000 +0200
- ***************
- *** 43,48 ****
- --- 43,49 ----
- void gui_create_scrollbar __ARGS((scrollbar_T *sb, int type, win_T *wp));
- scrollbar_T *gui_find_scrollbar __ARGS((long ident));
- void gui_drag_scrollbar __ARGS((scrollbar_T *sb, long value, int still_dragging));
- + void gui_may_update_scrollbars __ARGS((void));
- void gui_update_scrollbars __ARGS((int force));
- int gui_do_scroll __ARGS((void));
- int gui_do_horiz_scroll __ARGS((void));
- *** ../vim-7.2.202/src/proto/window.pro 2007-07-26 22:57:45.000000000 +0200
- --- src/proto/window.pro 2009-06-10 21:20:39.000000000 +0200
- ***************
- *** 1,6 ****
- --- 1,7 ----
- /* window.c */
- void do_window __ARGS((int nchar, long Prenum, int xchar));
- int win_split __ARGS((int size, int flags));
- + int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
- int win_valid __ARGS((win_T *win));
- int win_count __ARGS((void));
- int make_windows __ARGS((int count, int vertical));
- ***************
- *** 10,18 ****
- --- 11,21 ----
- void win_close __ARGS((win_T *win, int free_buf));
- void win_close_othertab __ARGS((win_T *win, int free_buf, tabpage_T *tp));
- void win_free_all __ARGS((void));
- + win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp));
- void close_others __ARGS((int message, int forceit));
- void curwin_init __ARGS((void));
- int win_alloc_first __ARGS((void));
- + void win_alloc_aucmd_win __ARGS((void));
- void win_init_size __ARGS((void));
- void free_tabpage __ARGS((tabpage_T *tp));
- int win_new_tabpage __ARGS((int after));
- ***************
- *** 30,35 ****
- --- 33,40 ----
- void win_enter __ARGS((win_T *wp, int undo_sync));
- win_T *buf_jump_open_win __ARGS((buf_T *buf));
- win_T *buf_jump_open_tab __ARGS((buf_T *buf));
- + void win_append __ARGS((win_T *after, win_T *wp));
- + void win_remove __ARGS((win_T *wp, tabpage_T *tp));
- int win_alloc_lines __ARGS((win_T *wp));
- void win_free_lsize __ARGS((win_T *wp));
- void shell_new_rows __ARGS((void));
- ***************
- *** 58,63 ****
- --- 63,70 ----
- int min_rows __ARGS((void));
- int only_one_window __ARGS((void));
- void check_lnums __ARGS((int do_curwin));
- + void make_snapshot __ARGS((int idx));
- + void restore_snapshot __ARGS((int idx, int close_curwin));
- int win_hasvertsplit __ARGS((void));
- int match_add __ARGS((win_T *wp, char_u *grp, char_u *pat, int prio, int id));
- int match_delete __ARGS((win_T *wp, int id, int perr));
- *** ../vim-7.2.202/src/screen.c 2009-05-17 13:30:58.000000000 +0200
- --- src/screen.c 2009-06-10 16:41:45.000000000 +0200
- ***************
- *** 7495,7500 ****
- --- 7495,7504 ----
- #endif
- }
- }
- + #ifdef FEAT_AUTOCMD
- + if (aucmd_win != NULL && win_alloc_lines(aucmd_win) == FAIL)
- + outofmem = TRUE;
- + #endif
- #ifdef FEAT_WINDOWS
- give_up:
- #endif
- *** ../vim-7.2.202/src/structs.h 2009-05-16 16:36:25.000000000 +0200
- --- src/structs.h 2009-06-13 12:51:56.000000000 +0200
- ***************
- *** 1621,1626 ****
- --- 1621,1634 ----
- };
- #endif
-
- + #define SNAP_HELP_IDX 0
- + #ifdef FEAT_AUTOCMD
- + # define SNAP_AUCMD_IDX 1
- + # define SNAP_COUNT 2
- + #else
- + # define SNAP_COUNT 1
- + #endif
- +
- /*
- * Tab pages point to the top frame of each tab page.
- * Note: Most values are NOT valid for the current tab page! Use "curwin",
- ***************
- *** 1649,1655 ****
- buf_T *(tp_diffbuf[DB_COUNT]);
- int tp_diff_invalid; /* list of diffs is outdated */
- #endif
- ! frame_T *tp_snapshot; /* window layout snapshot */
- #ifdef FEAT_EVAL
- dictitem_T tp_winvar; /* variable for "t:" Dictionary */
- dict_T tp_vars; /* internal variables, local to tab page */
- --- 1657,1663 ----
- buf_T *(tp_diffbuf[DB_COUNT]);
- int tp_diff_invalid; /* list of diffs is outdated */
- #endif
- ! frame_T *(tp_snapshot[SNAP_COUNT]); /* window layout snapshots */
- #ifdef FEAT_EVAL
- dictitem_T tp_winvar; /* variable for "t:" Dictionary */
- dict_T tp_vars; /* internal variables, local to tab page */
- ***************
- *** 2276,2291 ****
- */
- typedef struct
- {
- ! buf_T *save_buf; /* saved curbuf */
- #ifdef FEAT_AUTOCMD
- ! buf_T *new_curbuf; /* buffer to be used */
- ! win_T *save_curwin; /* saved curwin, NULL if it didn't change */
- ! win_T *new_curwin; /* new curwin if save_curwin != NULL */
- ! pos_T save_cursor; /* saved cursor pos of save_curwin */
- ! linenr_T save_topline; /* saved topline of save_curwin */
- ! # ifdef FEAT_DIFF
- ! int save_topfill; /* saved topfill of save_curwin */
- ! # endif
- #endif
- } aco_save_T;
-
- --- 2284,2294 ----
- */
- typedef struct
- {
- ! buf_T *save_curbuf; /* saved curbuf */
- #ifdef FEAT_AUTOCMD
- ! win_T *save_curwin; /* saved curwin */
- ! win_T *new_curwin; /* new curwin */
- ! buf_T *new_curbuf; /* new curbuf */
- #endif
- } aco_save_T;
-
- *** ../vim-7.2.202/src/window.c 2009-05-21 23:25:38.000000000 +0200
- --- src/window.c 2009-06-12 22:29:33.000000000 +0200
- ***************
- *** 11,18 ****
-
- static int path_is_url __ARGS((char_u *p));
- #if defined(FEAT_WINDOWS) || defined(PROTO)
- - static int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
- static void win_init __ARGS((win_T *newp, win_T *oldp, int flags));
- static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col));
- static void frame_setheight __ARGS((frame_T *curfrp, int height));
- #ifdef FEAT_VERTSPLIT
- --- 11,18 ----
-
- static int path_is_url __ARGS((char_u *p));
- #if defined(FEAT_WINDOWS) || defined(PROTO)
- static void win_init __ARGS((win_T *newp, win_T *oldp, int flags));
- + static void win_init_some __ARGS((win_T *newp, win_T *oldp));
- static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col));
- static void frame_setheight __ARGS((frame_T *curfrp, int height));
- #ifdef FEAT_VERTSPLIT
- ***************
- *** 23,30 ****
- static void win_totop __ARGS((int size, int flags));
- static void win_equal_rec __ARGS((win_T *next_curwin, int current, frame_T *topfr, int dir, int col, int row, int width, int height));
- static int last_window __ARGS((void));
- static win_T *win_free_mem __ARGS((win_T *win, int *dirp, tabpage_T *tp));
- - static win_T *winframe_remove __ARGS((win_T *win, int *dirp, tabpage_T *tp));
- static frame_T *win_altframe __ARGS((win_T *win, tabpage_T *tp));
- static tabpage_T *alt_tabpage __ARGS((void));
- static win_T *frame2win __ARGS((frame_T *frp));
- --- 23,30 ----
- static void win_totop __ARGS((int size, int flags));
- static void win_equal_rec __ARGS((win_T *next_curwin, int current, frame_T *topfr, int dir, int col, int row, int width, int height));
- static int last_window __ARGS((void));
- + static int one_window __ARGS((void));
- static win_T *win_free_mem __ARGS((win_T *win, int *dirp, tabpage_T *tp));
- static frame_T *win_altframe __ARGS((win_T *win, tabpage_T *tp));
- static tabpage_T *alt_tabpage __ARGS((void));
- static win_T *frame2win __ARGS((frame_T *frp));
- ***************
- *** 41,46 ****
- --- 41,47 ----
- #endif
- #endif
- static int win_alloc_firstwin __ARGS((win_T *oldwin));
- + static void new_frame __ARGS((win_T *wp));
- #if defined(FEAT_WINDOWS) || defined(PROTO)
- static tabpage_T *alloc_tabpage __ARGS((void));
- static int leave_tabpage __ARGS((buf_T *new_curbuf));
- ***************
- *** 49,56 ****
- static int frame_minheight __ARGS((frame_T *topfrp, win_T *next_curwin));
- static void win_enter_ext __ARGS((win_T *wp, int undo_sync, int no_curwin));
- static void win_free __ARGS((win_T *wp, tabpage_T *tp));
- - static void win_append __ARGS((win_T *, win_T *));
- - static void win_remove __ARGS((win_T *, tabpage_T *tp));
- static void frame_append __ARGS((frame_T *after, frame_T *frp));
- static void frame_insert __ARGS((frame_T *before, frame_T *frp));
- static void frame_remove __ARGS((frame_T *frp));
- --- 50,55 ----
- ***************
- *** 62,78 ****
- static void frame_add_height __ARGS((frame_T *frp, int n));
- static void last_status_rec __ARGS((frame_T *fr, int statusline));
-
- - static void make_snapshot __ARGS((void));
- static void make_snapshot_rec __ARGS((frame_T *fr, frame_T **frp));
- ! static void clear_snapshot __ARGS((tabpage_T *tp));
- static void clear_snapshot_rec __ARGS((frame_T *fr));
- - static void restore_snapshot __ARGS((int close_curwin));
- static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
- static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
-
- #endif /* FEAT_WINDOWS */
-
- ! static win_T *win_alloc __ARGS((win_T *after));
- static void win_new_height __ARGS((win_T *, int));
-
- #define URL_SLASH 1 /* path_is_url() has found "://" */
- --- 61,75 ----
- static void frame_add_height __ARGS((frame_T *frp, int n));
- static void last_status_rec __ARGS((frame_T *fr, int statusline));
-
- static void make_snapshot_rec __ARGS((frame_T *fr, frame_T **frp));
- ! static void clear_snapshot __ARGS((tabpage_T *tp, int idx));
- static void clear_snapshot_rec __ARGS((frame_T *fr));
- static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
- static win_T *restore_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
-
- #endif /* FEAT_WINDOWS */
-
- ! static win_T *win_alloc __ARGS((win_T *after, int hidden));
- static void win_new_height __ARGS((win_T *, int));
-
- #define URL_SLASH 1 /* path_is_url() has found "://" */
- ***************
- *** 259,265 ****
- /* cursor to previous window with wrap around */
- case 'W':
- CHECK_CMDWIN
- ! if (lastwin == firstwin && Prenum != 1) /* just one window */
- beep_flush();
- else
- {
- --- 256,262 ----
- /* cursor to previous window with wrap around */
- case 'W':
- CHECK_CMDWIN
- ! if (firstwin == lastwin && Prenum != 1) /* just one window */
- beep_flush();
- else
- {
- ***************
- *** 343,349 ****
-
- /* move window to new tab page */
- case 'T':
- ! if (firstwin == lastwin)
- MSG(_(m_onlyone));
- else
- {
- --- 340,346 ----
-
- /* move window to new tab page */
- case 'T':
- ! if (one_window())
- MSG(_(m_onlyone));
- else
- {
- ***************
- *** 679,687 ****
- /* When creating the help window make a snapshot of the window layout.
- * Otherwise clear the snapshot, it's now invalid. */
- if (flags & WSP_HELP)
- ! make_snapshot();
- else
- ! clear_snapshot(curtab);
-
- return win_split_ins(size, flags, NULL, 0);
- }
- --- 676,684 ----
- /* When creating the help window make a snapshot of the window layout.
- * Otherwise clear the snapshot, it's now invalid. */
- if (flags & WSP_HELP)
- ! make_snapshot(SNAP_HELP_IDX);
- else
- ! clear_snapshot(curtab, SNAP_HELP_IDX);
-
- return win_split_ins(size, flags, NULL, 0);
- }
- ***************
- *** 692,698 ****
- * top/left/right/bottom.
- * return FAIL for failure, OK otherwise
- */
- ! static int
- win_split_ins(size, flags, newwin, dir)
- int size;
- int flags;
- --- 689,695 ----
- * top/left/right/bottom.
- * return FAIL for failure, OK otherwise
- */
- ! int
- win_split_ins(size, flags, newwin, dir)
- int size;
- int flags;
- ***************
- *** 893,906 ****
- {
- /* new window below/right of current one */
- if (newwin == NULL)
- ! wp = win_alloc(oldwin);
- else
- win_append(oldwin, wp);
- }
- else
- {
- if (newwin == NULL)
- ! wp = win_alloc(oldwin->w_prev);
- else
- win_append(oldwin->w_prev, wp);
- }
- --- 890,903 ----
- {
- /* new window below/right of current one */
- if (newwin == NULL)
- ! wp = win_alloc(oldwin, FALSE);
- else
- win_append(oldwin, wp);
- }
- else
- {
- if (newwin == NULL)
- ! wp = win_alloc(oldwin->w_prev, FALSE);
- else
- win_append(oldwin->w_prev, wp);
- }
- ***************
- *** 910,915 ****
- --- 907,919 ----
- if (wp == NULL)
- return FAIL;
-
- + new_frame(wp);
- + if (wp->w_frame == NULL)
- + {
- + win_free(wp, NULL);
- + return FAIL;
- + }
- +
- /* make the contents of the new window the same as the current one */
- win_init(wp, curwin, flags);
- }
- ***************
- *** 970,982 ****
- }
-
- if (newwin == NULL)
- ! {
- ! /* Create a frame for the new window. */
- ! frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
- ! frp->fr_layout = FR_LEAF;
- ! frp->fr_win = wp;
- ! wp->w_frame = frp;
- ! }
- else
- frp = newwin->w_frame;
- frp->fr_parent = curfrp->fr_parent;
- --- 974,980 ----
- }
-
- if (newwin == NULL)
- ! frp = wp->w_frame;
- else
- frp = newwin->w_frame;
- frp->fr_parent = curfrp->fr_parent;
- ***************
- *** 1156,1161 ****
- --- 1154,1160 ----
- return OK;
- }
-
- +
- /*
- * Initialize window "newp" from window "oldp".
- * Used when splitting a window and when creating a new tab page.
- ***************
- *** 1204,1217 ****
- if (oldp->w_localdir != NULL)
- newp->w_localdir = vim_strsave(oldp->w_localdir);
-
- ! /* Use the same argument list. */
- ! newp->w_alist = oldp->w_alist;
- ! ++newp->w_alist->al_refcount;
- ! newp->w_arg_idx = oldp->w_arg_idx;
- !
- ! /*
- ! * copy tagstack and options from existing window
- ! */
- for (i = 0; i < oldp->w_tagstacklen; i++)
- {
- newp->w_tagstack[i] = oldp->w_tagstack[i];
- --- 1203,1209 ----
- if (oldp->w_localdir != NULL)
- newp->w_localdir = vim_strsave(oldp->w_localdir);
-
- ! /* copy tagstack and folds */
- for (i = 0; i < oldp->w_tagstacklen; i++)
- {
- newp->w_tagstack[i] = oldp->w_tagstack[i];
- ***************
- *** 1221,1230 ****
- }
- newp->w_tagstackidx = oldp->w_tagstackidx;
- newp->w_tagstacklen = oldp->w_tagstacklen;
- - win_copy_options(oldp, newp);
- # ifdef FEAT_FOLDING
- copyFoldingState(oldp, newp);
- # endif
- }
-
- #endif /* FEAT_WINDOWS */
- --- 1213,1241 ----
- }
- newp->w_tagstackidx = oldp->w_tagstackidx;
- newp->w_tagstacklen = oldp->w_tagstacklen;
- # ifdef FEAT_FOLDING
- copyFoldingState(oldp, newp);
- # endif
- +
- + win_init_some(newp, oldp);
- + }
- +
- + /*
- + * Initialize window "newp" from window"old".
- + * Only the essential things are copied.
- + */
- + static void
- + win_init_some(newp, oldp)
- + win_T *newp;
- + win_T *oldp;
- + {
- + /* Use the same argument list. */
- + newp->w_alist = oldp->w_alist;
- + ++newp->w_alist->al_refcount;
- + newp->w_arg_idx = oldp->w_arg_idx;
- +
- + /* copy options from existing window */
- + win_copy_options(oldp, newp);
- }
-
- #endif /* FEAT_WINDOWS */
- ***************
- *** 1565,1579 ****
- #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
- /* When 'guioptions' includes 'L' or 'R' may have to remove or add
- * scrollbars. Have to update them anyway. */
- ! if (gui.in_use)
- ! {
- ! out_flush();
- ! gui_init_which_components(NULL);
- ! gui_update_scrollbars(TRUE);
- ! }
- ! need_mouse_correct = TRUE;
- #endif
- -
- }
-
- /*
- --- 1576,1583 ----
- #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
- /* When 'guioptions' includes 'L' or 'R' may have to remove or add
- * scrollbars. Have to update them anyway. */
- ! gui_may_update_scrollbars();
- #endif
- }
-
- /*
- ***************
- *** 2048,2060 ****
- }
-
- /*
- ! * Return TRUE if the current window is the only window that exists.
- * Returns FALSE if there is a window, possibly in another tab page.
- */
- static int
- last_window()
- {
- ! return (lastwin == firstwin && first_tabpage->tp_next == NULL);
- }
-
- /*
- --- 2052,2091 ----
- }
-
- /*
- ! * Return TRUE if the current window is the only window that exists (ignoring
- ! * "aucmd_win").
- * Returns FALSE if there is a window, possibly in another tab page.
- */
- static int
- last_window()
- {
- ! return (one_window() && first_tabpage->tp_next == NULL);
- ! }
- !
- ! /*
- ! * Return TRUE if there is only one window other than "aucmd_win" in the
- ! * current tab page.
- ! */
- ! static int
- ! one_window()
- ! {
- ! #ifdef FEAT_AUTOCMD
- ! win_T *wp;
- ! int seen_one = FALSE;
- !
- ! FOR_ALL_WINDOWS(wp)
- ! {
- ! if (wp != aucmd_win)
- ! {
- ! if (seen_one)
- ! return FALSE;
- ! seen_one = TRUE;
- ! }
- ! }
- ! return TRUE;
- ! #else
- ! return firstwin == lastwin;
- ! #endif
- }
-
- /*
- ***************
- *** 2083,2088 ****
- --- 2114,2132 ----
- return;
- }
-
- + #ifdef FEAT_AUTOCMD
- + if (win == aucmd_win)
- + {
- + EMSG(_("E813: Cannot close autocmd window"));
- + return;
- + }
- + if ((firstwin == aucmd_win || lastwin == aucmd_win) && one_window())
- + {
- + EMSG(_("E814: Cannot close window, only autocmd window would remain"));
- + return;
- + }
- + #endif
- +
- /*
- * When closing the last window in a tab page first go to another tab
- * page and then close the window and the tab page. This avoids that
- ***************
- *** 2112,2118 ****
- if (win->w_buffer->b_help)
- help_window = TRUE;
- else
- ! clear_snapshot(curtab);
-
- #ifdef FEAT_AUTOCMD
- if (win == curwin)
- --- 2156,2162 ----
- if (win->w_buffer->b_help)
- help_window = TRUE;
- else
- ! clear_snapshot(curtab, SNAP_HELP_IDX);
-
- #ifdef FEAT_AUTOCMD
- if (win == curwin)
- ***************
- *** 2229,2235 ****
- /* After closing the help window, try restoring the window layout from
- * before it was opened. */
- if (help_window)
- ! restore_snapshot(close_curwin);
-
- #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
- /* When 'guioptions' includes 'L' or 'R' may have to remove scrollbars. */
- --- 2273,2279 ----
- /* After closing the help window, try restoring the window layout from
- * before it was opened. */
- if (help_window)
- ! restore_snapshot(SNAP_HELP_IDX, close_curwin);
-
- #if defined(FEAT_GUI) && defined(FEAT_VERTSPLIT)
- /* When 'guioptions' includes 'L' or 'R' may have to remove scrollbars. */
- ***************
- *** 2344,2349 ****
- --- 2388,2401 ----
-
- while (firstwin != NULL)
- (void)win_free_mem(firstwin, &dummy, NULL);
- +
- + # ifdef FEAT_AUTOCMD
- + if (aucmd_win != NULL)
- + {
- + (void)win_free_mem(aucmd_win, &dummy, NULL);
- + aucmd_win = NULL;
- + }
- + # endif
- }
- #endif
-
- ***************
- *** 2351,2357 ****
- * Remove a window and its frame from the tree of frames.
- * Returns a pointer to the window that got the freed up space.
- */
- ! static win_T *
- winframe_remove(win, dirp, tp)
- win_T *win;
- int *dirp UNUSED; /* set to 'v' or 'h' for direction if 'ea' */
- --- 2403,2409 ----
- * Remove a window and its frame from the tree of frames.
- * Returns a pointer to the window that got the freed up space.
- */
- ! win_T *
- winframe_remove(win, dirp, tp)
- win_T *win;
- int *dirp UNUSED; /* set to 'v' or 'h' for direction if 'ea' */
- ***************
- *** 3090,3096 ****
- win_T *nextwp;
- int r;
-
- ! if (lastwin == firstwin)
- {
- if (message
- #ifdef FEAT_AUTOCMD
- --- 3142,3148 ----
- win_T *nextwp;
- int r;
-
- ! if (one_window())
- {
- if (message
- #ifdef FEAT_AUTOCMD
- ***************
- *** 3194,3202 ****
- --- 3246,3275 ----
- first_tabpage->tp_topframe = topframe;
- curtab = first_tabpage;
- #endif
- +
- return OK;
- }
-
- + #if defined(FEAT_AUTOCMD) || defined(PROTO)
- + /*
- + * Init "aucmd_win". This can only be done after the first
- + * window is fully initialized, thus it can't be in win_alloc_first().
- + */
- + void
- + win_alloc_aucmd_win()
- + {
- + aucmd_win = win_alloc(NULL, TRUE);
- + if (aucmd_win != NULL)
- + {
- + win_init_some(aucmd_win, curwin);
- + # ifdef FEAT_SCROLLBIND
- + aucmd_win->w_p_scb = FALSE;
- + # endif
- + new_frame(aucmd_win);
- + }
- + }
- + #endif
- +
- /*
- * Allocate the first window or the first window in a new tab page.
- * When "oldwin" is NULL create an empty buffer for it.
- ***************
- *** 3208,3214 ****
- win_alloc_firstwin(oldwin)
- win_T *oldwin;
- {
- ! curwin = win_alloc(NULL);
- if (oldwin == NULL)
- {
- /* Very first window, need to create an empty buffer for it and
- --- 3281,3287 ----
- win_alloc_firstwin(oldwin)
- win_T *oldwin;
- {
- ! curwin = win_alloc(NULL, FALSE);
- if (oldwin == NULL)
- {
- /* Very first window, need to create an empty buffer for it and
- ***************
- *** 3236,3256 ****
- }
- #endif
-
- ! topframe = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
- ! if (topframe == NULL)
- return FAIL;
- ! topframe->fr_layout = FR_LEAF;
- #ifdef FEAT_VERTSPLIT
- topframe->fr_width = Columns;
- #endif
- topframe->fr_height = Rows - p_ch;
- topframe->fr_win = curwin;
- - curwin->w_frame = topframe;
-
- return OK;
- }
-
- /*
- * Initialize the window and frame size to the maximum.
- */
- void
- --- 3309,3344 ----
- }
- #endif
-
- ! new_frame(curwin);
- ! if (curwin->w_frame == NULL)
- return FAIL;
- ! topframe = curwin->w_frame;
- #ifdef FEAT_VERTSPLIT
- topframe->fr_width = Columns;
- #endif
- topframe->fr_height = Rows - p_ch;
- topframe->fr_win = curwin;
-
- return OK;
- }
-
- /*
- + * Create a frame for window "wp".
- + */
- + static void
- + new_frame(win_T *wp)
- + {
- + frame_T *frp = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
- +
- + wp->w_frame = frp;
- + if (frp != NULL)
- + {
- + frp->fr_layout = FR_LEAF;
- + frp->fr_win = wp;
- + }
- + }
- +
- + /*
- * Initialize the window and frame size to the maximum.
- */
- void
- ***************
- *** 3300,3309 ****
- free_tabpage(tp)
- tabpage_T *tp;
- {
- # ifdef FEAT_DIFF
- diff_clear(tp);
- # endif
- ! clear_snapshot(tp);
- #ifdef FEAT_EVAL
- vars_clear(&tp->tp_vars.dv_hashtab); /* free all t: variables */
- #endif
- --- 3388,3400 ----
- free_tabpage(tp)
- tabpage_T *tp;
- {
- + int idx;
- +
- # ifdef FEAT_DIFF
- diff_clear(tp);
- # endif
- ! for (idx = 0; idx < SNAP_COUNT; ++idx)
- ! clear_snapshot(tp, idx);
- #ifdef FEAT_EVAL
- vars_clear(&tp->tp_vars.dv_hashtab); /* free all t: variables */
- #endif
- ***************
- *** 3370,3381 ****
- #if defined(FEAT_GUI)
- /* When 'guioptions' includes 'L' or 'R' may have to remove or add
- * scrollbars. Have to update them anyway. */
- ! if (gui.in_use && starting == 0)
- ! {
- ! gui_init_which_components(NULL);
- ! gui_update_scrollbars(TRUE);
- ! }
- ! need_mouse_correct = TRUE;
- #endif
-
- redraw_all_later(CLEAR);
- --- 3461,3467 ----
- #if defined(FEAT_GUI)
- /* When 'guioptions' includes 'L' or 'R' may have to remove or add
- * scrollbars. Have to update them anyway. */
- ! gui_may_update_scrollbars();
- #endif
-
- redraw_all_later(CLEAR);
- ***************
- *** 3593,3604 ****
- #if defined(FEAT_GUI)
- /* When 'guioptions' includes 'L' or 'R' may have to remove or add
- * scrollbars. Have to update them anyway. */
- ! if (gui.in_use && starting == 0)
- ! {
- ! gui_init_which_components(NULL);
- ! gui_update_scrollbars(TRUE);
- ! }
- ! need_mouse_correct = TRUE;
- #endif
-
- redraw_all_later(CLEAR);
- --- 3679,3685 ----
- #if defined(FEAT_GUI)
- /* When 'guioptions' includes 'L' or 'R' may have to remove or add
- * scrollbars. Have to update them anyway. */
- ! gui_may_update_scrollbars();
- #endif
-
- redraw_all_later(CLEAR);
- ***************
- *** 4150,4160 ****
- #endif
-
- /*
- ! * allocate a window structure and link it in the window list
- */
- static win_T *
- ! win_alloc(after)
- win_T *after UNUSED;
- {
- win_T *newwin;
-
- --- 4231,4243 ----
- #endif
-
- /*
- ! * Allocate a window structure and link it in the window list when "hidden" is
- ! * FALSE.
- */
- static win_T *
- ! win_alloc(after, hidden)
- win_T *after UNUSED;
- + int hidden UNUSED;
- {
- win_T *newwin;
-
- ***************
- *** 4180,4186 ****
- * link the window in the window list
- */
- #ifdef FEAT_WINDOWS
- ! win_append(after, newwin);
- #endif
- #ifdef FEAT_VERTSPLIT
- newwin->w_wincol = 0;
- --- 4263,4270 ----
- * link the window in the window list
- */
- #ifdef FEAT_WINDOWS
- ! if (!hidden)
- ! win_append(after, newwin);
- #endif
- #ifdef FEAT_VERTSPLIT
- newwin->w_wincol = 0;
- ***************
- *** 4314,4320 ****
- /*
- * Append window "wp" in the window list after window "after".
- */
- ! static void
- win_append(after, wp)
- win_T *after, *wp;
- {
- --- 4398,4404 ----
- /*
- * Append window "wp" in the window list after window "after".
- */
- ! void
- win_append(after, wp)
- win_T *after, *wp;
- {
- ***************
- *** 4340,4346 ****
- /*
- * Remove a window from the window list.
- */
- ! static void
- win_remove(wp, tp)
- win_T *wp;
- tabpage_T *tp; /* tab page "win" is in, NULL for current */
- --- 4424,4430 ----
- /*
- * Remove a window from the window list.
- */
- ! void
- win_remove(wp, tp)
- win_T *wp;
- tabpage_T *tp; /* tab page "win" is in, NULL for current */
- ***************
- *** 6040,6045 ****
- --- 6124,6130 ----
- /*
- * Return TRUE if there is only one window (in the current tab page), not
- * counting a help or preview window, unless it is the current window.
- + * Does not count "aucmd_win".
- */
- int
- only_one_window()
- ***************
- *** 6053,6063 ****
- return FALSE;
-
- for (wp = firstwin; wp != NULL; wp = wp->w_next)
- ! if (!((wp->w_buffer->b_help && !curbuf->b_help)
- # ifdef FEAT_QUICKFIX
- || wp->w_p_pvw
- # endif
- ) || wp == curwin)
- ++count;
- return (count <= 1);
- #else
- --- 6138,6152 ----
- return FALSE;
-
- for (wp = firstwin; wp != NULL; wp = wp->w_next)
- ! if ((!((wp->w_buffer->b_help && !curbuf->b_help)
- # ifdef FEAT_QUICKFIX
- || wp->w_p_pvw
- # endif
- ) || wp == curwin)
- + # ifdef FEAT_AUTOCMD
- + && wp != aucmd_win
- + # endif
- + )
- ++count;
- return (count <= 1);
- #else
- ***************
- *** 6112,6122 ****
- /*
- * Create a snapshot of the current frame sizes.
- */
- ! static void
- ! make_snapshot()
- {
- ! clear_snapshot(curtab);
- ! make_snapshot_rec(topframe, &curtab->tp_snapshot);
- }
-
- static void
- --- 6201,6212 ----
- /*
- * Create a snapshot of the current frame sizes.
- */
- ! void
- ! make_snapshot(idx)
- ! int idx;
- {
- ! clear_snapshot(curtab, idx);
- ! make_snapshot_rec(topframe, &curtab->tp_snapshot[idx]);
- }
-
- static void
- ***************
- *** 6144,6154 ****
- * Remove any existing snapshot.
- */
- static void
- ! clear_snapshot(tp)
- tabpage_T *tp;
- {
- ! clear_snapshot_rec(tp->tp_snapshot);
- ! tp->tp_snapshot = NULL;
- }
-
- static void
- --- 6234,6245 ----
- * Remove any existing snapshot.
- */
- static void
- ! clear_snapshot(tp, idx)
- tabpage_T *tp;
- + int idx;
- {
- ! clear_snapshot_rec(tp->tp_snapshot[idx]);
- ! tp->tp_snapshot[idx] = NULL;
- }
-
- static void
- ***************
- *** 6168,6193 ****
- * This is only done if the screen size didn't change and the window layout is
- * still the same.
- */
- ! static void
- ! restore_snapshot(close_curwin)
- int close_curwin; /* closing current window */
- {
- win_T *wp;
-
- ! if (curtab->tp_snapshot != NULL
- # ifdef FEAT_VERTSPLIT
- ! && curtab->tp_snapshot->fr_width == topframe->fr_width
- # endif
- ! && curtab->tp_snapshot->fr_height == topframe->fr_height
- ! && check_snapshot_rec(curtab->tp_snapshot, topframe) == OK)
- {
- ! wp = restore_snapshot_rec(curtab->tp_snapshot, topframe);
- win_comp_pos();
- if (wp != NULL && close_curwin)
- win_goto(wp);
- redraw_all_later(CLEAR);
- }
- ! clear_snapshot(curtab);
- }
-
- /*
- --- 6259,6285 ----
- * This is only done if the screen size didn't change and the window layout is
- * still the same.
- */
- ! void
- ! restore_snapshot(idx, close_curwin)
- ! int idx;
- int close_curwin; /* closing current window */
- {
- win_T *wp;
-
- ! if (curtab->tp_snapshot[idx] != NULL
- # ifdef FEAT_VERTSPLIT
- ! && curtab->tp_snapshot[idx]->fr_width == topframe->fr_width
- # endif
- ! && curtab->tp_snapshot[idx]->fr_height == topframe->fr_height
- ! && check_snapshot_rec(curtab->tp_snapshot[idx], topframe) == OK)
- {
- ! wp = restore_snapshot_rec(curtab->tp_snapshot[idx], topframe);
- win_comp_pos();
- if (wp != NULL && close_curwin)
- win_goto(wp);
- redraw_all_later(CLEAR);
- }
- ! clear_snapshot(curtab, idx);
- }
-
- /*
- *** ../vim-7.2.202/src/version.c 2009-06-16 15:35:46.000000000 +0200
- --- src/version.c 2009-06-16 15:37:16.000000000 +0200
- ***************
- *** 678,679 ****
- --- 678,681 ----
- { /* Add new patch number below this line */
- + /**/
- + 203,
- /**/
-
- --
- How To Keep A Healthy Level Of Insanity:
- 15. Five days in advance, tell your friends you can't attend their
- party because you're not in the mood.
-
- /// 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 ///
-