0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

updated for version 7.0199

This commit is contained in:
Bram Moolenaar
2006-02-16 22:11:02 +00:00
parent 4c7ed462cb
commit f740b29ae2
31 changed files with 613 additions and 205 deletions

View File

@@ -25,9 +25,9 @@ static void win_exchange __ARGS((long));
static void win_rotate __ARGS((int, int));
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 win_T *win_free_mem __ARGS((win_T *win, int *dirp));
static win_T *winframe_remove __ARGS((win_T *win, int *dirp));
static frame_T *win_altframe __ARGS((win_T *win));
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));
static int frame_has_win __ARGS((frame_T *frp, win_T *wp));
@@ -49,9 +49,9 @@ static void enter_tabpage __ARGS((tabpage_T *tp, buf_T *old_curbuf));
static void frame_fix_height __ARGS((win_T *wp));
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));
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 *));
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));
@@ -1262,14 +1262,14 @@ win_exchange(Prenum)
frp2 = curwin->w_frame->fr_prev;
if (wp->w_prev != curwin)
{
win_remove(curwin);
win_remove(curwin, NULL);
frame_remove(curwin->w_frame);
win_append(wp->w_prev, curwin);
frame_insert(frp, curwin->w_frame);
}
if (wp != wp2)
{
win_remove(wp);
win_remove(wp, NULL);
frame_remove(wp->w_frame);
win_append(wp2, wp);
if (frp2 == NULL)
@@ -1353,7 +1353,7 @@ win_rotate(upwards, count)
/* remove first window/frame from the list */
frp = curwin->w_frame->fr_parent->fr_child;
wp1 = frp->fr_win;
win_remove(wp1);
win_remove(wp1, NULL);
frame_remove(frp);
/* find last frame and append removed window/frame after it */
@@ -1372,7 +1372,7 @@ win_rotate(upwards, count)
;
wp1 = frp->fr_win;
wp2 = wp1->w_prev; /* will become last window */
win_remove(wp1);
win_remove(wp1, NULL);
frame_remove(frp);
/* append the removed window/frame before the first in the list */
@@ -1419,8 +1419,8 @@ win_totop(size, flags)
}
/* Remove the window and frame from the tree of frames. */
(void)winframe_remove(curwin, &dir);
win_remove(curwin);
(void)winframe_remove(curwin, &dir, NULL);
win_remove(curwin, NULL);
last_status(FALSE); /* may need to remove last status line */
(void)win_comp_pos(); /* recompute window positions */
@@ -1486,7 +1486,7 @@ win_move_after(win1, win2)
win1->w_vsep_width = 0;
#endif
}
win_remove(win1);
win_remove(win1, NULL);
frame_remove(win1->w_frame);
win_append(win2, win1);
frame_append(win2->w_frame, win1->w_frame);
@@ -1797,23 +1797,50 @@ win_equal_rec(next_curwin, current, topfr, dir, col, row, width, height)
* close all windows for buffer 'buf'
*/
void
close_windows(buf)
close_windows(buf, keep_curwin)
buf_T *buf;
int keep_curwin; /* don't close "curwin" */
{
win_T *win;
win_T *wp;
tabpage_T *tp, *nexttp;
int h = tabpageline_height();
++RedrawingDisabled;
for (win = firstwin; win != NULL && lastwin != firstwin; )
for (wp = firstwin; wp != NULL && lastwin != firstwin; )
{
if (win->w_buffer == buf)
if (wp->w_buffer == buf && (!keep_curwin || wp != curwin))
{
win_close(win, FALSE);
win = firstwin; /* go back to the start */
win_close(wp, FALSE);
/* Start all over, autocommands may change the window layout. */
wp = firstwin;
}
else
win = win->w_next;
wp = wp->w_next;
}
/* Also check windows in other tab pages. */
for (tp = first_tabpage; tp != NULL; tp = nexttp)
{
nexttp = tp->tp_next;
if (tp->tp_topframe != topframe)
for (wp = tp->tp_firstwin; wp != NULL; wp = wp->w_next)
if (wp->w_buffer == buf)
{
win_close_othertab(wp, FALSE, tp);
/* Start all over, the tab page may be closed and
* autocommands may change the window layout. */
nexttp = first_tabpage;
break;
}
}
--RedrawingDisabled;
if (h != tabpageline_height())
shell_new_rows();
}
/*
@@ -1827,7 +1854,7 @@ last_window()
}
/*
* close window "win"
* Close window "win".
* If "free_buf" is TRUE related buffer may be unloaded.
*
* called by :quit, :close, :xit, :wq and findtag()
@@ -1866,7 +1893,7 @@ win_close(win, free_buf)
* Guess which window is going to be the new current window.
* This may change because of the autocommands (sigh).
*/
wp = frame2win(win_altframe(win));
wp = frame2win(win_altframe(win, NULL));
/*
* Be careful: If autocommands delete the window, return now.
@@ -1899,7 +1926,7 @@ win_close(win, free_buf)
return;
/* Free the memory used for the window. */
wp = win_free_mem(win, &dir);
wp = win_free_mem(win, &dir, NULL);
/* When closing the last window in a tab page go to another tab page. */
if (wp == NULL)
@@ -2003,14 +2030,71 @@ win_close(win, free_buf)
redraw_all_later(NOT_VALID);
}
/*
* Close window "win" in tab page "tp", which is not the current tab page.
* This may be the last window ih that tab page and result in closing the tab,
* thus "tp" may become invalid!
* Called must check if buffer is hidden.
*/
void
win_close_othertab(win, free_buf, tp)
win_T *win;
int free_buf;
tabpage_T *tp;
{
win_T *wp;
int dir;
tabpage_T *ptp = NULL;
/* Close the link to the buffer. */
close_buffer(win, win->w_buffer, free_buf ? DOBUF_UNLOAD : 0);
/* Careful: Autocommands may have closed the tab page or made it the
* current tab page. */
for (ptp = first_tabpage; ptp != NULL && ptp != tp; ptp = ptp->tp_next)
;
if (ptp == NULL || tp->tp_topframe == topframe)
return;
/* Autocommands may have closed the window already. */
for (wp = tp->tp_firstwin; wp != NULL && wp != win; wp = wp->w_next)
;
if (wp == NULL)
return;
/* Free the memory used for the window. */
wp = win_free_mem(win, &dir, tp);
/* When closing the last window in a tab page remove the tab page. */
if (wp == NULL)
{
if (tp == first_tabpage)
first_tabpage = tp->tp_next;
else
{
for (ptp = first_tabpage; ptp != NULL && ptp->tp_next != tp;
ptp = ptp->tp_next)
;
if (ptp == NULL)
{
EMSG2(_(e_intern2), "win_close_othertab()");
return;
}
ptp->tp_next = tp->tp_next;
}
vim_free(tp);
}
}
/*
* Free the memory used for a window.
* Returns a pointer to the window that got the freed up space.
*/
static win_T *
win_free_mem(win, dirp)
win_free_mem(win, dirp, tp)
win_T *win;
int *dirp; /* set to 'v' or 'h' for direction if 'ea' */
tabpage_T *tp; /* tab page "win" is in, NULL for current */
{
frame_T *frp;
win_T *wp;
@@ -2024,13 +2108,9 @@ win_free_mem(win, dirp)
/* Remove the window and its frame from the tree of frames. */
frp = win->w_frame;
if (firstwin == lastwin)
/* Last window in a tab page. */
wp = NULL;
else
wp = winframe_remove(win, dirp);
wp = winframe_remove(win, dirp, tp);
vim_free(frp);
win_free(win);
win_free(win, tp);
return wp;
}
@@ -2041,8 +2121,13 @@ win_free_all()
{
int dummy;
# ifdef FEAT_WINDOWS
while (first_tabpage->tp_next != NULL)
tabpage_close(TRUE);
# endif
while (firstwin != NULL)
(void)win_free_mem(firstwin, &dummy);
(void)win_free_mem(firstwin, &dummy, NULL);
}
#endif
@@ -2052,22 +2137,26 @@ win_free_all()
*/
/*ARGSUSED*/
static win_T *
winframe_remove(win, dirp)
winframe_remove(win, dirp, tp)
win_T *win;
int *dirp; /* set to 'v' or 'h' for direction if 'ea' */
tabpage_T *tp; /* tab page "win" is in, NULL for current */
{
frame_T *frp, *frp2, *frp3;
frame_T *frp_close = win->w_frame;
win_T *wp;
int old_height = 0;
/*
* If there is only one window there is nothing to remove.
*/
if (tp == NULL ? firstwin == lastwin : tp->tp_firstwin == tp->tp_lastwin)
return NULL;
/*
* Remove the window from its frame.
*/
frp2 = win_altframe(win);
if (frp2 == NULL)
return NULL; /* deleted the last frame */
frp2 = win_altframe(win, tp);
wp = frame2win(frp2);
/* Remove this frame from the list of frames. */
@@ -2160,13 +2249,14 @@ winframe_remove(win, dirp)
* layout.
*/
static frame_T *
win_altframe(win)
win_altframe(win, tp)
win_T *win;
tabpage_T *tp; /* tab page "win" is in, NULL for current */
{
frame_T *frp;
int b;
if (firstwin == lastwin)
if (tp == NULL ? firstwin == lastwin : tp->tp_firstwin == tp->tp_lastwin)
/* Last window in this tab page, will go to next tab page. */
return alt_tabpage()->tp_curwin->w_frame;
@@ -2861,6 +2951,7 @@ win_new_tabpage()
firstwin->w_winrow = tabpageline_height();
newtp->tp_topframe = topframe;
last_status(FALSE);
redraw_all_later(CLEAR);
return OK;
}
@@ -2868,6 +2959,7 @@ win_new_tabpage()
/* Failed, get back the previous Tab page */
topframe = tp->tp_topframe;
curwin = tp->tp_curwin;
prevwin = tp->tp_prevwin;
firstwin = tp->tp_firstwin;
lastwin = tp->tp_lastwin;
return FAIL;
@@ -2889,6 +2981,36 @@ current_tabpage()
return tp;
}
/*
* Return TRUE when "tpc" points to a valid tab page.
*/
int
valid_tabpage(tpc)
tabpage_T *tpc;
{
tabpage_T *tp;
for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
if (tp == tpc)
return TRUE;
return FALSE;
}
/*
* Find tab page "n" (first one is 1). Returns NULL when not found.
*/
tabpage_T *
find_tabpage(n)
int n;
{
tabpage_T *tp;
int i = 1;
for (tp = first_tabpage; tp != NULL && i != n; tp = tp->tp_next)
++i;
return tp;
}
/*
* Prepare for leaving the current tab page "tp".
*/
@@ -2902,6 +3024,7 @@ leave_tabpage(tp)
gui_remove_scrollbars();
#endif
tp->tp_curwin = curwin;
tp->tp_prevwin = prevwin;
tp->tp_firstwin = firstwin;
tp->tp_lastwin = lastwin;
tp->tp_old_Rows = Rows;
@@ -2925,6 +3048,7 @@ enter_tabpage(tp, old_curbuf)
lastwin = tp->tp_lastwin;
topframe = tp->tp_topframe;
win_enter_ext(tp->tp_curwin, FALSE, TRUE);
prevwin = tp->tp_prevwin;
#ifdef FEAT_AUTOCMD
if (old_curbuf != curbuf)
@@ -2985,12 +3109,13 @@ goto_tabpage(n)
{
/* Go to tab page "n". */
i = 0;
for (tp = first_tabpage; ++i != n; tp = tp->tp_next)
if (tp == NULL)
{
beep_flush();
return;
}
for (tp = first_tabpage; ++i != n && tp != NULL; tp = tp->tp_next)
;
if (tp == NULL)
{
beep_flush();
return;
}
}
leave_tabpage(otp);
@@ -3418,8 +3543,9 @@ win_alloc(after)
* remove window 'wp' from the window list and free the structure
*/
static void
win_free(wp)
win_free(wp, tp)
win_T *wp;
tabpage_T *tp; /* tab page "win" is in, NULL for current */
{
int i;
@@ -3478,7 +3604,7 @@ win_free(wp)
}
#endif /* FEAT_GUI */
win_remove(wp);
win_remove(wp, tp);
vim_free(wp);
}
@@ -3512,17 +3638,22 @@ win_append(after, wp)
* Remove a window from the window list.
*/
static void
win_remove(wp)
win_remove(wp, tp)
win_T *wp;
tabpage_T *tp; /* tab page "win" is in, NULL for current */
{
if (wp->w_prev != NULL)
wp->w_prev->w_next = wp->w_next;
else
else if (tp == NULL)
firstwin = wp->w_next;
else
tp->tp_firstwin = wp->w_next;
if (wp->w_next != NULL)
wp->w_next->w_prev = wp->w_prev;
else
else if (tp == NULL)
lastwin = wp->w_prev;
else
tp->tp_lastwin = wp->w_prev;
}
/*
@@ -3600,6 +3731,7 @@ win_free_lsize(wp)
/*
* Called from win_new_shellsize() after Rows changed.
* This only does the current tab page, others must be done when made active.
*/
void
shell_new_rows()
@@ -5115,16 +5247,27 @@ vim_FullName(fname, buf, len, force)
min_rows()
{
int total;
#ifdef FEAT_WINDOWS
tabpage_T *tp;
int n;
#endif
if (firstwin == NULL) /* not initialized yet */
return MIN_LINES;
total = 1; /* count the room for the command line */
#ifdef FEAT_WINDOWS
total += frame_minheight(topframe, NULL);
total = 0;
for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
{
n = frame_minheight(tp->tp_topframe, NULL);
if (total < n)
total = n;
}
total += tabpageline_height();
#else
total += 1; /* at least one window should have a line! */
total = 1; /* at least one window should have a line! */
#endif
total += 1; /* count the room for the command line */
return total;
}
@@ -5169,7 +5312,9 @@ check_lnums(do_curwin)
win_T *wp;
#ifdef FEAT_WINDOWS
for (wp = firstwin; wp != NULL; wp = wp->w_next)
tabpage_T *tp;
FOR_ALL_TAB_WINDOWS(tp, wp)
if ((do_curwin || wp != curwin) && wp->w_buffer == curbuf)
#else
wp = curwin;