summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--options/m_config.c10
-rw-r--r--options/m_option.h5
2 files changed, 15 insertions, 0 deletions
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)