Procházet zdrojové kódy

libobs: Add obs_scene_reorder_items

Palana před 10 roky
rodič
revize
41689fe746
2 změnil soubory, kde provedl 69 přidání a 0 odebrání
  1. 66 0
      libobs/obs-scene.c
  2. 3 0
      libobs/obs.h

+ 66 - 0
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)
 {

+ 3 - 0
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);