|
@@ -767,6 +767,97 @@ bool obs_data_save_json_safe(obs_data_t *data, const char *file,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static void get_defaults_array_cb(obs_data_t *data, void *vp)
|
|
|
+{
|
|
|
+ obs_data_array_t *defs = (obs_data_array_t *)vp;
|
|
|
+ obs_data_t *obs_defaults = obs_data_get_defaults(data);
|
|
|
+
|
|
|
+ obs_data_array_push_back(defs, obs_defaults);
|
|
|
+
|
|
|
+ obs_data_release(obs_defaults);
|
|
|
+}
|
|
|
+
|
|
|
+obs_data_t *obs_data_get_defaults(obs_data_t *data)
|
|
|
+{
|
|
|
+ obs_data_t *defaults = obs_data_create();
|
|
|
+
|
|
|
+ if (!data)
|
|
|
+ return defaults;
|
|
|
+
|
|
|
+ struct obs_data_item *item = data->first_item;
|
|
|
+
|
|
|
+ while (item) {
|
|
|
+ const char *name = get_item_name(item);
|
|
|
+ switch (item->type) {
|
|
|
+ case OBS_DATA_NULL:
|
|
|
+ break;
|
|
|
+
|
|
|
+ case OBS_DATA_STRING: {
|
|
|
+ const char *str =
|
|
|
+ obs_data_get_default_string(data, name);
|
|
|
+ obs_data_set_string(defaults, name, str);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case OBS_DATA_NUMBER: {
|
|
|
+ switch (obs_data_item_numtype(item)) {
|
|
|
+ case OBS_DATA_NUM_DOUBLE: {
|
|
|
+ double val =
|
|
|
+ obs_data_get_default_double(data, name);
|
|
|
+ obs_data_set_double(defaults, name, val);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case OBS_DATA_NUM_INT: {
|
|
|
+ int val = obs_data_get_default_int(data, name);
|
|
|
+ obs_data_set_int(defaults, name, val);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case OBS_DATA_NUM_INVALID:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case OBS_DATA_BOOLEAN: {
|
|
|
+ bool val = obs_data_get_default_bool(data, name);
|
|
|
+ obs_data_set_bool(defaults, name, val);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case OBS_DATA_OBJECT: {
|
|
|
+ obs_data_t *val = obs_data_get_default_obj(data, name);
|
|
|
+ obs_data_t *defs = obs_data_get_defaults(val);
|
|
|
+
|
|
|
+ obs_data_set_obj(defaults, name, defs);
|
|
|
+
|
|
|
+ obs_data_release(defs);
|
|
|
+ obs_data_release(val);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ case OBS_DATA_ARRAY: {
|
|
|
+ obs_data_array_t *arr =
|
|
|
+ obs_data_get_default_array(data, name);
|
|
|
+ obs_data_array_t *defs = obs_data_array_create();
|
|
|
+
|
|
|
+ obs_data_array_enum(arr, get_defaults_array_cb,
|
|
|
+ (void *)defs);
|
|
|
+ obs_data_set_array(defaults, name, defs);
|
|
|
+
|
|
|
+ obs_data_array_release(defs);
|
|
|
+ obs_data_array_release(arr);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ item = item->next;
|
|
|
+ }
|
|
|
+
|
|
|
+ return defaults;
|
|
|
+}
|
|
|
+
|
|
|
static struct obs_data_item *get_item(struct obs_data *data, const char *name)
|
|
|
{
|
|
|
if (!data)
|
|
@@ -1134,6 +1225,12 @@ void obs_data_set_default_obj(obs_data_t *data, const char *name,
|
|
|
obs_set_obj(data, NULL, name, obj, set_item_def);
|
|
|
}
|
|
|
|
|
|
+void obs_data_set_default_array(obs_data_t *data, const char *name,
|
|
|
+ obs_data_array_t *arr)
|
|
|
+{
|
|
|
+ obs_set_array(data, NULL, name, arr, set_item_def);
|
|
|
+}
|
|
|
+
|
|
|
void obs_data_set_autoselect_string(obs_data_t *data, const char *name,
|
|
|
const char *val)
|
|
|
{
|
|
@@ -1351,6 +1448,16 @@ void obs_data_array_erase(obs_data_array_t *array, size_t idx)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+void obs_data_array_enum(obs_data_array_t *array,
|
|
|
+ void (*cb)(obs_data_t *data, void *param), void *param)
|
|
|
+{
|
|
|
+ if (array && cb) {
|
|
|
+ for (size_t i = 0; i < array->objects.num; i++) {
|
|
|
+ cb(array->objects.array[i], param);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
/* Item status inspection */
|
|
|
|