Browse Source

frontend: Add frontend API canvas methods

Dennis Sädtler 10 months ago
parent
commit
8441c04c73

+ 20 - 0
frontend/OBSStudioAPI.cpp

@@ -689,6 +689,26 @@ void OBSStudioAPI::obs_frontend_add_undo_redo_action(const char *name, const und
 		[redo](const std::string &data) { redo(data.c_str()); }, undo_data, redo_data, repeatable);
 }
 
+void OBSStudioAPI::obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list)
+{
+	for (const auto &canvas : main->canvases) {
+		obs_canvas_t *ref = obs_canvas_get_ref(canvas);
+		if (ref)
+			da_push_back(canvas_list->canvases, &ref);
+	}
+}
+
+obs_canvas_t *OBSStudioAPI::obs_frontend_add_canvas(const char *name, obs_video_info *ovi, int flags)
+{
+	auto &canvas = main->AddCanvas(std::string(name), ovi, flags);
+	return obs_canvas_get_ref(canvas);
+}
+
+bool OBSStudioAPI::obs_frontend_remove_canvas(obs_canvas_t *canvas)
+{
+	return main->RemoveCanvas(canvas);
+}
+
 void OBSStudioAPI::on_load(obs_data_t *settings)
 {
 	for (size_t i = saveCallbacks.size(); i > 0; i--) {

+ 6 - 0
frontend/OBSStudioAPI.hpp

@@ -224,6 +224,12 @@ struct OBSStudioAPI : obs_frontend_callbacks {
 	void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo, const undo_redo_cb redo,
 					       const char *undo_data, const char *redo_data, bool repeatable) override;
 
+	void obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list) override;
+
+	obs_canvas_t *obs_frontend_add_canvas(const char *name, obs_video_info *ovi, int flags) override;
+
+	bool obs_frontend_remove_canvas(obs_canvas_t *canvas) override;
+
 	void on_load(obs_data_t *settings) override;
 
 	void on_preload(obs_data_t *settings) override;

+ 16 - 0
frontend/api/obs-frontend-api.cpp

@@ -597,3 +597,19 @@ void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo
 	if (callbacks_valid())
 		c->obs_frontend_add_undo_redo_action(name, undo, redo, undo_data, redo_data, repeatable);
 }
+
+void obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list)
+{
+	if (callbacks_valid())
+		c->obs_frontend_get_canvases(canvas_list);
+}
+
+obs_canvas_t *obs_frontend_add_canvas(const char *name, obs_video_info *ovi, int flags)
+{
+	return !!callbacks_valid() ? c->obs_frontend_add_canvas(name, ovi, flags) : nullptr;
+}
+
+bool obs_frontend_remove_canvas(obs_canvas_t *canvas)
+{
+	return !!callbacks_valid() ? c->obs_frontend_remove_canvas(canvas) : false;
+}

+ 20 - 0
frontend/api/obs-frontend-api.h

@@ -62,6 +62,9 @@ enum obs_frontend_event {
 	OBS_FRONTEND_EVENT_SCENE_COLLECTION_RENAMED,
 	OBS_FRONTEND_EVENT_THEME_CHANGED,
 	OBS_FRONTEND_EVENT_SCREENSHOT_TAKEN,
+
+	OBS_FRONTEND_EVENT_CANVAS_ADDED,
+	OBS_FRONTEND_EVENT_CANVAS_REMOVED,
 };
 
 /* ------------------------------------------------------------------------- */
@@ -80,6 +83,19 @@ static inline void obs_frontend_source_list_free(struct obs_frontend_source_list
 	da_free(source_list->sources);
 }
 
+struct obs_frontend_canvas_list {
+	DARRAY(obs_canvas_t *) canvases;
+};
+
+static inline void obs_frontend_canvas_list_free(struct obs_frontend_canvas_list *canvas_list)
+{
+	size_t num = canvas_list->canvases.num;
+	for (size_t i = 0; i < num; i++)
+		obs_canvas_release(canvas_list->canvases.array[i]);
+
+	da_free(canvas_list->canvases);
+}
+
 #endif //!SWIG
 
 /* ------------------------------------------------------------------------- */
@@ -238,6 +254,10 @@ typedef void (*undo_redo_cb)(const char *data);
 EXPORT void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo, const undo_redo_cb redo,
 					      const char *undo_data, const char *redo_data, bool repeatable);
 
+EXPORT void obs_frontend_get_canvases(struct obs_frontend_canvas_list *canvas_list);
+EXPORT obs_canvas_t *obs_frontend_add_canvas(const char *name, struct obs_video_info *ovi, int flags);
+EXPORT bool obs_frontend_remove_canvas(obs_canvas_t *canvas);
+
 /* ------------------------------------------------------------------------- */
 
 #ifdef __cplusplus

+ 4 - 0
frontend/api/obs-frontend-internal.hpp

@@ -137,6 +137,10 @@ struct obs_frontend_callbacks {
 	virtual void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo,
 						       const undo_redo_cb redo, const char *undo_data,
 						       const char *redo_data, bool repeatable) = 0;
+
+	virtual obs_canvas_t *obs_frontend_add_canvas(const char *name, obs_video_info *ovi, int flags) = 0;
+	virtual bool obs_frontend_remove_canvas(obs_canvas_t *canvas) = 0;
+	virtual void obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list) = 0;
 };
 
 EXPORT void obs_frontend_set_callbacks_internal(obs_frontend_callbacks *callbacks);