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()\<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')
*** ../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 -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220911203701.EB6131C0CF3%40moolenaar.net.

Raspunde prin e-mail lui