patch 8.1.1558: popup_menu() and popup_filter_menu() are not implemented yet

Problem:    Popup_menu() and popup_filter_menu() are not implemented yet.
Solution:   Implement the functions. Fix that centering didn't take the border
            and padding into account.
diff --git a/src/testdir/dumps/Test_popupwin_drag_01.dump b/src/testdir/dumps/Test_popupwin_drag_01.dump
index e47fbc4..c8867e3 100644
--- a/src/testdir/dumps/Test_popupwin_drag_01.dump
+++ b/src/testdir/dumps/Test_popupwin_drag_01.dump
@@ -3,8 +3,8 @@
 |3| @73
 |4| @73
 |5| @73
-|6| @32|╔+0#0000001#ffd7ff255|═@5|╗| +0#0000000#ffffff0@32
-|7| @32|║+0#0000001#ffd7ff255|1@3| @1|║| +0#0000000#ffffff0@32
-|8| @32|║+0#0000001#ffd7ff255|2@5|║| +0#0000000#ffffff0@32
-|9| @32|║+0#0000001#ffd7ff255|3@4| |║| +0#0000000#ffffff0@32
-@34|╚+0#0000001#ffd7ff255|═@5|╝| +0#0000000#ffffff0@14|1|,|1| @10|T|o|p| 
+|6| @31|╔+0#0000001#ffd7ff255|═@5|╗| +0#0000000#ffffff0@33
+|7| @31|║+0#0000001#ffd7ff255|1@3| @1|║| +0#0000000#ffffff0@33
+|8| @31|║+0#0000001#ffd7ff255|2@5|║| +0#0000000#ffffff0@33
+|9| @31|║+0#0000001#ffd7ff255|3@4| |║| +0#0000000#ffffff0@33
+@33|╚+0#0000001#ffd7ff255|═@5|╝| +0#0000000#ffffff0@15|1|,|1| @10|T|o|p| 
diff --git a/src/testdir/dumps/Test_popupwin_drag_02.dump b/src/testdir/dumps/Test_popupwin_drag_02.dump
index 7e8c30e..f03ecb8 100644
--- a/src/testdir/dumps/Test_popupwin_drag_02.dump
+++ b/src/testdir/dumps/Test_popupwin_drag_02.dump
@@ -1,9 +1,9 @@
 >1+0&#ffffff0| @73
-|2| @32|╔+0#0000001#ffd7ff255|═@5|╗| +0#0000000#ffffff0@32
-|3| @32|║+0#0000001#ffd7ff255|1@3| @1|║| +0#0000000#ffffff0@32
-|4| @32|║+0#0000001#ffd7ff255|2@5|║| +0#0000000#ffffff0@32
-|5| @32|║+0#0000001#ffd7ff255|3@4| |║| +0#0000000#ffffff0@32
-|6| @32|╚+0#0000001#ffd7ff255|═@5|╝| +0#0000000#ffffff0@32
+|2| @31|╔+0#0000001#ffd7ff255|═@5|╗| +0#0000000#ffffff0@33
+|3| @31|║+0#0000001#ffd7ff255|1@3| @1|║| +0#0000000#ffffff0@33
+|4| @31|║+0#0000001#ffd7ff255|2@5|║| +0#0000000#ffffff0@33
+|5| @31|║+0#0000001#ffd7ff255|3@4| |║| +0#0000000#ffffff0@33
+|6| @31|╚+0#0000001#ffd7ff255|═@5|╝| +0#0000000#ffffff0@33
 |7| @73
 |8| @73
 |9| @73
