diff --git a/obs/obs-app.cpp b/obs/obs-app.cpp index 9a5654923..b1f16d371 100644 --- a/obs/obs-app.cpp +++ b/obs/obs-app.cpp @@ -57,6 +57,7 @@ static string currentLogFile; static string lastLogFile; static bool portable_mode = false; +string opt_starting_scene; QObject *CreateShortcutFilter() { @@ -1553,6 +1554,9 @@ int main(int argc, char *argv[]) for (int i = 1; i < argc; i++) { if (arg_is(argv[i], "--portable", "-p")) { portable_mode = true; + + } else if (arg_is(argv[i], "--scene", nullptr)) { + if (++i < argc) opt_starting_scene = argv[i]; } } diff --git a/obs/obs-app.hpp b/obs/obs-app.hpp index e68e572fd..69f98a713 100644 --- a/obs/obs-app.hpp +++ b/obs/obs-app.hpp @@ -153,3 +153,5 @@ static inline int GetProfilePath(char *path, size_t size, const char *file) App()->GetMainWindow()); return window->GetProfilePath(path, size, file); } + +extern std::string opt_starting_scene; diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index 367a2101a..235f7d29e 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -500,6 +500,12 @@ void OBSBasic::Load(const char *file) const char *transitionName = obs_data_get_string(data, "current_transition"); + if (!opt_starting_scene.empty()) { + programSceneName = opt_starting_scene.c_str(); + if (!IsPreviewProgramMode()) + sceneName = opt_starting_scene.c_str(); + } + int newDuration = obs_data_get_int(data, "transition_duration"); if (!newDuration) newDuration = 300; @@ -542,8 +548,22 @@ void OBSBasic::Load(const char *file) ui->transitionDuration->setValue(newDuration); SetTransition(curTransition); +retryScene: curScene = obs_get_source_by_name(sceneName); curProgramScene = obs_get_source_by_name(programSceneName); + + /* if the starting scene command line parameter is bad at all, + * fall back to original settings */ + if (!opt_starting_scene.empty() && (!curScene || !curProgramScene)) { + sceneName = obs_data_get_string(data, "current_scene"); + programSceneName = obs_data_get_string(data, + "current_program_scene"); + obs_source_release(curScene); + obs_source_release(curProgramScene); + opt_starting_scene.clear(); + goto retryScene; + } + if (!curProgramScene) { curProgramScene = curScene; obs_source_addref(curScene); @@ -575,6 +595,9 @@ void OBSBasic::Load(const char *file) obs_data_release(data); + if (!opt_starting_scene.empty()) + opt_starting_scene.clear(); + disableSaving--; }