diff options
author | Philip Langdale <philipl@overt.org> | 2021-02-20 16:41:44 -0800 |
---|---|---|
committer | Jan Ekström <jeebjp@gmail.com> | 2021-03-28 19:46:27 +0300 |
commit | 3f006eced47b35b7d752fdc19c22a7f39f970975 (patch) | |
tree | 7186f381e317fac2e8cc117d2ff20ab700a3b372 /video/out/drm_common.c | |
parent | 6265724f3331e3dee8d9ec2b6639def5004a5fa2 (diff) | |
download | mpv-3f006eced47b35b7d752fdc19c22a7f39f970975.tar.bz2 mpv-3f006eced47b35b7d752fdc19c22a7f39f970975.tar.xz |
options: Make validation and help possible for all option types
Today, validation is only possible for string type options. But there's
no particular reason why it needs to be restricted in this way, and
there are potential uses, to allow other options to be validated
without forcing the option to have to reimplement parsing from
scratch.
The first part, simply making the validation function an explicit
field instead of overloading priv is simple enough. But if we only do
that, then the validation function still needs to deal with the raw
pre-parsed string. Instead, we want to allow the value to be parsed
before it is validated. That in turn leads to us having validator
functions that should be type aware. Unfortunately, that means we need
to keep the explicit macro like OPT_STRING_VALIDATE() as a way to
enforce the correct typing of the function. Otherwise, we'd have to
have the validator take a void * and hope the implementation can cast
it correctly.
For help, we don't have this problem, as help doesn't look at the
value.
Then, we turn validators that are really help generators into explicit
help functions and where a validator is help + validation, we split
them into two parts.
I have, however, left functions that need to query information for both
help and validation as single functions to avoid code duplication.
In this change, I have not added an other OPT_FOO_VALIDATE() macros as
they are not needed, but I will add some in a separate change to
illustrate the pattern.
Diffstat (limited to 'video/out/drm_common.c')
-rw-r--r-- | video/out/drm_common.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/video/out/drm_common.c b/video/out/drm_common.c index 64c84ca315..727221b6b1 100644 --- a/video/out/drm_common.c +++ b/video/out/drm_common.c @@ -54,13 +54,15 @@ static int vt_switcher_pipe[2]; -static int drm_validate_connector_opt( - struct mp_log *log, const struct m_option *opt, struct bstr name, - struct bstr param); +static int drm_connector_opt_help( + struct mp_log *log, const struct m_option *opt, struct bstr name); + +static int drm_mode_opt_help( + struct mp_log *log, const struct m_option *opt, struct bstr name); static int drm_validate_mode_opt( struct mp_log *log, const struct m_option *opt, struct bstr name, - struct bstr param); + const char **value); static void kms_show_available_modes( struct mp_log *log, const drmModeConnector *connector); @@ -71,10 +73,10 @@ static double mode_get_Hz(const drmModeModeInfo *mode); #define OPT_BASE_STRUCT struct drm_opts const struct m_sub_options drm_conf = { .opts = (const struct m_option[]) { - {"drm-connector", OPT_STRING_VALIDATE(drm_connector_spec, - drm_validate_connector_opt)}, - {"drm-mode", OPT_STRING_VALIDATE(drm_mode_spec, - drm_validate_mode_opt)}, + {"drm-connector", OPT_STRING(drm_connector_spec), + .help = drm_connector_opt_help}, + {"drm-mode", OPT_STRING_VALIDATE(drm_mode_spec, drm_validate_mode_opt), + .help = drm_mode_opt_help}, {"drm-atomic", OPT_CHOICE(drm_atomic, {"no", 0}, {"auto", 1})}, {"drm-draw-plane", OPT_CHOICE(drm_draw_plane, {"primary", DRM_OPTS_PRIMARY_PLANE}, @@ -747,31 +749,28 @@ double kms_get_display_fps(const struct kms *kms) return mode_get_Hz(&kms->mode.mode); } -static int drm_validate_connector_opt(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param) +static int drm_connector_opt_help(struct mp_log *log, const struct m_option *opt, + struct bstr name) { - if (bstr_equals0(param, "help")) { - kms_show_available_cards_and_connectors(log); - return M_OPT_EXIT; - } - return 1; + kms_show_available_cards_and_connectors(log); + return M_OPT_EXIT; } -static int drm_validate_mode_opt(struct mp_log *log, const struct m_option *opt, - struct bstr name, struct bstr param) +static int drm_mode_opt_help(struct mp_log *log, const struct m_option *opt, + struct bstr name) { - if (bstr_equals0(param, "help")) { - kms_show_available_cards_connectors_and_modes(log); - return M_OPT_EXIT; - } + kms_show_available_cards_connectors_and_modes(log); + return M_OPT_EXIT; +} - char *spec = bstrto0(NULL, param); - if (!parse_mode_spec(spec, NULL)) { +static int drm_validate_mode_opt(struct mp_log *log, const struct m_option *opt, + struct bstr name, const char **value) +{ + const char *param = *value; + if (!parse_mode_spec(param, NULL)) { mp_fatal(log, "Invalid value for option drm-mode. Must be a positive number, a string of the format WxH[@R] or 'help'\n"); - talloc_free(spec); return M_OPT_INVALID; } - talloc_free(spec); return 1; } |