Skip to content

Commit 310c6f8

Browse files
committed
Add same clones information in properties
1 parent d1524d5 commit 310c6f8

File tree

2 files changed

+88
-12
lines changed

2 files changed

+88
-12
lines changed

data/locale/en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ Source="Source"
1414
CurrentScene="Current scene"
1515
PreviousScene="Previous scene"
1616
NoFilters="No filters"
17+
SameClones="Same Clones"

source-clone.c

Lines changed: 87 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
#include "source-clone.h"
2-
#include "audio-wrapper.h"
31
#include <obs-module.h>
42
#include <obs-frontend-api.h>
3+
#include "util/dstr.h"
4+
#include "source-clone.h"
5+
#include "audio-wrapper.h"
56

67
const char *source_clone_get_name(void *type_data)
78
{
@@ -216,20 +217,68 @@ bool source_clone_list_add_source(void *data, obs_source_t *source)
216217
return true;
217218
}
218219

219-
bool source_clone_type_changed(void *priv, obs_properties_t *props,
220-
obs_property_t *property, obs_data_t *settings)
220+
struct same_clones {
221+
obs_data_t *settings;
222+
DARRAY(const char *) clones;
223+
};
224+
225+
bool find_clones(void *data, obs_source_t *source)
221226
{
222-
UNUSED_PARAMETER(priv);
223-
UNUSED_PARAMETER(property);
224-
obs_property_t *clone = obs_properties_get(props, "clone");
225-
obs_property_set_visible(clone,
226-
obs_data_get_int(settings, "clone_type") ==
227-
CLONE_SOURCE);
227+
if (strcmp(obs_source_get_unversioned_id(source), "source-clone") !=
228+
0) {
229+
230+
return true;
231+
}
232+
obs_data_t *settings = obs_source_get_settings(source);
233+
if (!settings)
234+
return true;
235+
struct same_clones *sc = data;
236+
if (settings == sc->settings) {
237+
obs_data_release(settings);
238+
return true;
239+
}
240+
if (obs_data_get_int(sc->settings, "clone_type") == CLONE_SOURCE) {
241+
if (obs_data_get_int(settings, "clone_type") == CLONE_SOURCE &&
242+
strcmp(obs_data_get_string(sc->settings, "clone"),
243+
obs_data_get_string(settings, "clone")) == 0) {
244+
const char *name = obs_source_get_name(source);
245+
da_push_back(sc->clones, &name);
246+
}
247+
} else if (obs_data_get_int(sc->settings, "clone_type") ==
248+
obs_data_get_int(settings, "clone_type")) {
249+
const char *name = obs_source_get_name(source);
250+
da_push_back(sc->clones, &name);
251+
}
252+
obs_data_release(settings);
228253
return true;
229254
}
230255

256+
void find_same_clones(obs_properties_t *props, obs_data_t *settings)
257+
{
258+
struct same_clones sc;
259+
sc.settings = settings;
260+
da_init(sc.clones);
261+
obs_enum_sources(find_clones, &sc);
262+
obs_property_t *prop = obs_properties_get(props, "same_clones");
263+
if (sc.clones.num) {
264+
struct dstr names;
265+
dstr_init_copy(&names, sc.clones.array[0]);
266+
for (size_t i = 1; i < sc.clones.num; i++) {
267+
dstr_cat(&names, "\n");
268+
dstr_cat(&names, sc.clones.array[i]);
269+
}
270+
obs_data_set_string(settings, "same_clones", names.array);
271+
dstr_free(&names);
272+
obs_property_set_visible(prop, true);
273+
} else {
274+
obs_data_unset_user_value(settings, "same_clones");
275+
obs_property_set_visible(prop, false);
276+
}
277+
da_free(sc.clones);
278+
}
279+
231280
bool source_clone_source_changed(void *priv, obs_properties_t *props,
232-
obs_property_t *property, obs_data_t *settings)
281+
obs_property_t *property, obs_data_t *settings)
233282
{
234283
UNUSED_PARAMETER(property);
235284
struct source_clone *context = priv;
@@ -248,6 +297,25 @@ bool source_clone_source_changed(void *priv, obs_properties_t *props,
248297

249298
obs_property_t *no_filters = obs_properties_get(props, "no_filters");
250299
obs_property_set_visible(no_filters, !async);
300+
301+
find_same_clones(props, settings);
302+
return true;
303+
}
304+
305+
bool source_clone_type_changed(void *priv, obs_properties_t *props,
306+
obs_property_t *property, obs_data_t *settings)
307+
{
308+
UNUSED_PARAMETER(priv);
309+
UNUSED_PARAMETER(property);
310+
obs_property_t *clone = obs_properties_get(props, "clone");
311+
const bool clone_source = obs_data_get_int(settings, "clone_type") ==
312+
CLONE_SOURCE;
313+
obs_property_set_visible(clone, clone_source);
314+
if (clone_source) {
315+
source_clone_source_changed(priv, props, NULL, settings);
316+
} else {
317+
find_same_clones(props, settings);
318+
}
251319
return true;
252320
}
253321

@@ -279,7 +347,9 @@ obs_properties_t *source_clone_properties(void *data)
279347
source_clone_list_add_source(p, s);
280348
obs_source_release(s);
281349
}
282-
obs_property_set_modified_callback2(p, source_clone_source_changed, data);
350+
obs_property_set_modified_callback2(p, source_clone_source_changed,
351+
data);
352+
283353
obs_properties_add_bool(props, "audio", obs_module_text("Audio"));
284354
p = obs_properties_add_list(props, "buffer_frame",
285355
obs_module_text("VideoBuffer"),
@@ -296,6 +366,11 @@ obs_properties_t *source_clone_properties(void *data)
296366
obs_properties_add_bool(props, "no_filters",
297367
obs_module_text("NoFilters"));
298368

369+
p = obs_properties_add_text(props, "same_clones",
370+
obs_module_text("SameClones"),
371+
OBS_TEXT_INFO);
372+
obs_property_set_visible(p, false);
373+
299374
obs_properties_add_text(
300375
props, "plugin_info",
301376
"<a href=\"https://obsproject.com/forum/resources/source-clone.1632/\">Source Clone</a> (" PROJECT_VERSION

0 commit comments

Comments
 (0)