From 82a41694a1c91b67d9c59d4be28247d859531384 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 19 Nov 2021 23:58:30 +0100 Subject: [PATCH] Allow interacting with OBS main window while plugin settings are opened --- src/advanced-scene-switcher.cpp | 25 ++++++++++++++++++++----- src/general.cpp | 3 +++ src/headers/advanced-scene-switcher.hpp | 1 + src/headers/switcher-data-structs.hpp | 2 ++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 5ccbde54..cc9d84db 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -20,6 +20,7 @@ SwitcherData *switcher = nullptr; AdvSceneSwitcher::AdvSceneSwitcher(QWidget *parent) : QDialog(parent), ui(new Ui_AdvSceneSwitcher) { + switcher->settingsWindowOpened = true; ui->setupUi(this); std::lock_guard lock(switcher->m); @@ -28,6 +29,13 @@ AdvSceneSwitcher::AdvSceneSwitcher(QWidget *parent) loadUI(); } +AdvSceneSwitcher::~AdvSceneSwitcher() +{ + if (switcher) { + switcher->settingsWindowOpened = false; + } +} + bool translationAvailable() { return !!strcmp(obs_module_text("AdvSceneSwitcher.pluginName"), @@ -635,6 +643,8 @@ static void OBSEvent(enum obs_frontend_event event, void *switcher) } } +AdvSceneSwitcher *ssWindow; + extern "C" void InitSceneSwitcher() { blog(LOG_INFO, "version: %s", g_GIT_TAG); @@ -652,11 +662,16 @@ extern "C" void InitSceneSwitcher() PlatformInit(); auto cb = []() { - QMainWindow *window = - (QMainWindow *)obs_frontend_get_main_window(); - - AdvSceneSwitcher ss(window); - ss.exec(); + if (switcher->settingsWindowOpened) { + ssWindow->show(); + ssWindow->raise(); + ssWindow->activateWindow(); + } else { + ssWindow = new AdvSceneSwitcher( + (QMainWindow *)obs_frontend_get_main_window()); + ssWindow->setAttribute(Qt::WA_DeleteOnClose); + ssWindow->show(); + } }; obs_frontend_add_save_callback(SaveSceneSwitcher, nullptr); diff --git a/src/general.cpp b/src/general.cpp index e15e0ffd..df4a1277 100644 --- a/src/general.cpp +++ b/src/general.cpp @@ -186,6 +186,9 @@ void AdvSceneSwitcher::on_toggleStartButton_clicked() void AdvSceneSwitcher::closeEvent(QCloseEvent *) { + if (!switcher) { + return; + } switcher->windowPos = this->pos(); switcher->windowSize = this->size(); diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp index 1b4b9948..edefd5d6 100644 --- a/src/headers/advanced-scene-switcher.hpp +++ b/src/headers/advanced-scene-switcher.hpp @@ -29,6 +29,7 @@ public: bool currentStatusActive = false; AdvSceneSwitcher(QWidget *parent); + ~AdvSceneSwitcher(); void reject() override; void closeEvent(QCloseEvent *event) override; diff --git a/src/headers/switcher-data-structs.hpp b/src/headers/switcher-data-structs.hpp index 7b98445e..e5818905 100644 --- a/src/headers/switcher-data-structs.hpp +++ b/src/headers/switcher-data-structs.hpp @@ -64,6 +64,8 @@ class SwitcherThread; struct SwitcherData { SwitcherThread *th = nullptr; + bool settingsWindowOpened = false; + std::condition_variable cv; std::mutex m; bool transitionActive = false;