summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--options/m_config.c45
-rw-r--r--options/m_config.h4
-rw-r--r--player/client.c2
3 files changed, 27 insertions, 24 deletions
diff --git a/options/m_config.c b/options/m_config.c
index 59e8cb779e..bdd54a9d20 100644
--- a/options/m_config.c
+++ b/options/m_config.c
@@ -609,31 +609,34 @@ int m_config_set_option(struct m_config *config, struct bstr name,
}
int m_config_set_option_node(struct m_config *config, bstr name,
- struct mpv_node *data, int flags)
+ struct mpv_node *data)
{
- char *value = NULL;
- if (data->format == MPV_FORMAT_STRING) {
- value = *(char **)data;
- } else {
- // This is pretty lame, but the simplest for now. It will fail very
- // hard for string lists with items that contain ',' characters.
- union m_option_value val = {0};
- const struct m_option *opt = m_config_get_option(config, name);
- if (!opt)
- return M_OPT_UNKNOWN;
- if (m_option_set_node(opt, &val, data) < 0)
- return M_OPT_INVALID;
- value = m_option_print(opt, &val);
- m_option_free(opt, &val);
- }
+ struct m_config_option *co = m_config_get_co(config, name);
+ if (!co)
+ return M_OPT_UNKNOWN;
+
+ // This affects some special options like "include", "profile". Maybe these
+ // should work, or maybe not. For now they would require special code.
+ if (!co->data)
+ return M_OPT_UNKNOWN;
+
int r;
- if (value) {
- r = m_config_set_option_ext(config, name, bstr0(value), flags);
+
+ // Do this on an "empty" type to make setting the option strictly overwrite
+ // the old value, as opposed to e.g. appending to lists.
+ union m_option_value val = {0};
+
+ if (data->format == MPV_FORMAT_STRING) {
+ bstr param = bstr0(data->u.string);
+ r = m_option_parse(mp_null_log, co->opt, name, param, &val);
} else {
- r = M_OPT_OUT_OF_RANGE;
+ r = m_option_set_node(co->opt, &val, data);
}
- if (data->format != MPV_FORMAT_STRING)
- talloc_free(value);
+
+ if (r >= 0)
+ m_option_copy(co->opt, co->data, &val);
+
+ m_option_free(co->opt, &val);
return r;
}
diff --git a/options/m_config.h b/options/m_config.h
index 632ba09e77..57a271f1c4 100644
--- a/options/m_config.h
+++ b/options/m_config.h
@@ -139,10 +139,10 @@ static inline int m_config_set_option0(struct m_config *config,
return m_config_set_option(config, bstr0(name), bstr0(param));
}
-// Same as m_config_set_option_ext(), but set as data using mpv_node.
+// Similar to m_config_set_option_ext(), but set as data using mpv_node.
struct mpv_node;
int m_config_set_option_node(struct m_config *config, bstr name,
- struct mpv_node *data, int flags);
+ struct mpv_node *data);
int m_config_parse_suboptions(struct m_config *config, char *name,
diff --git a/player/client.c b/player/client.c
index 9e12d75afa..afcff83f9f 100644
--- a/player/client.c
+++ b/player/client.c
@@ -652,7 +652,7 @@ int mpv_set_option(mpv_handle *ctx, const char *name, mpv_format format,
data = &tmp;
}
int err = m_config_set_option_node(ctx->mpctx->mconfig, bstr0(name),
- data, 0);
+ data);
switch (err) {
case M_OPT_MISSING_PARAM:
case M_OPT_INVALID: