void obs_sceneitem_setorder(obs_sceneitem_t item, enum order_movement movement) { struct obs_scene *scene = item->parent; pthread_mutex_lock(&scene->mutex); obs_scene_addref(scene); detach_sceneitem(item); if (movement == ORDER_MOVE_UP) { attach_sceneitem(item, item->prev); } else if (movement == ORDER_MOVE_DOWN) { attach_sceneitem(item, item->next); } else if (movement == ORDER_MOVE_TOP) { struct obs_scene_item *last = item->next; if (!last) { last = item->prev; } else { while (last->next) last = last->next; } attach_sceneitem(item, last); } else if (movement == ORDER_MOVE_BOTTOM) { attach_sceneitem(item, NULL); } obs_scene_release(scene); pthread_mutex_unlock(&scene->mutex); }
static inline void remove_without_release(struct obs_scene_item *item) { item->removed = true; set_visibility(item, false); signal_item_remove(item); detach_sceneitem(item); }
void obs_sceneitem_remove(obs_sceneitem_t item) { obs_scene_t scene; if (!item) return; scene = item->parent; if (scene) pthread_mutex_lock(&scene->mutex); if (item->removed) { if (scene) pthread_mutex_unlock(&scene->mutex); return; } item->removed = true; signal_item_remove(item); detach_sceneitem(item); if (scene) pthread_mutex_unlock(&scene->mutex); obs_sceneitem_release(item); }