mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-21 17:34:57 -05:00
Add option to stop plugin in case unclean shutdown is detected
This commit is contained in:
parent
74a9681c8e
commit
628a4d896c
|
|
@ -184,6 +184,8 @@ target_sources(
|
|||
lib/utils/canvas-helpers.hpp
|
||||
lib/utils/condition-logic.cpp
|
||||
lib/utils/condition-logic.hpp
|
||||
lib/utils/crash-handler.cpp
|
||||
lib/utils/crash-handler.hpp
|
||||
lib/utils/curl-helper.cpp
|
||||
lib/utils/curl-helper.hpp
|
||||
lib/utils/cursor-shape-changer.cpp
|
||||
|
|
|
|||
|
|
@ -1390,6 +1390,8 @@ AdvSceneSwitcher.hotkey.macro.segment.remove="Remove selected macro segment"
|
|||
AdvSceneSwitcher.askBackup="Detected a new version of the Advanced Scene Switcher.\nShould a backup of the old settings be created?"
|
||||
AdvSceneSwitcher.askForMacro="Select macro{{macroSelection}}"
|
||||
|
||||
AdvSceneSwitcher.crashDetected="OBS did not shut down cleanly (for example, due to a crash or freeze).\n\nThe Advanced Scene Switcher plugin would normally start automatically.\nWould you like to keep it stopped for now?"
|
||||
|
||||
AdvSceneSwitcher.close="Close"
|
||||
AdvSceneSwitcher.browse="Browse"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include "advanced-scene-switcher.hpp"
|
||||
#include "backup.hpp"
|
||||
#include "crash-handler.hpp"
|
||||
#include "log-helper.hpp"
|
||||
#include "macro-helpers.hpp"
|
||||
#include "obs-module-helper.hpp"
|
||||
|
|
@ -207,9 +208,15 @@ static void SaveSceneSwitcher(obs_data_t *save_data, bool saving, void *)
|
|||
switcher->LoadSettings(data);
|
||||
switcher->m.unlock();
|
||||
|
||||
if (!switcher->stop) {
|
||||
switcher->Start();
|
||||
if (switcher->stop) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ShouldSkipPluginStartOnUncleanShutdown()) {
|
||||
return;
|
||||
}
|
||||
|
||||
switcher->Start();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
135
lib/utils/crash-handler.cpp
Normal file
135
lib/utils/crash-handler.cpp
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
#include "crash-handler.hpp"
|
||||
#include "log-helper.hpp"
|
||||
#include "obs-module-helper.hpp"
|
||||
#include "plugin-state-helpers.hpp"
|
||||
#include "ui-helpers.hpp"
|
||||
|
||||
#include <obs-frontend-api.h>
|
||||
#include <obs-module.h>
|
||||
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
|
||||
#include <thread>
|
||||
|
||||
namespace advss {
|
||||
|
||||
static constexpr std::string_view sentinel = ".running";
|
||||
|
||||
#ifndef NDEBUG
|
||||
static constexpr bool handleUncleanShutdown = false;
|
||||
#else
|
||||
static constexpr bool handleUncleanShutdown = true;
|
||||
#endif
|
||||
|
||||
static bool wasCleanShutdown = false;
|
||||
|
||||
static void setup();
|
||||
static bool setupDone = []() {
|
||||
AddPluginInitStep(setup);
|
||||
return true;
|
||||
}();
|
||||
|
||||
static void handleShutdown(enum obs_frontend_event event, void *)
|
||||
{
|
||||
if (event != OBS_FRONTEND_EVENT_EXIT) {
|
||||
return;
|
||||
}
|
||||
|
||||
char *sentinelFile = obs_module_config_path(sentinel.data());
|
||||
if (!sentinelFile) {
|
||||
return;
|
||||
}
|
||||
|
||||
QFile file(sentinelFile);
|
||||
if (!file.exists()) {
|
||||
bfree(sentinelFile);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!file.remove()) {
|
||||
blog(LOG_WARNING, "failed to remove sentinel file");
|
||||
}
|
||||
|
||||
bfree(sentinelFile);
|
||||
}
|
||||
|
||||
static void setup()
|
||||
{
|
||||
char *sentinelFile = obs_module_config_path(sentinel.data());
|
||||
if (!sentinelFile) {
|
||||
return;
|
||||
}
|
||||
|
||||
QString dirPath = QFileInfo(sentinelFile).absolutePath();
|
||||
QDir dir(dirPath);
|
||||
if (!dir.exists()) {
|
||||
if (!dir.mkpath(dirPath)) {
|
||||
blog(LOG_WARNING,
|
||||
"failed to create directory for sentinel file");
|
||||
bfree(sentinelFile);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
QFile file(sentinelFile);
|
||||
|
||||
wasCleanShutdown = file.exists();
|
||||
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||
blog(LOG_WARNING, "failed to create sentinel file");
|
||||
bfree(sentinelFile);
|
||||
return;
|
||||
}
|
||||
|
||||
file.write("running");
|
||||
file.close();
|
||||
bfree(sentinelFile);
|
||||
|
||||
obs_frontend_add_event_callback(handleShutdown, nullptr);
|
||||
return;
|
||||
}
|
||||
|
||||
static bool wasUncleanShutdown()
|
||||
{
|
||||
static bool alreadyHandled = false;
|
||||
|
||||
if (!handleUncleanShutdown || !wasCleanShutdown || alreadyHandled) {
|
||||
alreadyHandled = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
alreadyHandled = true;
|
||||
blog(LOG_WARNING, "unclean shutdown detected");
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool askForStartupSkip()
|
||||
{
|
||||
return DisplayMessage(obs_module_text("AdvSceneSwitcher.crashDetected"),
|
||||
true, false);
|
||||
}
|
||||
|
||||
bool ShouldSkipPluginStartOnUncleanShutdown()
|
||||
{
|
||||
if (!wasUncleanShutdown()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::thread t([]() {
|
||||
obs_queue_task(
|
||||
OBS_TASK_UI,
|
||||
[](void *) {
|
||||
const bool skipStart = askForStartupSkip();
|
||||
if (!skipStart) {
|
||||
StartPlugin();
|
||||
}
|
||||
},
|
||||
nullptr, false);
|
||||
});
|
||||
t.detach();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace advss
|
||||
7
lib/utils/crash-handler.hpp
Normal file
7
lib/utils/crash-handler.hpp
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
namespace advss {
|
||||
|
||||
bool ShouldSkipPluginStartOnUncleanShutdown();
|
||||
|
||||
} // namespace advss
|
||||
Loading…
Reference in New Issue
Block a user