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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -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
|
||||||
|
@@ -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);
|
||||||
|
36
src/term.c
36
src/term.c
@@ -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.
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user