diff --git a/options/m_config.c b/options/m_config.c index 68250c7e66..968999cb71 100644 --- a/options/m_config.c +++ b/options/m_config.c @@ -708,6 +708,16 @@ static void add_sub_group(struct m_config_shadow *shadow, const char *name_prefi } } + if (subopts->get_sub_options) { + for (int i = 0; ; i++) { + const struct m_sub_options *sub = NULL; + if (!subopts->get_sub_options(i, &sub)) + break; + if (sub) + add_sub_group(shadow, NULL, group_index, -1, sub); + } + } + shadow->groups[group_index].group_count = shadow->num_groups - group_index; } diff --git a/options/m_option.h b/options/m_option.h index 06b9c53350..7d7f9ba5da 100644 --- a/options/m_option.h +++ b/options/m_option.h @@ -204,6 +204,11 @@ struct m_sub_options { // Change flags passed to mp_option_change_callback() if any option that is // directly or indirectly part of this group is changed. int change_flags; + // Return further sub-options, for example for optional components. If set, + // this is called with increasing index (starting from 0), as long as true + // is returned. If true is returned and *sub is set in any of these calls, + // they are added as options. + bool (*get_sub_options)(int index, const struct m_sub_options **sub); }; #define CONF_TYPE_FLAG (&m_option_type_flag)