Skip to content

Commit 8441c04

Browse files
dsaedtlerRytoEX
authored andcommitted
frontend: Add frontend API canvas methods
1 parent 3681850 commit 8441c04

File tree

5 files changed

+66
-0
lines changed

5 files changed

+66
-0
lines changed

frontend/OBSStudioAPI.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,26 @@ void OBSStudioAPI::obs_frontend_add_undo_redo_action(const char *name, const und
689689
[redo](const std::string &data) { redo(data.c_str()); }, undo_data, redo_data, repeatable);
690690
}
691691

692+
void OBSStudioAPI::obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list)
693+
{
694+
for (const auto &canvas : main->canvases) {
695+
obs_canvas_t *ref = obs_canvas_get_ref(canvas);
696+
if (ref)
697+
da_push_back(canvas_list->canvases, &ref);
698+
}
699+
}
700+
701+
obs_canvas_t *OBSStudioAPI::obs_frontend_add_canvas(const char *name, obs_video_info *ovi, int flags)
702+
{
703+
auto &canvas = main->AddCanvas(std::string(name), ovi, flags);
704+
return obs_canvas_get_ref(canvas);
705+
}
706+
707+
bool OBSStudioAPI::obs_frontend_remove_canvas(obs_canvas_t *canvas)
708+
{
709+
return main->RemoveCanvas(canvas);
710+
}
711+
692712
void OBSStudioAPI::on_load(obs_data_t *settings)
693713
{
694714
for (size_t i = saveCallbacks.size(); i > 0; i--) {

frontend/OBSStudioAPI.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,12 @@ struct OBSStudioAPI : obs_frontend_callbacks {
224224
void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo, const undo_redo_cb redo,
225225
const char *undo_data, const char *redo_data, bool repeatable) override;
226226

227+
void obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list) override;
228+
229+
obs_canvas_t *obs_frontend_add_canvas(const char *name, obs_video_info *ovi, int flags) override;
230+
231+
bool obs_frontend_remove_canvas(obs_canvas_t *canvas) override;
232+
227233
void on_load(obs_data_t *settings) override;
228234

229235
void on_preload(obs_data_t *settings) override;

frontend/api/obs-frontend-api.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -597,3 +597,19 @@ void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo
597597
if (callbacks_valid())
598598
c->obs_frontend_add_undo_redo_action(name, undo, redo, undo_data, redo_data, repeatable);
599599
}
600+
601+
void obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list)
602+
{
603+
if (callbacks_valid())
604+
c->obs_frontend_get_canvases(canvas_list);
605+
}
606+
607+
obs_canvas_t *obs_frontend_add_canvas(const char *name, obs_video_info *ovi, int flags)
608+
{
609+
return !!callbacks_valid() ? c->obs_frontend_add_canvas(name, ovi, flags) : nullptr;
610+
}
611+
612+
bool obs_frontend_remove_canvas(obs_canvas_t *canvas)
613+
{
614+
return !!callbacks_valid() ? c->obs_frontend_remove_canvas(canvas) : false;
615+
}

frontend/api/obs-frontend-api.h

+20
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ enum obs_frontend_event {
6262
OBS_FRONTEND_EVENT_SCENE_COLLECTION_RENAMED,
6363
OBS_FRONTEND_EVENT_THEME_CHANGED,
6464
OBS_FRONTEND_EVENT_SCREENSHOT_TAKEN,
65+
66+
OBS_FRONTEND_EVENT_CANVAS_ADDED,
67+
OBS_FRONTEND_EVENT_CANVAS_REMOVED,
6568
};
6669

6770
/* ------------------------------------------------------------------------- */
@@ -80,6 +83,19 @@ static inline void obs_frontend_source_list_free(struct obs_frontend_source_list
8083
da_free(source_list->sources);
8184
}
8285

86+
struct obs_frontend_canvas_list {
87+
DARRAY(obs_canvas_t *) canvases;
88+
};
89+
90+
static inline void obs_frontend_canvas_list_free(struct obs_frontend_canvas_list *canvas_list)
91+
{
92+
size_t num = canvas_list->canvases.num;
93+
for (size_t i = 0; i < num; i++)
94+
obs_canvas_release(canvas_list->canvases.array[i]);
95+
96+
da_free(canvas_list->canvases);
97+
}
98+
8399
#endif //!SWIG
84100

85101
/* ------------------------------------------------------------------------- */
@@ -238,6 +254,10 @@ typedef void (*undo_redo_cb)(const char *data);
238254
EXPORT void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo, const undo_redo_cb redo,
239255
const char *undo_data, const char *redo_data, bool repeatable);
240256

257+
EXPORT void obs_frontend_get_canvases(struct obs_frontend_canvas_list *canvas_list);
258+
EXPORT obs_canvas_t *obs_frontend_add_canvas(const char *name, struct obs_video_info *ovi, int flags);
259+
EXPORT bool obs_frontend_remove_canvas(obs_canvas_t *canvas);
260+
241261
/* ------------------------------------------------------------------------- */
242262

243263
#ifdef __cplusplus

frontend/api/obs-frontend-internal.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,10 @@ struct obs_frontend_callbacks {
137137
virtual void obs_frontend_add_undo_redo_action(const char *name, const undo_redo_cb undo,
138138
const undo_redo_cb redo, const char *undo_data,
139139
const char *redo_data, bool repeatable) = 0;
140+
141+
virtual obs_canvas_t *obs_frontend_add_canvas(const char *name, obs_video_info *ovi, int flags) = 0;
142+
virtual bool obs_frontend_remove_canvas(obs_canvas_t *canvas) = 0;
143+
virtual void obs_frontend_get_canvases(obs_frontend_canvas_list *canvas_list) = 0;
140144
};
141145

142146
EXPORT void obs_frontend_set_callbacks_internal(obs_frontend_callbacks *callbacks);

0 commit comments

Comments
 (0)