mirror of
https://github.com/neovim/neovim
synced 2025-07-20 12:32:28 +00:00
fix(tui): handle cursor visibility properly (#26091)
The test is for the case without 'termsync' because libvterm doesn't support synchronized output, and it passes without this PR.
This commit is contained in:
@ -1158,14 +1158,6 @@ void tui_set_mode(TUIData *tui, ModeShape mode)
|
|||||||
unibi_out_ext(tui, tui->unibi_ext.reset_cursor_color);
|
unibi_out_ext(tui, tui->unibi_ext.reset_cursor_color);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tui->want_invisible && !tui->is_invisible) {
|
|
||||||
unibi_out(tui, unibi_cursor_invisible);
|
|
||||||
tui->is_invisible = true;
|
|
||||||
} else if (!tui->want_invisible && tui->is_invisible) {
|
|
||||||
unibi_out(tui, unibi_cursor_normal);
|
|
||||||
tui->is_invisible = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int shape;
|
int shape;
|
||||||
switch (c.shape) {
|
switch (c.shape) {
|
||||||
case SHAPE_BLOCK:
|
case SHAPE_BLOCK:
|
||||||
@ -1305,8 +1297,9 @@ static void tui_flush_start(TUIData *tui)
|
|||||||
if (tui->sync_output && tui->unibi_ext.sync != -1) {
|
if (tui->sync_output && tui->unibi_ext.sync != -1) {
|
||||||
UNIBI_SET_NUM_VAR(tui->params[0], 1);
|
UNIBI_SET_NUM_VAR(tui->params[0], 1);
|
||||||
unibi_out_ext(tui, tui->unibi_ext.sync);
|
unibi_out_ext(tui, tui->unibi_ext.sync);
|
||||||
} else {
|
} else if (!tui->is_invisible) {
|
||||||
unibi_out(tui, unibi_cursor_invisible);
|
unibi_out(tui, unibi_cursor_invisible);
|
||||||
|
tui->is_invisible = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1318,8 +1311,14 @@ static void tui_flush_end(TUIData *tui)
|
|||||||
if (tui->sync_output && tui->unibi_ext.sync != -1) {
|
if (tui->sync_output && tui->unibi_ext.sync != -1) {
|
||||||
UNIBI_SET_NUM_VAR(tui->params[0], 0);
|
UNIBI_SET_NUM_VAR(tui->params[0], 0);
|
||||||
unibi_out_ext(tui, tui->unibi_ext.sync);
|
unibi_out_ext(tui, tui->unibi_ext.sync);
|
||||||
} else if (!tui->busy && !tui->want_invisible) {
|
}
|
||||||
|
bool should_invisible = tui->busy || tui->want_invisible;
|
||||||
|
if (tui->is_invisible && !should_invisible) {
|
||||||
unibi_out(tui, unibi_cursor_normal);
|
unibi_out(tui, unibi_cursor_normal);
|
||||||
|
tui->is_invisible = false;
|
||||||
|
} else if (!tui->is_invisible && should_invisible) {
|
||||||
|
unibi_out(tui, unibi_cursor_invisible);
|
||||||
|
tui->is_invisible = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1785,6 +1785,31 @@ describe('TUI', function()
|
|||||||
{3:-- TERMINAL --} |
|
{3:-- TERMINAL --} |
|
||||||
]])
|
]])
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('supports hiding cursor', function()
|
||||||
|
child_session:request('nvim_command',
|
||||||
|
"let g:id = jobstart([v:progpath, '--clean', '--headless'])")
|
||||||
|
feed_data(':call jobwait([g:id])\n')
|
||||||
|
screen:expect([[
|
||||||
|
|
|
||||||
|
{4:~ }|
|
||||||
|
{4:~ }|
|
||||||
|
{4:~ }|
|
||||||
|
{5:[No Name] }|
|
||||||
|
:call jobwait([g:id]) |
|
||||||
|
{3:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
feed_data('\003')
|
||||||
|
screen:expect([[
|
||||||
|
{1: } |
|
||||||
|
{4:~ }|
|
||||||
|
{4:~ }|
|
||||||
|
{4:~ }|
|
||||||
|
{5:[No Name] }|
|
||||||
|
Type :qa and press <Enter> to exit Nvim |
|
||||||
|
{3:-- TERMINAL --} |
|
||||||
|
]])
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('TUI', function()
|
describe('TUI', function()
|
||||||
|
Reference in New Issue
Block a user