| 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 |
| |
| |
| |
| |
| |
| *** 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 */ |
| |
| |
| |
| *** 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. |
| |
| |
| |
| *** 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 */ |
| |
| |
| |
| *** 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(); |
| } |
| |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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 |
| |
| |
| |
| *** 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; |
| |
| |
| |
| |
| *** 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); |
| } |
| |
| /* |
| |
| |
| |
| *** 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 /// |