diff options
-rw-r--r-- | DOCS/man/javascript.rst | 2 | ||||
-rw-r--r-- | player/javascript/defaults.js | 11 |
2 files changed, 10 insertions, 3 deletions
diff --git a/DOCS/man/javascript.rst b/DOCS/man/javascript.rst index 53e5771b54..1e5ce99cdc 100644 --- a/DOCS/man/javascript.rst +++ b/DOCS/man/javascript.rst @@ -193,7 +193,7 @@ success, ``fn`` is called always a-sync, ``error`` is empty string on success. ``mp.utils.getpid()`` (LE) -``mp.add_hook(type, priority, fn)`` +``mp.add_hook(type, priority, fn(hook))`` ``mp.options.read_options(obj [, identifier [, on_update]])`` (types: string/boolean/number) diff --git a/player/javascript/defaults.js b/player/javascript/defaults.js index 9d53f2d7a3..2435390b87 100644 --- a/player/javascript/defaults.js +++ b/player/javascript/defaults.js @@ -126,10 +126,17 @@ function dispatch_message(ev) { var hooks = []; // array of callbacks, id is index+1 function run_hook(ev) { + var state = 0; // 0:initial, 1:deferred, 2:continued + function do_cont() { return state = 2, mp._hook_continue(ev.hook_id) } + + function err() { return mp.msg.error("hook already continued"), undefined } + function usr_defer() { return state == 2 ? err() : (state = 1, true) } + function usr_cont() { return state == 2 ? err() : do_cont() } + var cb = ev.id > 0 && hooks[ev.id - 1]; if (cb) - cb(); - mp._hook_continue(ev.hook_id); + cb({ defer: usr_defer, cont: usr_cont }); + return state == 0 ? do_cont() : true; } mp.add_hook = function add_hook(name, pri, fn) { |