From 03f67534c78805543097c9032449c1d425d3b748 Mon Sep 17 00:00:00 2001 From: WarmUpTill <19472752+WarmUpTill@users.noreply.github.com> Date: Wed, 3 Dec 2025 19:59:47 +0100 Subject: [PATCH] Default to main canvas in scene selection New scene selections would have no canvas selected at all. This would cause issues in places which do not support an empty canvas selection. For example, the "scene changed" check of the scene condition would not work as without any canvas it is not clear which scene to check for. --- lib/utils/canvas-helpers.cpp | 6 ++++++ lib/utils/canvas-helpers.hpp | 1 + lib/utils/scene-selection.cpp | 9 +++++---- lib/utils/scene-selection.hpp | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/utils/canvas-helpers.cpp b/lib/utils/canvas-helpers.cpp index 458ce014..6bde132a 100644 --- a/lib/utils/canvas-helpers.cpp +++ b/lib/utils/canvas-helpers.cpp @@ -297,6 +297,12 @@ int GetIndexOfScene(const OBSWeakCanvas &weakCanvas, const OBSWeakSource &scene) return data.idx; } +OBSWeakCanvas GetMainCanvas() +{ + OBSCanvasAutoRelease mainCanvas = obs_get_main_canvas(); + return OBSGetWeakRef(mainCanvas); +} + #if LIBOBS_API_VER < MAKE_SEMANTIC_VERSION(31, 1, 0) obs_canvas_t *obs_canvas_get_ref(obs_canvas_t *) diff --git a/lib/utils/canvas-helpers.hpp b/lib/utils/canvas-helpers.hpp index 8644252f..4b97446b 100644 --- a/lib/utils/canvas-helpers.hpp +++ b/lib/utils/canvas-helpers.hpp @@ -42,6 +42,7 @@ EXPORT OBSWeakSource GetActiveCanvasScene(const OBSWeakCanvas &canvas); EXPORT OBSWeakSource GetSceneAtIndex(const OBSWeakCanvas &weakCanvas, int idx); EXPORT int GetIndexOfScene(const OBSWeakCanvas &weakCanvas, const OBSWeakSource &scene); +EXPORT OBSWeakCanvas GetMainCanvas(); class CanvasSelection : public FilterComboBox { Q_OBJECT diff --git a/lib/utils/scene-selection.cpp b/lib/utils/scene-selection.cpp index 7e9a9b61..1ef35e1d 100644 --- a/lib/utils/scene-selection.cpp +++ b/lib/utils/scene-selection.cpp @@ -103,10 +103,11 @@ void SceneSelection::Load(obs_data_t *obj, const char *name, OBSDataAutoRelease data = obs_data_get_obj(obj, selectionSaveName.data()); - if (obs_data_has_user_value(data, canvasSaveName.data())) { - _canvas = GetWeakCanvasByName( - obs_data_get_string(data, canvasSaveName.data())); - } else { + const char *canvasName = + obs_data_get_string(data, canvasSaveName.data()); + _canvas = GetWeakCanvasByName( + obs_data_get_string(data, canvasSaveName.data())); + if (strcmp(canvasName, "") == 0) { OBSCanvasAutoRelease mainCanvas = obs_get_main_canvas(); _canvas = obs_canvas_get_weak_canvas(mainCanvas); obs_weak_canvas_release(_canvas); diff --git a/lib/utils/scene-selection.hpp b/lib/utils/scene-selection.hpp index 0c035bb6..f9e39061 100644 --- a/lib/utils/scene-selection.hpp +++ b/lib/utils/scene-selection.hpp @@ -30,7 +30,7 @@ public: private: OBSWeakSource _scene; - OBSWeakCanvas _canvas; + OBSWeakCanvas _canvas = GetMainCanvas(); SceneGroup *_group = nullptr; std::weak_ptr _variable; Type _type = Type::SCENE;