patch 9.0.0351: message window may obscure the command line

Problem:    Message window may obscure the command line.
Solution:   Reduce the maximum height of the message window.
diff --git a/src/eval.c b/src/eval.c
index 2e8d938..f55d9de 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -6729,7 +6729,8 @@
 
     ga_init2(&ga, 1, 80);
 #ifdef HAS_MESSAGE_WINDOW
-    in_echowindow = (eap->cmdidx == CMD_echowindow);
+    if (eap->cmdidx == CMD_echowindow)
+	start_echowindow();
 #endif
 
     if (eap->skip)
@@ -6833,17 +6834,7 @@
 	--emsg_skip;
 #ifdef HAS_MESSAGE_WINDOW
     if (eap->cmdidx == CMD_echowindow)
-    {
-	// show the message window now
-	ex_redraw(eap);
-
-	// do not overwrite messages
-	// TODO: only for message window
-	msg_didout = TRUE;
-	if (msg_col == 0)
-	    msg_col = 1;
-	in_echowindow = FALSE;
-    }
+	end_echowindow();
 #endif
     set_nextcmd(eap, arg);
 }
diff --git a/src/popupwin.c b/src/popupwin.c
index 72d38787..8688f3e 100644
--- a/src/popupwin.c
+++ b/src/popupwin.c
@@ -1356,6 +1356,8 @@
 
     if (wp->w_maxheight > 0)
 	maxheight = wp->w_maxheight;
+    else if (wp->w_popup_pos == POPPOS_BOTTOM)
+	maxheight = cmdline_row - 1;
 
     // start at the desired first line
     if (wp->w_firstline > 0)
@@ -4479,6 +4481,7 @@
 	message_win->w_popup_pos = POPPOS_BOTTOM;
 	message_win->w_wantcol = 1;
 	message_win->w_minwidth = 9999;
+	message_win->w_firstline = -1;
 
 	// no padding, border at the top
 	for (i = 0; i < 4; ++i)
diff --git a/src/testdir/dumps/Test_echowindow_4.dump b/src/testdir/dumps/Test_echowindow_4.dump
new file mode 100644
index 0000000..b674e9e
--- /dev/null
+++ b/src/testdir/dumps/Test_echowindow_4.dump
@@ -0,0 +1,8 @@
+>═+0#e000002#ffffff0@74
+|l|i|n|e| |1|4| @67
+|l|i|n|e| |1|5| @67
+|l|i|n|e| |1|6| @67
+|l|i|n|e| |1|7| @67
+|l|i|n|e| |1|8| @67
+|l|i|n|e| |1|9| @67
+| +0#0000000&@56|1|,|1| @10|A|l@1| 
diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim
index 6bdaedf..10af69c 100644
--- a/src/testdir/test_messages.vim
+++ b/src/testdir/test_messages.vim
@@ -396,6 +396,11 @@
         echowindow a:arg
       endfunc
       echowindow 'first line'
+      func ManyMessages()
+        for n in range(20)
+          echowindow 'line' n
+        endfor
+      endfunc
   END
   call writefile(lines, 'XtestEchowindow')
   let buf = RunVimInTerminal('-S XtestEchowindow', #{rows: 8})
@@ -407,6 +412,9 @@
   call term_sendkeys(buf, ":call popup_clear()\<CR>")
   call VerifyScreenDump(buf, 'Test_echowindow_3', {})
 
+  call term_sendkeys(buf, ":call ManyMessages()\<CR>")
+  call VerifyScreenDump(buf, 'Test_echowindow_4', {})
+
   " clean up
   call StopVimInTerminal(buf)
   call delete('XtestEchowindow')
diff --git a/src/version.c b/src/version.c
index f7d7d62..4c05bb0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -708,6 +708,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    351,
+/**/
     350,
 /**/
     349,