mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
screen: disable redrawing inside VimResized
Note: test doesn't fail on master. I cannot reproduce the glitches with -u NONE, probably it requires interfering events. But add some coverage for these checks at least.
This commit is contained in:
parent
0d82aaf586
commit
51a451570d
@ -153,6 +153,8 @@ static bool conceal_cursor_used = false;
|
|||||||
|
|
||||||
static bool redraw_popupmenu = false;
|
static bool redraw_popupmenu = false;
|
||||||
|
|
||||||
|
static bool resizing = false;
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
# include "screen.c.generated.h"
|
# include "screen.c.generated.h"
|
||||||
#endif
|
#endif
|
||||||
@ -275,7 +277,9 @@ int update_screen(int type)
|
|||||||
int did_one;
|
int did_one;
|
||||||
|
|
||||||
// Don't do anything if the screen structures are (not yet) valid.
|
// Don't do anything if the screen structures are (not yet) valid.
|
||||||
if (!default_grid.chars) {
|
// A VimResized autocmd can invoke redrawing in the middle of a resize,
|
||||||
|
// which would bypass the checks in screen_resize for popupmenu etc.
|
||||||
|
if (!default_grid.chars || resizing) {
|
||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5989,7 +5993,14 @@ void grid_assign_handle(ScreenGrid *grid)
|
|||||||
/// needed.
|
/// needed.
|
||||||
void screenalloc(void)
|
void screenalloc(void)
|
||||||
{
|
{
|
||||||
static bool entered = false; // avoid recursiveness
|
// It's possible that we produce an out-of-memory message below, which
|
||||||
|
// will cause this function to be called again. To break the loop, just
|
||||||
|
// return here.
|
||||||
|
if (resizing) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resizing = true;
|
||||||
|
|
||||||
int retry_count = 0;
|
int retry_count = 0;
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
@ -6003,18 +6014,10 @@ retry:
|
|||||||
|| Rows == 0
|
|| Rows == 0
|
||||||
|| Columns == 0
|
|| Columns == 0
|
||||||
|| (!full_screen && default_grid.chars == NULL)) {
|
|| (!full_screen && default_grid.chars == NULL)) {
|
||||||
|
resizing = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* It's possible that we produce an out-of-memory message below, which
|
|
||||||
* will cause this function to be called again. To break the loop, just
|
|
||||||
* return here.
|
|
||||||
*/
|
|
||||||
if (entered)
|
|
||||||
return;
|
|
||||||
entered = TRUE;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note that the window sizes are updated before reallocating the arrays,
|
* Note that the window sizes are updated before reallocating the arrays,
|
||||||
* thus we must not redraw here!
|
* thus we must not redraw here!
|
||||||
@ -6055,8 +6058,7 @@ retry:
|
|||||||
|
|
||||||
must_redraw = CLEAR; // need to clear the screen later
|
must_redraw = CLEAR; // need to clear the screen later
|
||||||
|
|
||||||
entered = FALSE;
|
RedrawingDisabled--;
|
||||||
--RedrawingDisabled;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do not apply autocommands more than 3 times to avoid an endless loop
|
* Do not apply autocommands more than 3 times to avoid an endless loop
|
||||||
@ -6068,6 +6070,8 @@ retry:
|
|||||||
* jump back to check if we need to allocate the screen again. */
|
* jump back to check if we need to allocate the screen again. */
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resizing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void grid_alloc(ScreenGrid *grid, int rows, int columns, bool copy, bool valid)
|
void grid_alloc(ScreenGrid *grid, int rows, int columns, bool copy, bool valid)
|
||||||
|
@ -1152,6 +1152,50 @@ describe('builtin popupmenu', function()
|
|||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('behaves correcty with VimResized autocmd', function()
|
||||||
|
feed('isome long prefix before the ')
|
||||||
|
command("set completeopt+=noinsert,noselect")
|
||||||
|
command("autocmd VimResized * redraw!")
|
||||||
|
command("set linebreak")
|
||||||
|
funcs.complete(29, {'word', 'choice', 'text', 'thing'})
|
||||||
|
screen:expect([[
|
||||||
|
some long prefix before the ^ |
|
||||||
|
{1:~ }{n: word }|
|
||||||
|
{1:~ }{n: choice}|
|
||||||
|
{1:~ }{n: text }|
|
||||||
|
{1:~ }{n: thing }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{2:-- INSERT --} |
|
||||||
|
]])
|
||||||
|
|
||||||
|
screen:try_resize(16,10)
|
||||||
|
screen:expect([[
|
||||||
|
some long |
|
||||||
|
prefix before |
|
||||||
|
the ^ |
|
||||||
|
{1:~ }{n: word }|
|
||||||
|
{1:~ }{n: choice }|
|
||||||
|
{1:~ }{n: text }|
|
||||||
|
{1:~ }{n: thing }|
|
||||||
|
{1:~ }|
|
||||||
|
{1:~ }|
|
||||||
|
{2:-- INSERT --} |
|
||||||
|
]])
|
||||||
|
end)
|
||||||
|
|
||||||
it('works with rightleft window', function()
|
it('works with rightleft window', function()
|
||||||
command("set rl")
|
command("set rl")
|
||||||
feed('isome rightleft ')
|
feed('isome rightleft ')
|
||||||
|
Loading…
Reference in New Issue
Block a user