libobs: Implement obs_data_get_defaults

Implements obs_data_get_defaults and updates the documentation. This is
supposed to allow someone to access all the defaults of an object.
Should help in cases where the full data is needed, and not just the
currently set.
master
Ford Smith 2021-03-14 01:51:07 -05:00 committed by Ford Smith
parent 54892b27db
commit 31e5d2e5e3
3 changed files with 127 additions and 1 deletions

View File

@ -182,6 +182,12 @@ Default Value Functions
Default values are used to determine what value will be given if a value
is not set.
.. function:: obs_data_t *obs_data_get_defaults(obs_data_t *data);
:return: obs_data_t * with all default values (recursively for all objects as well).
-----------------------
.. function:: void obs_data_set_default_string(obs_data_t *data, const char *name, const char *val)
const char *obs_data_get_default_string(obs_data_t *data, const char *name)
@ -207,7 +213,10 @@ is not set.
:return: An incremented reference to a data object.
---------------------
----------------------
.. function:: void obs_data_set_default_array(obs_data_t *data, const char *name, obs_data_array_t *arr)
obs_data_array_t *obs_data_get_default_array(obs_data_t *data, const char *name)
Autoselect Functions

View File

@ -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 */

View File

@ -91,6 +91,11 @@ EXPORT void obs_data_set_obj(obs_data_t *data, const char *name,
EXPORT void obs_data_set_array(obs_data_t *data, const char *name,
obs_data_array_t *array);
/*
* Creates an obs_data_t * filled with all default values.
*/
EXPORT obs_data_t *obs_data_get_defaults(obs_data_t *data);
/*
* Default value functions.
*/
@ -104,6 +109,8 @@ EXPORT void obs_data_set_default_bool(obs_data_t *data, const char *name,
bool val);
EXPORT void obs_data_set_default_obj(obs_data_t *data, const char *name,
obs_data_t *obj);
EXPORT void obs_data_set_default_array(obs_data_t *data, const char *name,
obs_data_array_t *arr);
/*
* Application overrides
@ -166,6 +173,9 @@ EXPORT void obs_data_array_insert(obs_data_array_t *array, size_t idx,
EXPORT void obs_data_array_push_back_array(obs_data_array_t *array,
obs_data_array_t *array2);
EXPORT void obs_data_array_erase(obs_data_array_t *array, size_t idx);
EXPORT void obs_data_array_enum(obs_data_array_t *array,
void (*cb)(obs_data_t *data, void *param),
void *param);
/* ------------------------------------------------------------------------- */
/* Item status inspection */