diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-11-28 18:51:43 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-11-28 18:51:43 +0000 |
commit | e76062c078debed0df818f70e4db14ad7a7cb53a (patch) | |
tree | e43b3b076fdea909c460219e896237a8924ccb6b /src/screen.c | |
parent | 74a694dbe20bb7dea4e06f474cf62e20f9c92f1d (diff) | |
download | vim-git-e76062c078debed0df818f70e4db14ad7a7cb53a.tar.gz |
patch 9.0.0965: using one window for executing autocommands is insufficientv9.0.0965
Problem: Using one window for executing autocommands is insufficient.
Solution: Use up to five windows for executing autocommands.
Diffstat (limited to 'src/screen.c')
-rw-r--r-- | src/screen.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/src/screen.c b/src/screen.c index 47288118c..7c3a6d7b0 100644 --- a/src/screen.c +++ b/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; |