diff --git a/src/testdir/dumps/Test_popupwin_menu_01.dump b/src/testdir/dumps/Test_popupwin_menu_01.dump
new file mode 100644
index 0000000..debd962
--- /dev/null
+++ b/src/testdir/dumps/Test_popupwin_menu_01.dump
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @30|╔+0#0000001#ffd7ff255|═@8|╗| +0#0000000#ffffff0@31
+|3| @30|║+0#0000001#ffd7ff255| @8|║| +0#0000000#ffffff0@31
+|4| @30|║+0#0000001#ffd7ff255| |o+0#0000000#5fd7ff255|n|e| +0#0000001#ffd7ff255@4|║| +0#0000000#ffffff0@31
+|5| @30|║+0#0000001#ffd7ff255| |t|w|o| @4|║| +0#0000000#ffffff0@31
+|6| @30|║+0#0000001#ffd7ff255| |a|n|o|t|h|e|r| |║| +0#0000000#ffffff0@31
+|7| @30|║+0#0000001#ffd7ff255| @8|║| +0#0000000#ffffff0@31
+|8| @30|╚+0#0000001#ffd7ff255|═@8|╝| +0#0000000#ffffff0@31
+|9| @73
+@57|1|,|1| @10|T|o|p| 
diff --git a/src/testdir/dumps/Test_popupwin_menu_02.dump b/src/testdir/dumps/Test_popupwin_menu_02.dump
new file mode 100644
index 0000000..2495edf
--- /dev/null
+++ b/src/testdir/dumps/Test_popupwin_menu_02.dump
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @30|╔+0#0000001#ffd7ff255|═@8|╗| +0#0000000#ffffff0@31
+|3| @30|║+0#0000001#ffd7ff255| @8|║| +0#0000000#ffffff0@31
+|4| @30|║+0#0000001#ffd7ff255| |o|n|e| @4|║| +0#0000000#ffffff0@31
+|5| @30|║+0#0000001#ffd7ff255| |t|w|o| @4|║| +0#0000000#ffffff0@31
+|6| @30|║+0#0000001#ffd7ff255| |a+0#0000000#5fd7ff255|n|o|t|h|e|r| +0#0000001#ffd7ff255|║| +0#0000000#ffffff0@31
+|7| @30|║+0#0000001#ffd7ff255| @8|║| +0#0000000#ffffff0@31
+|8| @30|╚+0#0000001#ffd7ff255|═@8|╝| +0#0000000#ffffff0@31
+|9| @73
+@57|1|,|1| @10|T|o|p| 
diff --git a/src/testdir/dumps/Test_popupwin_menu_03.dump b/src/testdir/dumps/Test_popupwin_menu_03.dump
new file mode 100644
index 0000000..1aa7fe8
--- /dev/null
+++ b/src/testdir/dumps/Test_popupwin_menu_03.dump
@@ -0,0 +1,10 @@
+>1+0&#ffffff0| @73
+|2| @73
+|3| @73
+|4| @73
+|5| @73
+|6| @73
+|7| @73
+|8| @73
+|9| @73
+|s|e|l|e|c|t|e|d| |3| @46|1|,|1| @10|T|o|p| 
diff --git a/src/testdir/test_popupwin.vim b/src/testdir/test_popupwin.vim
index ebe2400..477cda3 100644
--- a/src/testdir/test_popupwin.vim
+++ b/src/testdir/test_popupwin.vim
@@ -902,6 +902,64 @@
   delfunc QuitCallback
 endfunc
 
+func ShowMenu(key, result)
+  let s:cb_res = 999
+  let winid = popup_menu(['one', 'two', 'something else'], {
+	  \ 'callback': 'QuitCallback',
+	  \ })
+  redraw
+  call feedkeys(a:key, "xt")
+  call assert_equal(winid, s:cb_winid)
+  call assert_equal(a:result, s:cb_res)
+endfunc
+
+func Test_popup_menu()
+  func QuitCallback(id, res)
+    let s:cb_winid = a:id
+    let s:cb_res = a:res
+  endfunc
+
+  let winid = ShowMenu(" ", 1)
+  let winid = ShowMenu("j \<CR>", 2)
+  let winid = ShowMenu("JjK \<CR>", 2)
+  let winid = ShowMenu("jjjjjj ", 3)
+  let winid = ShowMenu("kkk ", 1)
+  let winid = ShowMenu("x", -1)
+  let winid = ShowMenu("X", -1)
+  let winid = ShowMenu("\<Esc>", -1)
+  let winid = ShowMenu("\<C-C>", -1)
+
+  delfunc QuitCallback
+endfunc
+
+func Test_popup_menu_screenshot()
+  if !CanRunVimInTerminal()
+    throw 'Skipped: cannot make screendumps'
+  endif
+
+  let lines =<< trim END
+	call setline(1, range(1, 20))
+	hi PopupSelected ctermbg=lightblue
+	call popup_menu(['one', 'two', 'another'], {'callback': 'MenuDone'})
+	func MenuDone(id, res)
+	  echomsg "selected " .. a:res
+	endfunc
+  END
+  call writefile(lines, 'XtestPopupMenu')
+  let buf = RunVimInTerminal('-S XtestPopupMenu', {'rows': 10})
+  call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
+
+  call term_sendkeys(buf, "jj")
+  call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
+
+  call term_sendkeys(buf, " ")
+  call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+  call delete('XtestPopupMenu')
+endfunc
+
 func Test_popup_close_callback()
   func PopupDone(id, result)
     let g:result = a:result