summaryrefslogtreecommitdiffstats
path: root/player/lua
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-12-23 11:17:01 +0100
committerwm4 <wm4@nowhere>2019-12-23 11:17:01 +0100
commit96932fe77c912f86d8fc51e073b4fd26a124a1fb (patch)
tree6d7df3eaf1fc0f443b7db392a4130c42fb7635b1 /player/lua
parent346c651de397165462d66f5b5c0bcec5a9ad4ae4 (diff)
downloadmpv-96932fe77c912f86d8fc51e073b4fd26a124a1fb.tar.bz2
mpv-96932fe77c912f86d8fc51e073b4fd26a124a1fb.tar.xz
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.
Diffstat (limited to 'player/lua')
-rw-r--r--player/lua/defaults.lua14
1 files changed, 11 insertions, 3 deletions
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)