From 41689fe746bb71ee0780d9d5b25e112ee3c11beb Mon Sep 17 00:00:00 2001 From: Palana Date: Sat, 27 Jun 2015 03:47:46 +0200 Subject: [PATCH] libobs: Add obs_scene_reorder_items --- libobs/obs-scene.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ libobs/obs.h | 3 +++ 2 files changed, 69 insertions(+) diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 02ced3915..b03374e5e 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -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) { diff --git a/libobs/obs.h b/libobs/obs.h index acd6487c8..a414278a2 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -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);