This makes changes to mp.input and console.lua so that every input.get request uses a unique script-message to handle input events. Previously, making new input.get requests shortly after the termination of a previous request made by the same script could cause a race condition where the input handler was closed but the new request was still being drawn in the UI. This was caused by the `closed` event for the previous request being received only after the new request was registered, hence closing the event handler for the new request instead. In addition, this commit makes the behaviour of calling input.get while another request is active more consistent. When a new request is received it overwrites the in-progress request, sending a `closed` event. However, previously, the `closed` event could not be sent if both requests came from the same script, as the new request would have overwritten the event handler. Now, the `closed` event is called regardless of where the new request comes from.
92 lines
2.6 KiB
Lua
92 lines
2.6 KiB
Lua
--[[
|
|
This file is part of mpv.
|
|
|
|
mpv is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
mpv is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with mpv. If not, see <http://www.gnu.org/licenses/>.
|
|
]]
|
|
|
|
local utils = require "mp.utils"
|
|
local input = {}
|
|
|
|
local handle_counter = 0
|
|
|
|
local function get_non_callbacks(t)
|
|
local non_callbacks = {}
|
|
|
|
for key, value in pairs(t) do
|
|
if type(value) ~= "function" then
|
|
non_callbacks[key] = value
|
|
end
|
|
end
|
|
|
|
return non_callbacks
|
|
end
|
|
|
|
local function register_event_handler(t)
|
|
local handler_id = "input-event/"..handle_counter
|
|
handle_counter = handle_counter + 1
|
|
|
|
mp.register_script_message(handler_id, function (type, args)
|
|
if t[type] then
|
|
local completions, completion_pos, completion_append =
|
|
t[type](unpack(utils.parse_json(args or "") or {}))
|
|
|
|
if type == "complete" and completions then
|
|
mp.commandv("script-message-to", "console", "complete",
|
|
utils.format_json(completions), completion_pos,
|
|
completion_append or "")
|
|
end
|
|
end
|
|
|
|
if type == "closed" then
|
|
mp.unregister_script_message(handler_id)
|
|
end
|
|
end)
|
|
|
|
return handler_id
|
|
end
|
|
|
|
function input.get(t)
|
|
t.has_completions = t.complete ~= nil
|
|
t.client_name = mp.get_script_name()
|
|
t.handler_id = register_event_handler(t)
|
|
|
|
mp.commandv("script-message-to", "console", "get-input",
|
|
utils.format_json(get_non_callbacks(t)))
|
|
end
|
|
|
|
input.select = input.get
|
|
|
|
function input.terminate()
|
|
mp.commandv("script-message-to", "console", "disable")
|
|
end
|
|
|
|
function input.log(message, style, terminal_style)
|
|
mp.commandv("script-message-to", "console", "log", utils.format_json({
|
|
text = message,
|
|
style = style,
|
|
terminal_style = terminal_style,
|
|
}))
|
|
end
|
|
|
|
function input.log_error(message)
|
|
mp.commandv("script-message-to", "console", "log",
|
|
utils.format_json({ text = message, error = true }))
|
|
end
|
|
|
|
function input.set_log(log)
|
|
mp.commandv("script-message-to", "console", "set-log", utils.format_json(log))
|
|
end
|
|
|
|
return input
|