@@ -808,7 +808,8 @@ static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent, v
808
808
809
809
static obs_data_t *GenerateSaveData (obs_data_array_t *sceneOrder, obs_data_array_t *quickTransitionData,
810
810
int transitionDuration, obs_data_array_t *transitions, OBSScene &scene,
811
- OBSSource &curProgramScene, obs_data_array_t *savedProjectorList)
811
+ OBSSource &curProgramScene, obs_data_array_t *savedProjectorList,
812
+ obs_data_array_t *savedCanvases)
812
813
{
813
814
obs_data_t *saveData = obs_data_create ();
814
815
@@ -865,6 +866,7 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder, obs_data_array
865
866
obs_data_set_array (saveData, " quick_transitions" , quickTransitionData);
866
867
obs_data_set_array (saveData, " transitions" , transitions);
867
868
obs_data_set_array (saveData, " saved_projectors" , savedProjectorList);
869
+ obs_data_set_array (saveData, " canvases" , savedCanvases);
868
870
obs_data_array_release (sourcesArray);
869
871
obs_data_array_release (groupsArray);
870
872
@@ -885,8 +887,10 @@ void OBSBasic::Save(SceneCollection &collection)
885
887
OBSDataArrayAutoRelease transitions = SaveTransitions ();
886
888
OBSDataArrayAutoRelease quickTrData = SaveQuickTransitions ();
887
889
OBSDataArrayAutoRelease savedProjectorList = SaveProjectors ();
890
+ OBSDataArrayAutoRelease savedCanvases = OBS::Canvas::SaveCanvases (canvases);
888
891
OBSDataAutoRelease saveData = GenerateSaveData (sceneOrder, quickTrData, ui->transitionDuration ->value (),
889
- transitions, scene, curProgramScene, savedProjectorList);
892
+ transitions, scene, curProgramScene, savedProjectorList,
893
+ savedCanvases);
890
894
891
895
obs_data_set_bool (saveData, " preview_locked" , ui->preview ->Locked ());
892
896
obs_data_set_bool (saveData, " scaling_enabled" , ui->preview ->IsFixedScaling ());
@@ -1171,6 +1175,7 @@ void OBSBasic::LoadData(obs_data_t *data, SceneCollection &collection)
1171
1175
OBSDataArrayAutoRelease sources = obs_data_get_array (data, " sources" );
1172
1176
OBSDataArrayAutoRelease groups = obs_data_get_array (data, " groups" );
1173
1177
OBSDataArrayAutoRelease transitions = obs_data_get_array (data, " transitions" );
1178
+ OBSDataArrayAutoRelease collection_canvases = obs_data_get_array (data, " canvases" );
1174
1179
const char *sceneName = obs_data_get_string (data, " current_scene" );
1175
1180
const char *programSceneName = obs_data_get_string (data, " current_program_scene" );
1176
1181
const char *transitionName = obs_data_get_string (data, " current_transition" );
@@ -1207,6 +1212,9 @@ void OBSBasic::LoadData(obs_data_t *data, SceneCollection &collection)
1207
1212
LoadAudioDevice (AUX_AUDIO_3, 5 , data);
1208
1213
LoadAudioDevice (AUX_AUDIO_4, 6 , data);
1209
1214
1215
+ if (collection_canvases)
1216
+ canvases = OBS::Canvas::LoadCanvases (collection_canvases);
1217
+
1210
1218
if (!sources) {
1211
1219
sources = std::move (groups);
1212
1220
} else {
@@ -1525,6 +1533,12 @@ void OBSBasic::ClearSceneData()
1525
1533
obs_enum_scenes (cb, nullptr );
1526
1534
obs_enum_sources (cb, nullptr );
1527
1535
1536
+ for (const auto &canvas : canvases) {
1537
+ obs_canvas_enum_scenes (canvas, cb, nullptr );
1538
+ }
1539
+
1540
+ canvases.clear ();
1541
+
1528
1542
OnEvent (OBS_FRONTEND_EVENT_SCENE_COLLECTION_CLEANUP);
1529
1543
1530
1544
undo_s.clear ();
0 commit comments