libobs: Add obs_scene_reorder_items
parent
ef9090e0a3
commit
41689fe746
|
@ -1035,6 +1035,72 @@ void obs_sceneitem_set_visible(obs_sceneitem_t *item, bool visible)
|
|||
calldata_free(&cd);
|
||||
}
|
||||
|
||||
static bool sceneitems_match(obs_scene_t *scene, obs_sceneitem_t * const *items,
|
||||
size_t size, bool *order_matches)
|
||||
{
|
||||
obs_sceneitem_t *item = scene->first_item;
|
||||
|
||||
size_t count = 0;
|
||||
while (item) {
|
||||
bool found = false;
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
if (items[i] != item)
|
||||
continue;
|
||||
|
||||
if (count != i)
|
||||
*order_matches = false;
|
||||
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!found)
|
||||
return false;
|
||||
|
||||
item = item->next;
|
||||
count += 1;
|
||||
}
|
||||
|
||||
return count == size;
|
||||
}
|
||||
|
||||
bool obs_scene_reorder_items(obs_scene_t *scene,
|
||||
obs_sceneitem_t * const *item_order, size_t item_order_size)
|
||||
{
|
||||
if (!scene || !item_order_size)
|
||||
return false;
|
||||
|
||||
obs_scene_addref(scene);
|
||||
pthread_mutex_lock(&scene->mutex);
|
||||
|
||||
bool order_matches = true;
|
||||
if (!sceneitems_match(scene, item_order, item_order_size,
|
||||
&order_matches) || order_matches) {
|
||||
pthread_mutex_unlock(&scene->mutex);
|
||||
obs_scene_release(scene);
|
||||
return false;
|
||||
}
|
||||
|
||||
scene->first_item = item_order[0];
|
||||
|
||||
obs_sceneitem_t *prev = NULL;
|
||||
for (size_t i = 0; i < item_order_size; i++) {
|
||||
item_order[i]->prev = prev;
|
||||
item_order[i]->next = NULL;
|
||||
|
||||
if (prev)
|
||||
prev->next = item_order[i];
|
||||
|
||||
prev = item_order[i];
|
||||
}
|
||||
|
||||
signal_reorder(scene->first_item);
|
||||
|
||||
pthread_mutex_unlock(&scene->mutex);
|
||||
obs_scene_release(scene);
|
||||
return true;
|
||||
}
|
||||
|
||||
void obs_scene_atomic_update(obs_scene_t *scene,
|
||||
obs_scene_atomic_update_func func, void *data)
|
||||
{
|
||||
|
|
|
@ -1032,6 +1032,9 @@ EXPORT void obs_scene_enum_items(obs_scene_t *scene,
|
|||
bool (*callback)(obs_scene_t*, obs_sceneitem_t*, void*),
|
||||
void *param);
|
||||
|
||||
EXPORT bool obs_scene_reorder_items(obs_scene_t *scene,
|
||||
obs_sceneitem_t * const *item_order, size_t item_order_size);
|
||||
|
||||
/** Adds/creates a new scene item for a source */
|
||||
EXPORT obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source);
|
||||
|
||||
|
|
Loading…
Reference in New Issue