diff options
author | wm4 <wm4@nowhere> | 2019-12-22 12:30:53 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2019-12-22 12:30:53 +0100 |
commit | 00af718a9e47a6c7a48f821a93f788c22bdd41a7 (patch) | |
tree | a6dd9c46ccb087484d16f75e07c71277d59ed71e /player | |
parent | 9e15e3ad8f5829e86b3a17e4f2de28b62989b756 (diff) | |
download | mpv-00af718a9e47a6c7a48f821a93f788c22bdd41a7.tar.bz2 mpv-00af718a9e47a6c7a48f821a93f788c22bdd41a7.tar.xz |
lua: change runtime option change behavior
As described in the manpage changes. This makes more sense than the
previous approach, where options could "unexpectedly" stick. Although
this is still a somewhat arbitrary policy (ask many people and you'd get
a number of different expectations on what should happen), I think that
it reflects what mpv's builtin stuff does.
All the copying is annoying, but let's just hope nobody is stupid enough
to change these properties per video frame or something equally
ridiculous.
Diffstat (limited to 'player')
-rw-r--r-- | player/lua/options.lua | 51 |
1 files changed, 27 insertions, 24 deletions
diff --git a/player/lua/options.lua b/player/lua/options.lua index 3a05c08ea8..31580f8320 100644 --- a/player/lua/options.lua +++ b/player/lua/options.lua @@ -39,7 +39,18 @@ local function opt_equal(val1, val2) return val1 == val2 end +-- performs a deep-copy of an entire option table +local function opt_table_copy(opts) + local copy = {} + for key, value in pairs(opts) do + copy[key] = opt_copy(value) + end + return copy +end + + local function read_options(options, identifier, on_update) + local option_types = opt_table_copy(options) if identifier == nil then identifier = mp.get_script_name() end @@ -76,11 +87,11 @@ local function read_options(options, identifier, on_update) local val = string.sub(line, eqpos+1) -- match found values with defaults - if options[key] == nil then + if option_types[key] == nil then msg.warn(conffilename..":"..linecounter.. " unknown key " .. key .. ", ignoring") else - local convval = typeconv(options[key], val) + local convval = typeconv(option_types[key], val) if convval == nil then msg.error(conffilename..":"..linecounter.. " error converting value '" .. val .. @@ -98,14 +109,10 @@ local function read_options(options, identifier, on_update) --parse command-line options local prefix = identifier.."-" - - local option_types = {} - for key, value in pairs(options) do - option_types[key] = opt_copy(value) - end + -- command line options are always applied on top of these + local conf_and_default_opts = opt_table_copy(options) local function parse_opts(full, options) - local changelist = {} for key, val in pairs(full) do if not (string.find(key, prefix, 1, true) == nil) then key = string.sub(key, string.len(prefix)+1) @@ -119,15 +126,11 @@ local function read_options(options, identifier, on_update) msg.error("script-opts: error converting value '" .. val .. "' for key '" .. key .. "'") else - if not opt_equal(options[key], convval) then - changelist[key] = true - options[key] = convval - end + options[key] = convval end end end end - return changelist end --initial @@ -135,20 +138,20 @@ local function read_options(options, identifier, on_update) --runtime updates if on_update then - -- Current option state, so that we can detect changes, even if the - -- caller messes with the options table. - local cur_opts = {} - - for key, value in pairs(options) do - cur_opts[key] = opt_copy(value) - end + local last_opts = opt_table_copy(options) mp.observe_property("options/script-opts", "native", function(name, val) - local changelist = parse_opts(val, cur_opts) - for key, _ in pairs(changelist) do - -- copy to user - options[key] = opt_copy(cur_opts[key]) + local new_opts = opt_table_copy(conf_and_default_opts) + parse_opts(val, new_opts) + local changelist = {} + for key, val in pairs(new_opts) do + if not opt_equal(last_opts[key], val) then + -- copy to user + options[key] = opt_copy(val) + changelist[key] = true + end end + last_opts = new_opts if #changelist then on_update(changelist) end |