To: vim_dev@googlegroups.com Subject: Patch 9.0.0447 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 9.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. Files: src/message.c, src/popupwin.c, src/screen.c, src/ex_getln.c, src/testdir/test_messages.vim, src/testdir/dumps/Test_echowindow_6.dump, src/testdir/dumps/Test_echowindow_7.dump *** ../vim-9.0.0446/src/message.c 2022-09-01 17:01:28.580590542 +0100 --- src/message.c 2022-09-11 20:56:49.529840481 +0100 *************** *** 1157,1162 **** --- 1157,1166 ---- // 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. *** ../vim-9.0.0446/src/popupwin.c 2022-09-11 20:11:50.828861374 +0100 --- src/popupwin.c 2022-09-11 21:24:36.014176447 +0100 *************** *** 31,36 **** --- 31,43 ---- #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,4273 **** --- 4275,4285 ---- // 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,4520 **** --- 4525,4542 ---- 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,4559 **** { in_echowindow = FALSE; ! // show the message window now ! redraw_cmd(FALSE); // do not overwrite messages // TODO: only for message window --- 4574,4582 ---- { in_echowindow = FALSE; ! if ((State & MODE_HITRETURN) == 0) ! // show the message window now ! redraw_cmd(FALSE); // do not overwrite messages // TODO: only for message window *** ../vim-9.0.0446/src/screen.c 2022-08-31 14:46:07.911016920 +0100 --- src/screen.c 2022-09-11 21:08:08.892379953 +0100 *************** *** 3038,3055 **** 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; compute_cmdrow(); 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; } --- 3038,3055 ---- screen_cleared = TRUE; // can use contents of ScreenLines now win_rest_invalid(firstwin); // redraw all regular windows 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_didany = FALSE; msg_didout = FALSE; } *** ../vim-9.0.0446/src/ex_getln.c 2022-08-31 14:46:07.907016957 +0100 --- src/ex_getln.c 2022-09-11 21:11:54.747870089 +0100 *************** *** 3890,3896 **** void compute_cmdrow(void) { ! if (exmode_active || msg_scrolled != 0) cmdline_row = Rows - 1; else cmdline_row = W_WINROW(lastwin) + lastwin->w_height --- 3890,3897 ---- void compute_cmdrow(void) { ! // 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 *** ../vim-9.0.0446/src/testdir/test_messages.vim 2022-09-09 20:19:19.548094855 +0100 --- src/testdir/test_messages.vim 2022-09-11 21:33:27.394351725 +0100 *************** *** 401,406 **** --- 401,428 ---- 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,420 **** --- 437,452 ---- call term_sendkeys(buf, ":call ManyMessages()\") call VerifyScreenDump(buf, 'Test_echowindow_4', {}) + call term_sendkeys(buf, ":call TwoMessages()\") + call VerifyScreenDump(buf, 'Test_echowindow_5', {}) + + call term_sendkeys(buf, ":call ThreeMessages()\") + sleep 120m + call VerifyScreenDump(buf, 'Test_echowindow_6', {}) + + call term_sendkeys(buf, "\") + call VerifyScreenDump(buf, 'Test_echowindow_7', {}) + " clean up call StopVimInTerminal(buf) call delete('XtestEchowindow') *** ../vim-9.0.0446/src/testdir/dumps/Test_echowindow_6.dump 2022-09-11 21:35:11.026283950 +0100 --- src/testdir/dumps/Test_echowindow_6.dump 2022-09-11 21:28:06.778381788 +0100 *************** *** 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 *** ../vim-9.0.0446/src/testdir/dumps/Test_echowindow_7.dump 2022-09-11 21:35:11.030283949 +0100 --- src/testdir/dumps/Test_echowindow_7.dump 2022-09-11 21:28:07.930382316 +0100 *************** *** 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| *** ../vim-9.0.0446/src/version.c 2022-09-11 20:11:50.828861374 +0100 --- src/version.c 2022-09-11 20:59:33.793503111 +0100 *************** *** 705,706 **** --- 705,708 ---- { /* Add new patch number below this line */ + /**/ + 447, /**/ -- Microsoft is to software what McDonalds is to gourmet cooking /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///