From d9997d374dddd2726b69e237b0960cbf656f0c13 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 28 May 2021 22:21:00 +0200 Subject: [PATCH] Add option to un-/pause macros using hotkeys --- data/locale/en-US.ini | 2 + src/headers/macro.hpp | 10 +++- src/macro.cpp | 109 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 115 insertions(+), 6 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 5c845ea1..3d24aa93 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -446,6 +446,8 @@ AdvSceneSwitcher.sceneTriggerTab.help="This tab allows you to trigger actions on AdvSceneSwitcher.hotkey.startSwitcherHotkey="Start the Advanced Scene Switcher" AdvSceneSwitcher.hotkey.stopSwitcherHotkey="Stop the Advanced Scene Switcher" AdvSceneSwitcher.hotkey.startStopToggleSwitcherHotkey="Toggle Start/Stop for the Advanced Scene Switcher" +AdvSceneSwitcher.hotkey.macro.pause="Pause macro %1" +AdvSceneSwitcher.hotkey.macro.unpause="Unpause macro %1" AdvSceneSwitcher.askBackup="Detected a new version of the Advanced Scene Switcher.\nShould a backup of the old settings be created?" diff --git a/src/headers/macro.hpp b/src/headers/macro.hpp index f5532c20..27595da8 100644 --- a/src/headers/macro.hpp +++ b/src/headers/macro.hpp @@ -60,14 +60,14 @@ public: class Macro { public: - Macro(std::string name = ""); + Macro(const std::string &name = ""); virtual ~Macro(); bool CeckMatch(); bool PerformAction(); bool Matched() { return _matched; } std::string Name() { return _name; } - void SetName(const std::string &name) { _name = name; } + void SetName(const std::string &name); void SetPaused(bool pause = true) { _paused = pause; } bool Paused() { return _paused; } int GetCount() { return _count; }; @@ -88,12 +88,18 @@ public: bool SwitchesScene(); private: + void SetupHotkeys(); + void ClearHotkeys(); + void SetHotkeysDesc(); + std::string _name = ""; std::deque> _conditions; std::deque> _actions; bool _matched = false; bool _paused = false; int _count = 0; + obs_hotkey_id _pauseHotkey = OBS_INVALID_HOTKEY_ID; + obs_hotkey_id _unpauseHotkey = OBS_INVALID_HOTKEY_ID; }; Macro *GetMacroByName(const char *name); diff --git a/src/macro.cpp b/src/macro.cpp index 1e4865ab..04da2b70 100644 --- a/src/macro.cpp +++ b/src/macro.cpp @@ -17,9 +17,16 @@ const std::map MacroCondition::logicTypes = { {LogicType::ROOT_NOT, {"AdvSceneSwitcher.logic.not"}}, }; -Macro::Macro(std::string name) : _name(name) {} +Macro::Macro(const std::string &name) +{ + SetupHotkeys(); + SetName(name); +} -Macro::~Macro() {} +Macro::~Macro() +{ + ClearHotkeys(); +} bool Macro::CeckMatch() { @@ -94,11 +101,24 @@ bool Macro::PerformAction() return ret; } +void Macro::SetName(const std::string &name) +{ + _name = name; + SetHotkeysDesc(); +} + bool Macro::Save(obs_data_t *obj) { obs_data_set_string(obj, "name", _name.c_str()); obs_data_set_bool(obj, "pause", _paused); + obs_data_array_t *pauseHotkey = obs_hotkey_save(_pauseHotkey); + obs_data_set_array(obj, "pauseHotkey", pauseHotkey); + obs_data_array_release(pauseHotkey); + obs_data_array_t *unpauseHotkey = obs_hotkey_save(_unpauseHotkey); + obs_data_set_array(obj, "unpauseHotkey", unpauseHotkey); + obs_data_array_release(unpauseHotkey); + obs_data_array_t *conditions = obs_data_array_create(); for (auto &c : _conditions) { obs_data_t *array_obj = obs_data_create(); @@ -164,8 +184,19 @@ bool Macro::Load(obs_data_t *obj) { _name = obs_data_get_string(obj, "name"); _paused = obs_data_get_bool(obj, "pause"); - bool root = true; + obs_data_array_t *pauseHotkey = obs_data_get_array(obj, "pauseHotkey"); + obs_hotkey_load(_pauseHotkey, pauseHotkey); + obs_data_array_release(pauseHotkey); + + obs_data_array_t *unpauseHotkey = + obs_data_get_array(obj, "unpauseHotkey"); + obs_hotkey_load(_unpauseHotkey, unpauseHotkey); + obs_data_array_release(unpauseHotkey); + + SetHotkeysDesc(); + + bool root = true; obs_data_array_t *conditions = obs_data_get_array(obj, "conditions"); size_t count = obs_data_array_count(conditions); @@ -212,7 +243,6 @@ bool Macro::Load(obs_data_t *obj) obs_data_release(array_obj); } obs_data_array_release(actions); - return true; } @@ -245,6 +275,77 @@ bool Macro::SwitchesScene() return false; } +static void pauseCB(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, + bool pressed) +{ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(data); + UNUSED_PARAMETER(hotkey); + if (pressed) { + auto m = static_cast(data); + m->SetPaused(true); + } +} + +static void unpauseCB(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, + bool pressed) +{ + UNUSED_PARAMETER(id); + UNUSED_PARAMETER(data); + UNUSED_PARAMETER(hotkey); + if (pressed) { + auto m = static_cast(data); + m->SetPaused(false); + } +} + +static int macroHotkeyID = 0; + +void Macro::SetupHotkeys() +{ + if (_pauseHotkey != OBS_INVALID_HOTKEY_ID || + _unpauseHotkey != OBS_INVALID_HOTKEY_ID) { + ClearHotkeys(); + } + + macroHotkeyID++; + + std::string hotkeyName = + "macro_pause_hotkey_" + std::to_string(macroHotkeyID); + QString format{obs_module_text("AdvSceneSwitcher.hotkey.macro.pause")}; + QString hotkeyDesc = format.arg(QString::fromStdString(_name)); + _pauseHotkey = obs_hotkey_register_frontend( + hotkeyName.c_str(), hotkeyDesc.toStdString().c_str(), pauseCB, + this); + + macroHotkeyID++; + + hotkeyName = "macro_pause_hotkey_" + _name; + format = {obs_module_text("AdvSceneSwitcher.hotkey.macro.unpause")}; + hotkeyDesc = format.arg(QString::fromStdString(_name)); + _unpauseHotkey = obs_hotkey_register_frontend( + hotkeyName.c_str(), hotkeyDesc.toStdString().c_str(), unpauseCB, + this); +} + +void Macro::ClearHotkeys() +{ + obs_hotkey_unregister(_pauseHotkey); + obs_hotkey_unregister(_unpauseHotkey); +} + +void Macro::SetHotkeysDesc() +{ + QString format{obs_module_text("AdvSceneSwitcher.hotkey.macro.pause")}; + QString hotkeyDesc = format.arg(QString::fromStdString(_name)); + obs_hotkey_set_description(_pauseHotkey, + hotkeyDesc.toStdString().c_str()); + format = {obs_module_text("AdvSceneSwitcher.hotkey.macro.unpause")}; + hotkeyDesc = format.arg(QString::fromStdString(_name)); + obs_hotkey_set_description(_unpauseHotkey, + hotkeyDesc.toStdString().c_str()); +} + bool MacroCondition::Save(obs_data_t *obj) { obs_data_set_string(obj, "id", GetId().c_str());