summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2021-04-11 13:29:18 +0200
committerBram Moolenaar <Bram@vim.org>2021-04-11 13:29:18 +0200
commit09f067fca38c9f89ad088e8c096c4df3998575e2 (patch)
tree4b6f8d96e2ddd80541748e2484e75c41abea0954
parentf93bbd026205f36915312193784f987ad49fb114 (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.c5
-rw-r--r--src/ex_docmd.c5
-rw-r--r--src/gui.c5
-rw-r--r--src/proto/term.pro3
-rw-r--r--src/term.c36
-rw-r--r--src/version.c2
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();
}
/*
diff --git a/src/gui.c b/src/gui.c
index 0265f7c964..c0374c561d 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -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,