Mercurial > vim
diff src/screen.c @ 671:83a006f81bac v7.0199
updated for version 7.0199
author | vimboss |
---|---|
date | Thu, 16 Feb 2006 22:11:02 +0000 |
parents | f892bda292a8 |
children | 513866ffe6af |
line wrap: on
line diff
--- a/src/screen.c +++ b/src/screen.c @@ -6742,6 +6742,10 @@ screenalloc(clear) sattr_T *new_ScreenAttrs; unsigned *new_LineOffset; char_u *new_LineWraps; +#ifdef FEAT_WINDOWS + char_u *new_TabPageIdxs; + tabpage_T *tp; +#endif static int entered = FALSE; /* avoid recursiveness */ static int did_outofmem_msg = FALSE; /* did outofmem message */ @@ -6788,10 +6792,10 @@ screenalloc(clear) * size is wrong. */ #ifdef FEAT_WINDOWS - for (wp = firstwin; wp; wp = wp->w_next) + FOR_ALL_TAB_WINDOWS(tp, wp) win_free_lsize(wp); #else - win_free_lsize(curwin); + win_free_lsize(curwin); #endif new_ScreenLines = (schar_T *)lalloc((long_u)( @@ -6815,6 +6819,9 @@ screenalloc(clear) new_LineOffset = (unsigned *)lalloc((long_u)( Rows * sizeof(unsigned)), FALSE); new_LineWraps = (char_u *)lalloc((long_u)(Rows * sizeof(char_u)), FALSE); +#ifdef FEAT_WINDOWS + new_TabPageIdxs = (char_u *)lalloc((long_u)(Columns * sizeof(char_u)), FALSE); +#endif FOR_ALL_WINDOWS(wp) { @@ -6836,6 +6843,9 @@ screenalloc(clear) || new_ScreenAttrs == NULL || new_LineOffset == NULL || new_LineWraps == NULL +#ifdef FEAT_WINDOWS + || new_TabPageIdxs == NULL +#endif || outofmem) { if (ScreenLines != NULL || !did_outofmem_msg) @@ -6865,6 +6875,10 @@ screenalloc(clear) new_LineOffset = NULL; vim_free(new_LineWraps); new_LineWraps = NULL; +#ifdef FEAT_WINDOWS + vim_free(new_TabPageIdxs); + new_TabPageIdxs = NULL; +#endif } else { @@ -6956,6 +6970,9 @@ screenalloc(clear) ScreenAttrs = new_ScreenAttrs; LineOffset = new_LineOffset; LineWraps = new_LineWraps; +#ifdef FEAT_WINDOWS + TabPageIdxs = new_TabPageIdxs; +#endif /* It's important that screen_Rows and screen_Columns reflect the actual * size of ScreenLines[]. Set them before calling anything. */ @@ -7005,6 +7022,9 @@ free_screenlines() vim_free(ScreenAttrs); vim_free(LineOffset); vim_free(LineWraps); +#ifdef FEAT_WINDOWS + vim_free(TabPageIdxs); +#endif } void @@ -8443,9 +8463,13 @@ draw_tabpage() tabpage_T *tp; int tabwidth; int col = 0; + int scol; int had_current = FALSE; int attr; win_T *wp; + win_T *cwp; + int wincount; + int modified; int c; int len; int attr_sel = hl_attr(HLF_TPS); @@ -8460,13 +8484,16 @@ draw_tabpage() for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) ++tabcount; - tabwidth = Columns / tabcount; + tabwidth = (Columns - 1 + tabcount / 2) / tabcount; if (tabwidth < 6) tabwidth = 6; attr = attr_nosel; - for (tp = first_tabpage; tp != NULL; tp = tp->tp_next) - { + tabcount = 0; + for (tp = first_tabpage; tp != NULL && col < Columns; tp = tp->tp_next) + { + scol = col; + if (tp->tp_topframe == topframe) { c = '/'; @@ -8486,21 +8513,55 @@ draw_tabpage() screen_putchar(' ', 0, col++, attr); if (tp->tp_topframe == topframe) - wp = curwin; + { + cwp = curwin; + wp = firstwin; + } else - wp = tp->tp_curwin; - if (buf_spname(wp->w_buffer) != NULL) - STRCPY(NameBuff, buf_spname(wp->w_buffer)); + { + cwp = tp->tp_curwin; + wp = tp->tp_firstwin; + } + + modified = FALSE; + for (wincount = 0; wp != NULL; wp = wp->w_next, ++wincount) + if (bufIsChanged(wp->w_buffer)) + modified = TRUE; + if (modified || wincount > 1) + { + if (wincount > 1) + { + vim_snprintf((char *)NameBuff, MAXPATHL, "#%d", wincount); + len = STRLEN(NameBuff); + screen_puts_len(NameBuff, len, 0, col, attr); + col += len; + } + if (modified) + screen_puts_len((char_u *)"+", 2, 0, col++, attr); + screen_putchar(' ', 0, col++, attr); + } + + if (buf_spname(cwp->w_buffer) != NULL) + STRCPY(NameBuff, buf_spname(cwp->w_buffer)); else - home_replace(wp->w_buffer, wp->w_buffer->b_fname, NameBuff, + home_replace(cwp->w_buffer, cwp->w_buffer->b_fname, NameBuff, MAXPATHL, TRUE); trans_characters(NameBuff, MAXPATHL); len = STRLEN(NameBuff); - if (len > tabwidth) /* TODO: multi-byte chars */ - len = tabwidth; - screen_puts_len(NameBuff, len, 0, col, attr); - col += len; + if (len > scol - col + tabwidth - 1) /* TODO: multi-byte chars */ + len = scol - col + tabwidth - 1; + if (len > 0) + { + screen_puts_len(NameBuff, len, 0, col, attr); + col += len; + } screen_putchar(' ', 0, col++, attr); + + /* Store the tab page number in TabPageIdxs[], so that jump_to_mouse() + * knows where each one is. */ + ++tabcount; + while (scol < col) + TabPageIdxs[scol++] = tabcount; } if (t_colors < 8) @@ -8511,6 +8572,14 @@ draw_tabpage() else c = ' '; screen_fill(0, 1, col, (int)Columns, c, c, attr_fill); + + /* Put an "X" for closing the current tab if there are several. */ + if (first_tabpage->tp_next != NULL) + screen_putchar('X', 0, (int)Columns - 1, attr_nosel); + + /* Clicking outside of tabs has no effect. */ + while (scol < Columns) + TabPageIdxs[scol++] = 0xff; } #endif