From 4bdebb7febc130a8b1cdaab21b52f045fc8290ac Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Mon, 11 Dec 2023 21:41:06 +0100 Subject: [PATCH] Fix crash when asking for settings backup This dialog cannot be modal since other plugins might attempt to display content which might result in a deadlock. --- src/advanced-scene-switcher.cpp | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 178d7aa6..11e7b027 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -135,7 +136,7 @@ bool AdvSceneSwitcher::eventFilter(QObject *obj, QEvent *event) /****************************************************************************** * Saving and loading ******************************************************************************/ -static void AskForBackup(obs_data_t *obj); +static void AskForBackup(const QString &json); static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) { @@ -156,16 +157,25 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) switcher->Stop(); switcher->m.lock(); - obs_data_t *obj = + OBSDataAutoRelease obj = obs_data_get_obj(save_data, "advanced-scene-switcher"); if (!obj) { obj = obs_data_create(); } if (switcher->VersionChanged(obj, g_GIT_SHA1)) { - AskForBackup(obj); + auto json = obs_data_get_json(obj); + static QString jsonQString = json ? json : ""; + std::thread t([]() { + obs_queue_task( + OBS_TASK_UI, + [](void *) { + AskForBackup(jsonQString); + }, + nullptr, false); + }); + t.detach(); } switcher->LoadSettings(obj); - obs_data_release(obj); switcher->m.unlock(); if (!switcher->stop) { @@ -174,12 +184,12 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *) } } -static void AskForBackup(obs_data_t *obj) +static void AskForBackup(const QString &json) { - bool backupSettings = DisplayMessage( - obs_module_text("AdvSceneSwitcher.askBackup"), true); + const bool backupWasConfirmed = DisplayMessage( + obs_module_text("AdvSceneSwitcher.askBackup"), true, false); - if (!backupSettings) { + if (!backupWasConfirmed) { return; } @@ -198,8 +208,8 @@ static void AskForBackup(obs_data_t *obj) if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { return; } - - obs_data_save_json(obj, file.fileName().toUtf8().constData()); + auto out = QTextStream(&file); + out << json; } /******************************************************************************