diff options
author | Avi Halachmi (:avih) <avihpit@yahoo.com> | 2019-12-21 12:13:15 +0200 |
---|---|---|
committer | Avi Halachmi (:avih) <avihpit@yahoo.com> | 2019-12-21 14:57:10 +0200 |
commit | 71ddb22b39ec3cce1c39b7f53975e51e94d257d4 (patch) | |
tree | a475a493535ffae5e01eaff0707fb8c75fd7f64e | |
parent | 05fb6f906de25016faff2bdedd1f47f1e4077554 (diff) | |
download | mpv-71ddb22b39ec3cce1c39b7f53975e51e94d257d4.tar.bz2 mpv-71ddb22b39ec3cce1c39b7f53975e51e94d257d4.tar.xz |
js: read_options: support on_update (match 478a321d)
This is a bit different than the lua code: on script-opts change it
simply re-applies the conf-file and script-opts to the options object,
and if this results in any changed value at options then on_update is
called with the changelist as argument.
This allows a value to revert back to the conf-file value if the
matching script-opts key had a different value and then got deleted.
It also guarantees to call back whenever the options object is
modified, which the lua code doesn't do (e.g. if the caller changed
a value and the observer changed it back - it won't detect a change).
-rw-r--r-- | DOCS/man/javascript.rst | 3 | ||||
-rw-r--r-- | player/javascript/defaults.js | 18 |
2 files changed, 18 insertions, 3 deletions
diff --git a/DOCS/man/javascript.rst b/DOCS/man/javascript.rst index c0c4dbad8c..8e3e7d6199 100644 --- a/DOCS/man/javascript.rst +++ b/DOCS/man/javascript.rst @@ -187,7 +187,8 @@ success, ``fn`` is called always a-sync, ``error`` is empty string on success. ``mp.add_hook(type, priority, fn)`` -``mp.options.read_options(obj [, identifier])`` (types: string/boolean/number) +``mp.options.read_options(obj [, identifier [, on_update]])`` (types: +string/boolean/number, ``on_update`` does re-read the config file) Additional utilities -------------------- diff --git a/player/javascript/defaults.js b/player/javascript/defaults.js index 9694b852d7..4520373886 100644 --- a/player/javascript/defaults.js +++ b/player/javascript/defaults.js @@ -511,8 +511,8 @@ g.require = new_require(SCRIPTDIR_META + "/" + main_script[1]); /********************************************************************** * mp.options *********************************************************************/ -function read_options(opts, id) { - id = String(typeof id != "undefined" ? id : mp.get_script_name()); +function read_options(opts, id, on_update) { + id = String(id ? id : mp.get_script_name()); mp.msg.debug("reading options for " + id); var conf, fname = "~~/script-opts/" + id + ".conf"; @@ -556,6 +556,20 @@ function read_options(opts, id) { else mp.msg.error(info, "Error: can't convert '" + val + "' to " + type); }); + + if (on_update) { + mp.observe_property("options/script-opts", "native", function(_n, _v) { + var saved = JSON.parse(JSON.stringify(opts)); // clone + var changelist = {}, changed = false; + read_options(opts, id); // re-apply conf-file + script-opts + for (var key in opts) { + if (opts[key] != saved[key]) // type always stays the same + changelist[key] = changed = true; + } + if (changed) + on_update(changelist); + }); + } } mp.options = { read_options: read_options }; |