0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.2754: :sleep! does not always hide the cursor

Problem:    :sleep! does not always hide the cursor.
Solution:   Add the cursor_is_asleep flag. (Jeremy Lerner, closes #8097,
            closes #7998)
This commit is contained in:
Bram Moolenaar
2021-04-11 13:29:18 +02:00
parent f93bbd0262
commit 09f067fca3
6 changed files with 52 additions and 4 deletions

View File

@@ -297,7 +297,9 @@ update_screen(int type_arg)
// Remove the cursor before starting to do anything, because // Remove the cursor before starting to do anything, because
// scrolling may make it difficult to redraw the text under // scrolling may make it difficult to redraw the text under
// it. // it.
if (gui.in_use && wp == curwin) // Also remove the cursor if it needs to be hidden due to an
// ongoing cursor-less sleep.
if (gui.in_use && (wp == curwin || cursor_is_sleeping()))
{ {
gui_cursor_col = gui.cursor_col; gui_cursor_col = gui.cursor_col;
gui_cursor_row = gui.cursor_row; gui_cursor_row = gui.cursor_row;
@@ -306,7 +308,6 @@ update_screen(int type_arg)
} }
} }
#endif #endif
win_update(wp); win_update(wp);
} }

View File

@@ -7370,7 +7370,7 @@ do_sleep(long msec, int hide_cursor)
# endif # endif
if (hide_cursor) if (hide_cursor)
cursor_off(); cursor_sleep();
else else
cursor_on(); cursor_on();
@@ -7422,6 +7422,9 @@ do_sleep(long msec, int hide_cursor)
// input buffer, otherwise a following call to input() fails. // input buffer, otherwise a following call to input() fails.
if (got_int) if (got_int)
(void)vpeekc(); (void)vpeekc();
if (hide_cursor)
cursor_unsleep();
} }
/* /*

View File

@@ -1120,6 +1120,11 @@ gui_update_cursor(
|| gui.row != gui.cursor_row || gui.col != gui.cursor_col) || gui.row != gui.cursor_row || gui.col != gui.cursor_col)
{ {
gui_undraw_cursor(); gui_undraw_cursor();
// If a cursor-less sleep is ongoing, leave the cursor invisible
if (cursor_is_sleeping())
return;
if (gui.row < 0) if (gui.row < 0)
return; return;
#ifdef HAVE_INPUT_METHOD #ifdef HAVE_INPUT_METHOD

View File

@@ -56,6 +56,9 @@ void scroll_start(void);
void cursor_on_force(void); void cursor_on_force(void);
void cursor_on(void); void cursor_on(void);
void cursor_off(void); void cursor_off(void);
int cursor_is_sleeping(void);
void cursor_sleep(void);
void cursor_unsleep(void);
void term_cursor_mode(int forced); void term_cursor_mode(int forced);
void term_cursor_color(char_u *color); void term_cursor_color(char_u *color);
int blink_state_is_inverted(void); int blink_state_is_inverted(void);

View File

@@ -3932,8 +3932,12 @@ scroll_start(void)
} }
} }
// True if cursor is not visible
static int cursor_is_off = FALSE; static int cursor_is_off = FALSE;
// True if cursor is not visible due to an ongoing cursor-less sleep
static int cursor_is_asleep = FALSE;
/* /*
* Enable the cursor without checking if it's already enabled. * Enable the cursor without checking if it's already enabled.
*/ */
@@ -3942,6 +3946,7 @@ cursor_on_force(void)
{ {
out_str(T_VE); out_str(T_VE);
cursor_is_off = FALSE; cursor_is_off = FALSE;
cursor_is_asleep = FALSE;
} }
/* /*
@@ -3950,7 +3955,7 @@ cursor_on_force(void)
void void
cursor_on(void) cursor_on(void)
{ {
if (cursor_is_off) if (cursor_is_off && !cursor_is_asleep)
cursor_on_force(); cursor_on_force();
} }
@@ -3967,6 +3972,35 @@ cursor_off(void)
} }
} }
/*
* Check whether the cursor is invisible due to an ongoing cursor-less sleep
*/
int
cursor_is_sleeping(void)
{
return cursor_is_asleep;
}
/*
* Disable the cursor and mark it disabled by cursor-less sleep
*/
void
cursor_sleep(void)
{
cursor_is_asleep = TRUE;
cursor_off();
}
/*
* Enable the cursor and mark it not disabled by cursor-less sleep
*/
void
cursor_unsleep(void)
{
cursor_is_asleep = FALSE;
cursor_on();
}
#if defined(CURSOR_SHAPE) || defined(PROTO) #if defined(CURSOR_SHAPE) || defined(PROTO)
/* /*
* Set cursor shape to match Insert or Replace mode. * Set cursor shape to match Insert or Replace mode.

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2754,
/**/ /**/
2753, 2753,
/**/ /**/