From bb21ffd9d45a8402b54a0b300d45623d26d52cbd Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Mon, 3 Aug 2026 18:31:50 +0200 Subject: [PATCH] Fix sources of type "Group" being listed twice in filter selections --- lib/utils/selection-helpers.cpp | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/lib/utils/selection-helpers.cpp b/lib/utils/selection-helpers.cpp index 6001ebbaa..f7ffb3dc2 100644 --- a/lib/utils/selection-helpers.cpp +++ b/lib/utils/selection-helpers.cpp @@ -10,6 +10,7 @@ #include #include +#include namespace advss { @@ -42,34 +43,46 @@ static void hasFilterEnum(obs_source_t *, obs_source_t *filter, void *ptr) QStringList GetSourcesWithFilterNames() { + struct EnumParam { + QStringList list; + // Some items appear in both obs_enum_sources and + // obs_enum_scenes, so track pointers to avoid adding them + // twice. + std::unordered_set seen; + }; + static auto enumSourcesWithFilters = [](void *param, obs_source_t *source) { if (!source) { return true; } - QStringList *list = reinterpret_cast(param); + auto *ep = reinterpret_cast(param); + const auto [_, inserted] = ep->seen.insert(source); + if (!inserted) { + return true; + } bool hasFilter = false; obs_source_enum_filters(source, hasFilterEnum, &hasFilter); if (hasFilter) { - *list << obs_source_get_name(source); + ep->list << obs_source_get_name(source); } return true; }; - QStringList list; - obs_enum_sources(enumSourcesWithFilters, &list); + EnumParam ep; + obs_enum_sources(enumSourcesWithFilters, &ep); #if LIBOBS_API_VER < MAKE_SEMANTIC_VERSION(31, 1, 0) - obs_enum_scenes(enumSourcesWithFilters, &list); + obs_enum_scenes(enumSourcesWithFilters, &ep); #else - static const auto enumCanvases = [](void *listPtr, + static const auto enumCanvases = [](void *param, obs_canvas_t *canvas) -> bool { - obs_canvas_enum_scenes(canvas, enumSourcesWithFilters, listPtr); + obs_canvas_enum_scenes(canvas, enumSourcesWithFilters, param); return true; }; - obs_enum_canvases(enumCanvases, &list); + obs_enum_canvases(enumCanvases, &ep); #endif - return list; + return ep.list; } QStringList GetMediaSourceNames()