From 96932fe77c912f86d8fc51e073b4fd26a124a1fb Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 23 Dec 2019 11:17:01 +0100 Subject: lua: batch-update key bindings Lua scripting implements key bindings by defining an input section with all the bindings in it. Every add_key_binding() call ran a mpv command to update this section. This caused a lot of spam at debug log levels. Reduce the spam and more it efficient by batching updates into a single mpv command when the script becomes inactive. This is pretty simple, because there's already the concept of idle handlers. This requires that the script actually goes to sleep, which might not happen in various extremely bogus corner cases, such as polling the mpv message queue with active waiting. Just don't do that. --- player/lua/defaults.lua | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'player/lua') diff --git a/player/lua/defaults.lua b/player/lua/defaults.lua index 29e513f4ea..ba59653828 100644 --- a/player/lua/defaults.lua +++ b/player/lua/defaults.lua @@ -132,8 +132,14 @@ end local key_bindings = {} local key_binding_counter = 0 +local key_bindings_dirty = false + +function mp.flush_keybindings() + if not key_bindings_dirty then + return + end + key_bindings_dirty = false -local function update_key_bindings() for i = 1, 2 do local section, flags local def = i == 1 @@ -229,7 +235,7 @@ local function add_binding(attrs, key, name, fn, rp) key_binding_counter = key_binding_counter + 1 attrs.priority = key_binding_counter key_bindings[name] = attrs - update_key_bindings() + key_bindings_dirty = true dispatch_key_bindings[name] = key_cb mp.register_script_message(name, msg_cb) end @@ -245,7 +251,7 @@ end function mp.remove_key_binding(name) key_bindings[name] = nil dispatch_key_bindings[name] = nil - update_key_bindings() + key_bindings_dirty = true mp.unregister_script_message(name) end @@ -517,6 +523,8 @@ function mp.dispatch_events(allow_wait) end end +mp.register_idle(mp.flush_keybindings) + -- additional helpers function mp.osd_message(text, duration) -- cgit v1.2.3