diff --git a/plugins/base/utils/source-properties-button.cpp b/plugins/base/utils/source-properties-button.cpp index 649fe66a..9033242f 100644 --- a/plugins/base/utils/source-properties-button.cpp +++ b/plugins/base/utils/source-properties-button.cpp @@ -29,20 +29,37 @@ std::string SourceSettingButton::ToString() const return "[" + id + "] " + description; } -std::vector GetSourceButtons(OBSWeakSource source) +static void getSourceButtonsHelper(obs_properties_t *sourceProperties, + std::vector &buttons) { - OBSSourceAutoRelease s = obs_weak_source_get_source(source); - std::vector buttons; - obs_properties_t *sourceProperties = obs_source_properties(s); auto it = obs_properties_first(sourceProperties); do { - if (!it || obs_property_get_type(it) != OBS_PROPERTY_BUTTON) { + if (!it) { + continue; + } + + auto type = obs_property_get_type(it); + if (type == OBS_PROPERTY_GROUP) { + auto group = obs_property_group_content(it); + getSourceButtonsHelper(group, buttons); + continue; + } + + if (obs_property_get_type(it) != OBS_PROPERTY_BUTTON) { continue; } SourceSettingButton button = {obs_property_name(it), obs_property_description(it)}; buttons.emplace_back(button); } while (obs_property_next(&it)); +} + +std::vector GetSourceButtons(OBSWeakSource source) +{ + OBSSourceAutoRelease s = obs_weak_source_get_source(source); + std::vector buttons; + auto sourceProperties = obs_source_properties(s); + getSourceButtonsHelper(sourceProperties, buttons); obs_properties_destroy(sourceProperties); return buttons; }