From a94013f5857e4a335cc1da4cf3926a613f422b5c Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 26 Mar 2017 13:13:34 +0200 Subject: command: change and simplify filter toggle syntax "@name:!" becomes simply "@name". This is actually slightly more complex to parse, but makes for a much simpler syntax and will be less weird to the user. Suggested by haasn. The old syntax is now rejected with an error. Also add some more explicit error checks, instead of e.g. allowing empty filter names and erroring only when it's not found. --- DOCS/man/input.rst | 7 ++++--- DOCS/man/vf.rst | 4 ++++ options/m_option.c | 28 +++++++++++++++++++++++----- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst index 12193843ff..984b8db7d6 100644 --- a/DOCS/man/input.rst +++ b/DOCS/man/input.rst @@ -452,8 +452,9 @@ Input Commands that are Possibly Subject to Change (If several filters are passed to the command, this is done for each filter.) - A special variant is combining this with labels, and using ``@name:!`` - as filter entry. This toggles the enable/disable flag. + A special variant is combining this with labels, and using ``@name`` + without filter name and parameters as filter entry. This toggles the + enable/disable flag. del Remove the given filters from the video chain. Unlike in the other @@ -497,7 +498,7 @@ Input Commands that are Possibly Subject to Change name for this filter entry. The ``!`` before the filter name disables the filter by default. Everything after this is the normal filter name and the filter parameters. - - Add ``a vf toggle @deband:!`` to ``input.conf``. This toggles the + - Add ``a vf toggle @deband`` to ``input.conf``. This toggles the "disabled" flag for the filter identified with ``deband``. ``cycle-values ["!reverse"] "" "" ...`` diff --git a/DOCS/man/vf.rst b/DOCS/man/vf.rst index a3f7ee6dab..e61b758af5 100644 --- a/DOCS/man/vf.rst +++ b/DOCS/man/vf.rst @@ -24,6 +24,10 @@ syntax is: ``["@"":"] ["!"] [ "=" ]`` + or for the special "toggle" syntax (see ``vf`` command): + + ``"@"`` + and the ``filter-parameter-list``: `` | "," `` diff --git a/options/m_option.c b/options/m_option.c index 796677696a..a30f89d18d 100644 --- a/options/m_option.c +++ b/options/m_option.c @@ -2762,15 +2762,31 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt, int op, int r; char **plist = NULL; struct m_obj_desc desc; + bstr str = {0}; bstr label = {0}; bool nopos = list->disallow_positional_parameters; bool enabled = true; if (bstr_eatstart0(pstr, "@")) { - if (!bstr_split_tok(*pstr, ":", &label, pstr)) { + bstr rest; + if (!bstr_split_tok(*pstr, ":", &label, &rest)) { + // "@labelname" is the special enable/disable toggle syntax + if (op == OP_TOGGLE) { + int idx = bstrspn(*pstr, NAMECH); + label = bstr_splice(*pstr, 0, idx); + if (label.len) { + *pstr = bstr_cut(*pstr, idx); + goto done; + } + } mp_err(log, "Option %.*s: ':' expected after label.\n", BSTR_P(opt)); return M_OPT_INVALID; } + *pstr = rest; + if (label.len == 0) { + mp_err(log, "Option %.*s: label name expected.\n", BSTR_P(opt)); + return M_OPT_INVALID; + } } if (list->allow_disable_entries && bstr_eatstart0(pstr, "!")) @@ -2778,9 +2794,11 @@ static int parse_obj_settings(struct mp_log *log, struct bstr opt, int op, bool has_param = false; int idx = bstrspn(*pstr, NAMECH); - bstr str = bstr_splice(*pstr, 0, idx); - if (str.len == 0 && !enabled && label.len && op == OP_TOGGLE) - goto done; // "@labelname:!" is the special enable/disable toggle syntax + str = bstr_splice(*pstr, 0, idx); + if (!str.len) { + mp_err(log, "Option %.*s: filter name expected.\n", BSTR_P(opt)); + return M_OPT_INVALID; + } *pstr = bstr_cut(*pstr, idx); // video filters use "=", VOs use ":" if (bstr_eatstart0(pstr, "=") || bstr_eatstart0(pstr, ":")) @@ -3026,7 +3044,7 @@ static int parse_obj_settings_list(struct mp_log *log, const m_option_t *opt, talloc_free(res); } else if (op == OP_TOGGLE) { for (int n = 0; res && res[n].name; n++) { - if (!res[n].enabled && !res[n].name[0]) { + if (res[n].label && !res[n].name[0]) { // Toggle enable/disable special case. int found = obj_settings_list_find_by_label0(list, res[n].label); -- cgit v1.2.3