console.lua: close when pressing enter with input.select

When you select an item, due to the submit handler being called
asynchronously, the default item list is redrawn before the console
closes, which is jarring. Fix this by always closing the console as soon
as enter is pressed, as keeping it open is unlikely to be useful with a
fuzzy selector (unlike with input.get() where it can be used e.g. to
implement a Lua REPL). If desired we can later add a close_on_submit
flag defaulting to true.

Also fix a crash when pressing enter without any match.
This commit is contained in:
Guido Cella 2024-05-12 21:17:46 +02:00 committed by Kacper Michajłow
parent 30fd3c1a96
commit 367a6b561a
2 changed files with 11 additions and 5 deletions

View File

@ -970,8 +970,9 @@ REPL.
``submit`` ``submit``
The callback invoked when the user presses Enter. The first argument is The callback invoked when the user presses Enter. The first argument is
the 1-based index of the selected item. You can close the console from the 1-based index of the selected item. Unlike with ``input.get()``, the
within the callback by calling ``input.terminate()``. console is automatically closed on submit without having to call
``input.terminate()``.
Example: Example:
@ -984,7 +985,6 @@ REPL.
}, },
submit = function (id) submit = function (id)
mp.commandv("playlist-play-index", id - 1) mp.commandv("playlist-play-index", id - 1)
input.terminate()
end, end,
}) })

View File

@ -798,9 +798,15 @@ function handle_enter()
history_add(line) history_add(line)
end end
if input_caller then if selectable_items then
if #matches > 0 then
mp.commandv('script-message-to', input_caller, 'input-event', 'submit',
utils.format_json({matches[selected_match].index}))
end
set_active(false)
elseif input_caller then
mp.commandv('script-message-to', input_caller, 'input-event', 'submit', mp.commandv('script-message-to', input_caller, 'input-event', 'submit',
utils.format_json({selectable_items and matches[selected_match].index or line})) utils.format_json({line}))
else else
-- match "help [<text>]", return <text> or "", strip all whitespace -- match "help [<text>]", return <text> or "", strip all whitespace
local help = line:match('^%s*help%s+(.-)%s*$') or local help = line:match('^%s*help%s+(.-)%s*$') or