mirror of
https://github.com/vim/vim.git
synced 2025-09-28 04:24:06 -04:00
patch 9.0.0965: using one window for executing autocommands is insufficient
Problem: Using one window for executing autocommands is insufficient. Solution: Use up to five windows for executing autocommands.
This commit is contained in:
35
src/screen.c
35
src/screen.c
@@ -2369,7 +2369,6 @@ screenalloc(int doclear)
|
||||
u8char_T *new_ScreenLinesUC = NULL;
|
||||
u8char_T *new_ScreenLinesC[MAX_MCO];
|
||||
schar_T *new_ScreenLines2 = NULL;
|
||||
int i;
|
||||
sattr_T *new_ScreenAttrs;
|
||||
colnr_T *new_ScreenCols;
|
||||
unsigned *new_LineOffset;
|
||||
@@ -2438,8 +2437,9 @@ retry:
|
||||
*/
|
||||
FOR_ALL_TAB_WINDOWS(tp, wp)
|
||||
win_free_lsize(wp);
|
||||
if (aucmd_win != NULL)
|
||||
win_free_lsize(aucmd_win);
|
||||
for (int i = 0; i < AUCMD_WIN_COUNT; ++i)
|
||||
if (aucmd_win[i].auc_win_used)
|
||||
win_free_lsize(aucmd_win[i].auc_win);
|
||||
#ifdef FEAT_PROP_POPUP
|
||||
// global popup windows
|
||||
FOR_ALL_POPUPWINS(wp)
|
||||
@@ -2455,7 +2455,7 @@ retry:
|
||||
if (enc_utf8)
|
||||
{
|
||||
new_ScreenLinesUC = LALLOC_MULT(u8char_T, (Rows + 1) * Columns);
|
||||
for (i = 0; i < p_mco; ++i)
|
||||
for (int i = 0; i < p_mco; ++i)
|
||||
new_ScreenLinesC[i] = LALLOC_CLEAR_MULT(u8char_T,
|
||||
(Rows + 1) * Columns);
|
||||
}
|
||||
@@ -2482,9 +2482,14 @@ retry:
|
||||
goto give_up;
|
||||
}
|
||||
}
|
||||
if (aucmd_win != NULL && aucmd_win->w_lines == NULL
|
||||
&& win_alloc_lines(aucmd_win) == FAIL)
|
||||
outofmem = TRUE;
|
||||
for (int i = 0; i < AUCMD_WIN_COUNT; ++i)
|
||||
if (aucmd_win[i].auc_win_used
|
||||
&& aucmd_win[i].auc_win->w_lines == NULL
|
||||
&& win_alloc_lines(aucmd_win[i].auc_win) == FAIL)
|
||||
{
|
||||
outofmem = TRUE;
|
||||
break;
|
||||
}
|
||||
#ifdef FEAT_PROP_POPUP
|
||||
// global popup windows
|
||||
FOR_ALL_POPUPWINS(wp)
|
||||
@@ -2505,11 +2510,15 @@ retry:
|
||||
|
||||
give_up:
|
||||
|
||||
for (i = 0; i < p_mco; ++i)
|
||||
int found_null = FALSE;
|
||||
for (int i = 0; i < p_mco; ++i)
|
||||
if (new_ScreenLinesC[i] == NULL)
|
||||
{
|
||||
found_null = TRUE;
|
||||
break;
|
||||
}
|
||||
if (new_ScreenLines == NULL
|
||||
|| (enc_utf8 && (new_ScreenLinesUC == NULL || i != p_mco))
|
||||
|| (enc_utf8 && (new_ScreenLinesUC == NULL || found_null))
|
||||
|| (enc_dbcs == DBCS_JPNU && new_ScreenLines2 == NULL)
|
||||
|| new_ScreenAttrs == NULL
|
||||
|| new_ScreenCols == NULL
|
||||
@@ -2534,7 +2543,7 @@ give_up:
|
||||
}
|
||||
VIM_CLEAR(new_ScreenLines);
|
||||
VIM_CLEAR(new_ScreenLinesUC);
|
||||
for (i = 0; i < p_mco; ++i)
|
||||
for (int i = 0; i < p_mco; ++i)
|
||||
VIM_CLEAR(new_ScreenLinesC[i]);
|
||||
VIM_CLEAR(new_ScreenLines2);
|
||||
VIM_CLEAR(new_ScreenAttrs);
|
||||
@@ -2571,7 +2580,7 @@ give_up:
|
||||
{
|
||||
(void)vim_memset(new_ScreenLinesUC + new_row * Columns,
|
||||
0, (size_t)Columns * sizeof(u8char_T));
|
||||
for (i = 0; i < p_mco; ++i)
|
||||
for (int i = 0; i < p_mco; ++i)
|
||||
(void)vim_memset(new_ScreenLinesC[i]
|
||||
+ new_row * Columns,
|
||||
0, (size_t)Columns * sizeof(u8char_T));
|
||||
@@ -2603,7 +2612,7 @@ give_up:
|
||||
mch_memmove(new_ScreenLinesUC + new_LineOffset[new_row],
|
||||
ScreenLinesUC + LineOffset[old_row],
|
||||
(size_t)len * sizeof(u8char_T));
|
||||
for (i = 0; i < p_mco; ++i)
|
||||
for (int i = 0; i < p_mco; ++i)
|
||||
mch_memmove(new_ScreenLinesC[i]
|
||||
+ new_LineOffset[new_row],
|
||||
ScreenLinesC[i] + LineOffset[old_row],
|
||||
@@ -2636,7 +2645,7 @@ give_up:
|
||||
// NOTE: this may result in all pointers to become NULL.
|
||||
ScreenLines = new_ScreenLines;
|
||||
ScreenLinesUC = new_ScreenLinesUC;
|
||||
for (i = 0; i < p_mco; ++i)
|
||||
for (int i = 0; i < p_mco; ++i)
|
||||
ScreenLinesC[i] = new_ScreenLinesC[i];
|
||||
Screen_mco = p_mco;
|
||||
ScreenLines2 = new_ScreenLines2;
|
||||
|
Reference in New Issue
Block a user