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