summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-09-11 21:36:17 +0100
committerBram Moolenaar <Bram@vim.org>2022-09-11 21:36:17 +0100
commitcf0995d7d7301e36c81cafa14e68782f1d3be2ad (patch)
treeb43bbb3633a186f9b80bb3285b357ef515acc2bd
parent87e74d0e03c6c0267546b2e3a49316f3e84d9794 (diff)
patch 9.0.0447: using :echowin while at the hit-enter prompt causes problemsv9.0.0447
Problem: Using :echowin while at the hit-enter prompt causes problems. Solution: Do not prompt for :echowin. Postpone showing the message window. Start the timer when the window is displayed.
-rw-r--r--src/ex_getln.c3
-rw-r--r--src/message.c4
-rw-r--r--src/popupwin.c27
-rw-r--r--src/screen.c8
-rw-r--r--src/testdir/dumps/Test_echowindow_6.dump8
-rw-r--r--src/testdir/dumps/Test_echowindow_7.dump8
-rw-r--r--src/testdir/test_messages.vim32
-rw-r--r--src/version.c2
8 files changed, 85 insertions, 7 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c
index d425b3effb..f9226de6e4 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -3890,7 +3890,8 @@ redrawcmd(void)
void
compute_cmdrow(void)
{
- if (exmode_active || msg_scrolled != 0)
+ // ignore "msg_scrolled" in update_screen(), it will be reset soon.
+ if (exmode_active || (msg_scrolled != 0 && !updating_screen))
cmdline_row = Rows - 1;
else
cmdline_row = W_WINROW(lastwin) + lastwin->w_height
diff --git a/src/message.c b/src/message.c
index e401882d1a..b68c089747 100644
--- a/src/message.c
+++ b/src/message.c
@@ -1157,6 +1157,10 @@ wait_return(int redraw)
// need_wait_return to do it later.
if (msg_silent != 0)
return;
+#ifdef HAS_MESSAGE_WINDOW
+ if (in_echowindow)
+ return;
+#endif
/*
* When inside vgetc(), we can't wait for a typed character at all.
diff --git a/src/popupwin.c b/src/popupwin.c
index d02196ef50..fce4a2b811 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -31,6 +31,13 @@ static poppos_entry_T poppos_entries[] = {
#ifdef HAS_MESSAGE_WINDOW
// Window used for ":echowindow"
static win_T *message_win = NULL;
+
+// Flag set when a message is added to the message window, timer is started
+// when the message window is drawn. This might be after pressing Enter at the
+// hit-enter prompt.
+static int start_message_win_timer = FALSE;
+
+static void may_start_message_win_timer(win_T *wp);
#endif
static void popup_adjust_position(win_T *wp);
@@ -4268,6 +4275,11 @@ update_popups(void (*win_update)(win_T *wp))
// Back to the normal zindex.
screen_zindex = 0;
+
+#ifdef HAS_MESSAGE_WINDOW
+ // if this was the message window popup may start the timer now
+ may_start_message_win_timer(wp);
+#endif
}
#if defined(FEAT_SEARCH_EXTRA)
@@ -4513,8 +4525,18 @@ popup_show_message_win(void)
popup_update_color(message_win, TYPE_MESSAGE_WIN);
popup_show(message_win);
}
+ start_message_win_timer = TRUE;
+ }
+}
+
+ static void
+may_start_message_win_timer(win_T *wp)
+{
+ if (wp == message_win && start_message_win_timer)
+ {
if (message_win->w_popup_timer != NULL)
timer_start(message_win->w_popup_timer);
+ start_message_win_timer = FALSE;
}
}
@@ -4552,8 +4574,9 @@ end_echowindow(void)
{
in_echowindow = FALSE;
- // show the message window now
- redraw_cmd(FALSE);
+ if ((State & MODE_HITRETURN) == 0)
+ // show the message window now
+ redraw_cmd(FALSE);
// do not overwrite messages
// TODO: only for message window
diff --git a/src/screen.c b/src/screen.c
index 12377d56bf..27f4848378 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -3038,18 +3038,18 @@ screenclear2(int doclear)
screen_cleared = TRUE; // can use contents of ScreenLines now
win_rest_invalid(firstwin); // redraw all regular windows
-#ifdef FEAT_PROP_POPUP
- popup_redraw_all(); // redraw all popup windows
-#endif
redraw_cmdline = TRUE;
redraw_tabline = TRUE;
if (must_redraw == UPD_CLEAR) // no need to clear again
must_redraw = UPD_NOT_VALID;
+ msg_scrolled = 0; // compute_cmdrow() uses this
compute_cmdrow();
+#ifdef FEAT_PROP_POPUP
+ popup_redraw_all(); // redraw all popup windows
+#endif
msg_row = cmdline_row; // put cursor on last line for messages
msg_col = 0;
screen_start(); // don't know where cursor is now
- msg_scrolled = 0; // can't scroll back
msg_didany = FALSE;
msg_didout = FALSE;
}
diff --git a/src/testdir/dumps/Test_echowindow_6.dump b/src/testdir/dumps/Test_echowindow_6.dump
new file mode 100644
index 0000000000..3bf63038a0
--- /dev/null
+++ b/src/testdir/dumps/Test_echowindow_6.dump
@@ -0,0 +1,8 @@
+|~+0#4040ff13#ffffff0| @73
+|~| @73
+|~| @73
+|~| @73
+|o+0#0000000&|n|e| @71
+|t|w|o| @71
+|t|h|r|e@1| @69
+|P+0#00e0003&|r|e|s@1| |E|N|T|E|R| |o|r| |t|y|p|e| |c|o|m@1|a|n|d| |t|o| |c|o|n|t|i|n|u|e> +0#0000000&@35
diff --git a/src/testdir/dumps/Test_echowindow_7.dump b/src/testdir/dumps/Test_echowindow_7.dump
new file mode 100644
index 0000000000..774495f479
--- /dev/null
+++ b/src/testdir/dumps/Test_echowindow_7.dump
@@ -0,0 +1,8 @@
+>s+0&#ffffff0|o|m|e| |t|e|x|t| @65
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|═+0#e000002&@74
+|l|a|t|e|r| |m|e|s@1|a|g|e| @61
+| +0#0000000&@74
+@57|1|,|1| @10|A|l@1|
diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim
index 4a2deae1e6..6dc9a5b801 100644
--- a/src/testdir/test_messages.vim
+++ b/src/testdir/test_messages.vim
@@ -401,6 +401,28 @@ func Test_echowindow()
echowindow 'line' n
endfor
endfunc
+
+ def TwoMessages()
+ popup_clear()
+ set cmdheight=2
+ redraw
+ timer_start(100, (_) => {
+ echowin 'message'
+ })
+ echo 'one'
+ echo 'two'
+ enddef
+
+ def ThreeMessages()
+ popup_clear()
+ redraw
+ timer_start(100, (_) => {
+ echowin 'later message'
+ })
+ echo 'one'
+ echo 'two'
+ echo 'three'
+ enddef
END
call writefile(lines, 'XtestEchowindow')
let buf = RunVimInTerminal('-S XtestEchowindow', #{rows: 8})
@@ -415,6 +437,16 @@ func Test_echowindow()
call term_sendkeys(buf, ":call ManyMessages()\<CR>")
call VerifyScreenDump(buf, 'Test_echowindow_4', {})
+ call term_sendkeys(buf, ":call TwoMessages()\<CR>")
+ call VerifyScreenDump(buf, 'Test_echowindow_5', {})
+
+ call term_sendkeys(buf, ":call ThreeMessages()\<CR>")
+ sleep 120m
+ call VerifyScreenDump(buf, 'Test_echowindow_6', {})
+
+ call term_sendkeys(buf, "\<CR>")
+ call VerifyScreenDump(buf, 'Test_echowindow_7', {})
+
" clean up
call StopVimInTerminal(buf)
call delete('XtestEchowindow')
diff --git a/src/version.c b/src/version.c
index 8da83dbc80..da11368ed5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 447,
+/**/
446,
/**/
445,