diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-04-11 13:29:18 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-04-11 13:29:18 +0200 |
commit | 09f067fca38c9f89ad088e8c096c4df3998575e2 (patch) | |
tree | 4b6f8d96e2ddd80541748e2484e75c41abea0954 | |
parent | f93bbd026205f36915312193784f987ad49fb114 (diff) |
patch 8.2.2754: :sleep! does not always hide the cursorv8.2.2754
Problem: :sleep! does not always hide the cursor.
Solution: Add the cursor_is_asleep flag. (Jeremy Lerner, closes #8097,
closes #7998)
-rw-r--r-- | src/drawscreen.c | 5 | ||||
-rw-r--r-- | src/ex_docmd.c | 5 | ||||
-rw-r--r-- | src/gui.c | 5 | ||||
-rw-r--r-- | src/proto/term.pro | 3 | ||||
-rw-r--r-- | src/term.c | 36 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 52 insertions, 4 deletions
diff --git a/src/drawscreen.c b/src/drawscreen.c index 0e36e79173..7df4a96f0e 100644 --- a/src/drawscreen.c +++ b/src/drawscreen.c @@ -297,7 +297,9 @@ update_screen(int type_arg) // Remove the cursor before starting to do anything, because // scrolling may make it difficult to redraw the text under // 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_row = gui.cursor_row; @@ -306,7 +308,6 @@ update_screen(int type_arg) } } #endif - win_update(wp); } diff --git a/src/ex_docmd.c b/src/ex_docmd.c index c8cb11ba75..7c1c448551 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -7370,7 +7370,7 @@ do_sleep(long msec, int hide_cursor) # endif if (hide_cursor) - cursor_off(); + cursor_sleep(); else cursor_on(); @@ -7422,6 +7422,9 @@ do_sleep(long msec, int hide_cursor) // input buffer, otherwise a following call to input() fails. if (got_int) (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_undraw_cursor(); + + // If a cursor-less sleep is ongoing, leave the cursor invisible + if (cursor_is_sleeping()) + return; + if (gui.row < 0) return; #ifdef HAVE_INPUT_METHOD diff --git a/src/proto/term.pro b/src/proto/term.pro index 1b3780204b..efb2555343 100644 --- a/src/proto/term.pro +++ b/src/proto/term.pro @@ -56,6 +56,9 @@ void scroll_start(void); void cursor_on_force(void); void cursor_on(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_color(char_u *color); int blink_state_is_inverted(void); diff --git a/src/term.c b/src/term.c index ad52d1b315..0a4e5b758a 100644 --- a/src/term.c +++ b/src/term.c @@ -3932,8 +3932,12 @@ scroll_start(void) } } +// True if cursor is not visible 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. */ @@ -3942,6 +3946,7 @@ cursor_on_force(void) { out_str(T_VE); cursor_is_off = FALSE; + cursor_is_asleep = FALSE; } /* @@ -3950,7 +3955,7 @@ cursor_on_force(void) void cursor_on(void) { - if (cursor_is_off) + if (cursor_is_off && !cursor_is_asleep) 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) /* * Set cursor shape to match Insert or Replace mode. diff --git a/src/version.c b/src/version.c index c760738bea..d18c0f8216 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2754, +/**/ 2753, /**/ 2752, |