diff --git a/frontend/OBSStudioAPI.cpp b/frontend/OBSStudioAPI.cpp index f48bcf0ba..23aafeda1 100644 --- a/frontend/OBSStudioAPI.cpp +++ b/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--) { diff --git a/frontend/OBSStudioAPI.hpp b/frontend/OBSStudioAPI.hpp index 5a1872d85..4d446ab50 100644 --- a/frontend/OBSStudioAPI.hpp +++ b/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; diff --git a/frontend/api/obs-frontend-api.cpp b/frontend/api/obs-frontend-api.cpp index 59caa1696..9f10ac4ad 100644 --- a/frontend/api/obs-frontend-api.cpp +++ b/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; +} diff --git a/frontend/api/obs-frontend-api.h b/frontend/api/obs-frontend-api.h index 4b409e337..4615ddbef 100644 --- a/frontend/api/obs-frontend-api.h +++ b/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 diff --git a/frontend/api/obs-frontend-internal.hpp b/frontend/api/obs-frontend-internal.hpp index 5beca9af6..09f846922 100644 --- a/frontend/api/obs-frontend-internal.hpp +++ b/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);