diff options
-rw-r--r-- | cfg-mplayer.h | 4 | ||||
-rw-r--r-- | m_config.c | 47 | ||||
-rw-r--r-- | m_config.h | 2 | ||||
-rw-r--r-- | m_option.h | 5 |
4 files changed, 44 insertions, 14 deletions
diff --git a/cfg-mplayer.h b/cfg-mplayer.h index fc87ed88d8..48890eab26 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -691,7 +691,7 @@ const m_option_t common_opts[] = { {"subfont-outline", &subtitle_font_thickness, CONF_TYPE_FLOAT, CONF_RANGE, 0, 8, NULL}, {"subfont-autoscale", &subtitle_autoscale, CONF_TYPE_INT, CONF_RANGE, 0, 3, NULL}, #endif -#ifdef CONFIG_ASS + OPT_START_CONDITIONAL(CONFIG_ASS, "libass"), OPT_MAKE_FLAGS("ass", ass_enabled, 0), OPT_FLOATRANGE("ass-font-scale", ass_font_scale, 0, 0, 100), OPT_FLOATRANGE("ass-line-spacing", ass_line_spacing, 0, -1000, 1000), @@ -705,7 +705,7 @@ const m_option_t common_opts[] = { OPT_STRING("ass-border-color", ass_border_color, 0), OPT_STRING("ass-styles", ass_styles_file, 0), OPT_INTRANGE("ass-hinting", ass_hinting, 0, 0, 7), -#endif + OPT_START_CONDITIONAL(1, ""), #ifdef CONFIG_FONTCONFIG {"fontconfig", &font_fontconfig, CONF_TYPE_FLAG, 0, -1, 1, NULL}, {"nofontconfig", &font_fontconfig, CONF_TYPE_FLAG, 0, 1, -1, NULL}, diff --git a/m_config.c b/m_config.c index 3cf8c721ac..94d7e26b2e 100644 --- a/m_config.c +++ b/m_config.c @@ -169,7 +169,7 @@ static void m_option_set(const struct m_config *config, static void m_config_add_option(struct m_config *config, const struct m_option *arg, - const char *prefix); + const char *prefix, char *disabled_feature); struct m_config *m_config_new(void *optstruct, int includefunc(struct m_option *conf, @@ -205,7 +205,7 @@ struct m_config *m_config_new(void *optstruct, "include", includefunc, CONF_TYPE_FUNC_PARAM, CONF_NOSAVE, 0, 0, config }; - m_config_add_option(config, p, NULL); + m_config_add_option(config, p, NULL, NULL); } config->optstruct = optstruct; @@ -302,8 +302,30 @@ void m_config_pop(struct m_config *config) mp_msg(MSGT_CFGPARSER, MSGL_DBG2, "Config poped level=%d\n", config->lvl); } +static void add_options(struct m_config *config, const struct m_option *defs, + const char *prefix, char *disabled_feature) +{ + char *dis = disabled_feature; + const char marker[] = "conditional functionality: "; + for (int i = 0; defs[i].name; i++) { + if (!strncmp(defs[i].name, marker, strlen(marker))) { + // If a subconfig entry itself is disabled, everything + // under it is already disabled for the same reason. + if (!disabled_feature) { + if (!strcmp(defs[i].name + strlen(marker), "1")) + dis = NULL; + else + dis = defs[i].p; + } + continue; + } + m_config_add_option(config, defs + i, prefix, dis); + } +} + static void m_config_add_option(struct m_config *config, - const struct m_option *arg, const char *prefix) + const struct m_option *arg, const char *prefix, + char *disabled_feature) { struct m_config_option *co; struct m_config_save_slot *sl; @@ -316,6 +338,7 @@ static void m_config_add_option(struct m_config *config, co = talloc_zero_size(config, sizeof(struct m_config_option) + arg->type->size); co->opt = arg; + co->disabled_feature = disabled_feature; // Fill in the full name if (prefix && *prefix) @@ -325,11 +348,7 @@ static void m_config_add_option(struct m_config *config, // Option with children -> add them if (arg->type->flags & M_OPT_TYPE_HAS_CHILD) { - const struct m_option *ol = arg->p; - int i; - co->slots = NULL; - for (i = 0; ol[i].name != NULL; i++) - m_config_add_option(config, &ol[i], co->name); + add_options(config, arg->p, co->name, disabled_feature); } else { struct m_config_option *i; // Check if there is already an option pointing to this address @@ -374,14 +393,11 @@ static void m_config_add_option(struct m_config *config, int m_config_register_options(struct m_config *config, const struct m_option *args) { - int i; - assert(config != NULL); assert(config->lvl > 0); assert(args != NULL); - for (i = 0; args[i].name != NULL; i++) - m_config_add_option(config, &args[i], NULL); + add_options(config, args, NULL, NULL); return 1; } @@ -418,6 +434,13 @@ static int m_config_parse_option(const struct m_config *config, co = m_config_get_co(config, name); if (!co) return M_OPT_UNKNOWN; + if (co->disabled_feature) { + mp_tmsg(MSGT_CFGPARSER, MSGL_ERR, + "Option \"%.*s\" is not available in this version of mplayer2, " + "because it has been compiled with feature \"%s\" disabled.\n", + BSTR_P(name), co->disabled_feature); + return M_OPT_UNKNOWN; + } // This is the only mandatory function assert(co->opt->type->parse); diff --git a/m_config.h b/m_config.h index 75dd85ac14..91ee7ffe43 100644 --- a/m_config.h +++ b/m_config.h @@ -47,6 +47,8 @@ struct m_config_option { struct m_config_option *next; // Full name (ie option:subopt). char *name; + // Compiled without support for this option? If so set to name of feature + char *disabled_feature; // Option description. const struct m_option *opt; // Save slot stack. diff --git a/m_option.h b/m_option.h index 78ed856f6d..5b7e051290 100644 --- a/m_option.h +++ b/m_option.h @@ -486,6 +486,11 @@ static inline void m_option_free(const m_option_t *opt, void *dst) #define OPTION_PATH_SEPARATOR ':' #endif +// The code will interpret arguments different from 1 as disabled, thus +// CONFIG_FOO etc mean disabled if no such macro is defined. +#define OPT_START_CONDITIONAL(enable, featurename) OPT_START_CONDITIONAL_AFTERMACROEVAL(enable, featurename) +#define OPT_START_CONDITIONAL_AFTERMACROEVAL(enable, featurename) {"conditional functionality: " #enable, .p = featurename} + #define OPT_FLAG_ON(optname, varname, flags) {optname, NULL, &m_option_type_flag, flags, 0, 1, NULL, 1, offsetof(struct MPOpts, varname)} #define OPT_FLAG_OFF(optname, varname, flags) {optname, NULL, &m_option_type_flag, flags, 1, 0, NULL, 1, offsetof(struct MPOpts, varname)} #define OPT_MAKE_FLAGS(optname, varname, flags) OPT_FLAG_ON(optname, varname, flags), OPT_FLAG_OFF("no" optname, varname, flags) |