diff --git a/lib/macro/macro-action-loop.cpp b/lib/macro/macro-action-loop.cpp index 4274e81a..f6980916 100644 --- a/lib/macro/macro-action-loop.cpp +++ b/lib/macro/macro-action-loop.cpp @@ -13,6 +13,12 @@ bool MacroActionLoop::_registered = MacroActionFactory::Register( {MacroActionLoop::Create, MacroActionLoopEdit::Create, "AdvSceneSwitcher.action.loop"}); +MacroActionLoop::MacroActionLoop(Macro *m) + : MacroAction(m), + _loopMacro(Macro::CreateNested()) +{ +} + bool MacroActionLoop::PerformAction() { int iterations = 0; @@ -71,7 +77,7 @@ bool MacroActionLoop::Load(obs_data_t *obj) if (obs_data_has_user_value(obj, "loopMacro")) { OBSDataAutoRelease loopMacroData = obs_data_get_obj(obj, "loopMacro"); - _loopMacro = std::make_shared(); + _loopMacro = Macro::CreateNested(); _loopMacro->Load(loopMacroData); } _customWidgetHeight = obs_data_get_int(obj, "customWidgetHeight"); @@ -99,7 +105,7 @@ std::shared_ptr MacroActionLoop::Copy() const OBSDataAutoRelease data = obs_data_create(); _loopMacro->Save(data); - copy->_loopMacro = std::make_shared(); + copy->_loopMacro = Macro::CreateNested(); copy->_loopMacro->Load(data); copy->_loopMacro->PostLoad(); diff --git a/lib/macro/macro-action-loop.hpp b/lib/macro/macro-action-loop.hpp index 11b64054..c540b05d 100644 --- a/lib/macro/macro-action-loop.hpp +++ b/lib/macro/macro-action-loop.hpp @@ -11,7 +11,7 @@ namespace advss { class MacroActionLoop : public MacroAction { public: - MacroActionLoop(Macro *m) : MacroAction(m) {} + MacroActionLoop(Macro *m); bool PerformAction(); void LogAction() const; bool Save(obs_data_t *obj) const; @@ -22,7 +22,7 @@ public: std::shared_ptr Copy() const; void ResolveVariablesToFixedValues(); - std::shared_ptr _loopMacro = std::make_shared(); + std::shared_ptr _loopMacro; IntVariable _maxIterations = 100; int _customWidgetHeight = 0; diff --git a/lib/macro/macro-action-macro.cpp b/lib/macro/macro-action-macro.cpp index 0ee65fa7..45f93e12 100644 --- a/lib/macro/macro-action-macro.cpp +++ b/lib/macro/macro-action-macro.cpp @@ -18,6 +18,13 @@ bool MacroActionMacro::_registered = MacroActionFactory::Register( {MacroActionMacro::Create, MacroActionMacroEdit::Create, "AdvSceneSwitcher.action.macro"}); +MacroActionMacro::MacroActionMacro(Macro *m) + : MacroAction(m), + MacroRefAction(m), + _nestedMacro(Macro::CreateNested()) +{ +} + void MacroActionMacro::AdjustActionState(Macro *macro) const { const auto ¯oActions = _useElseSection ? macro->ElseActions() @@ -266,7 +273,7 @@ bool MacroActionMacro::Load(obs_data_t *obj) if (obs_data_has_user_value(obj, "nestedMacro")) { OBSDataAutoRelease nestedMacroData = obs_data_get_obj(obj, "nestedMacro"); - _nestedMacro = std::make_shared(); + _nestedMacro = Macro::CreateNested(); _nestedMacro->Load(nestedMacroData); } @@ -303,7 +310,7 @@ std::shared_ptr MacroActionMacro::Copy() const OBSDataAutoRelease data = obs_data_create(); _nestedMacro->Save(data); - copy->_nestedMacro = std::make_shared(); + copy->_nestedMacro = Macro::CreateNested(); copy->_nestedMacro->Load(data); copy->_nestedMacro->PostLoad(); diff --git a/lib/macro/macro-action-macro.hpp b/lib/macro/macro-action-macro.hpp index 057b8ab4..32651b5a 100644 --- a/lib/macro/macro-action-macro.hpp +++ b/lib/macro/macro-action-macro.hpp @@ -17,7 +17,7 @@ namespace advss { class MacroActionMacro final : public MacroRefAction { public: - MacroActionMacro(Macro *m) : MacroAction(m), MacroRefAction(m) {} + MacroActionMacro(Macro *m); bool PerformAction(); void LogAction() const; bool Save(obs_data_t *obj) const; @@ -73,7 +73,7 @@ public: std::string _actionId; RegexConfig _regex; RunOptions _runOptions = {}; - std::shared_ptr _nestedMacro = std::make_shared(); + std::shared_ptr _nestedMacro; int _customWidgetHeight = 0; private: diff --git a/lib/macro/macro.cpp b/lib/macro/macro.cpp index cde7a113..d5f60320 100644 --- a/lib/macro/macro.cpp +++ b/lib/macro/macro.cpp @@ -797,6 +797,14 @@ std::shared_ptr Macro::Parent() const return _parent.lock(); } +std::shared_ptr Macro::CreateNested() +{ + auto macro = std::make_shared(); + macro->_isNested = true; + macro->_registerHotkeys = false; + return macro; +} + void Macro::SetNestedParentMacro(Macro *parent) { _nestedParentMacro = parent; @@ -934,20 +942,12 @@ bool Macro::Load(obs_data_t *obj) "macroElseActionSplitterPosition"); obs_data_set_default_bool(obj, "registerHotkeys", true); - _registerHotkeys = obs_data_get_bool(obj, "registerHotkeys"); - if (_registerHotkeys) { - SetupHotkeys(); - } - OBSDataArrayAutoRelease pauseHotkey = - obs_data_get_array(obj, "pauseHotkey"); - obs_hotkey_load(_pauseHotkey, pauseHotkey); - OBSDataArrayAutoRelease unpauseHotkey = - obs_data_get_array(obj, "unpauseHotkey"); - obs_hotkey_load(_unpauseHotkey, unpauseHotkey); - OBSDataArrayAutoRelease togglePauseHotkey = - obs_data_get_array(obj, "togglePauseHotkey"); - obs_hotkey_load(_togglePauseHotkey, togglePauseHotkey); - SetHotkeysDesc(); + _registerHotkeys = !_isNested && + obs_data_get_bool(obj, "registerHotkeys"); + _pauseHotkeyData = obs_data_get_array(obj, "pauseHotkey"); + _unpauseHotkeyData = obs_data_get_array(obj, "unpauseHotkey"); + _togglePauseHotkeyData = obs_data_get_array(obj, "togglePauseHotkey"); + _hotkeyLoadPending = true; bool root = true; OBSDataArrayAutoRelease conditions = @@ -1022,8 +1022,29 @@ bool Macro::Load(obs_data_t *obj) return true; } +void Macro::LoadHotkeys() +{ + if (!_hotkeyLoadPending) { + return; + } + _hotkeyLoadPending = false; + + if (_registerHotkeys) { + SetupHotkeys(); + } + obs_hotkey_load(_pauseHotkey, _pauseHotkeyData); + obs_hotkey_load(_unpauseHotkey, _unpauseHotkeyData); + obs_hotkey_load(_togglePauseHotkey, _togglePauseHotkeyData); + SetHotkeysDesc(); + + _pauseHotkeyData = nullptr; + _unpauseHotkeyData = nullptr; + _togglePauseHotkeyData = nullptr; +} + bool Macro::PostLoad() { + LoadHotkeys(); for (auto &c : _conditions) { c->WithLock([c]() { c->PostLoad(); }); } @@ -1149,6 +1170,10 @@ static obs_hotkey_id registerHotkeyHelper(const std::string prefix, void Macro::SetupHotkeys() { + if (_isNested) { + return; + } + if (_pauseHotkey != OBS_INVALID_HOTKEY_ID || _unpauseHotkey != OBS_INVALID_HOTKEY_ID || _togglePauseHotkey != OBS_INVALID_HOTKEY_ID) { diff --git a/lib/macro/macro.hpp b/lib/macro/macro.hpp index ce6155b4..ead1aa95 100644 --- a/lib/macro/macro.hpp +++ b/lib/macro/macro.hpp @@ -130,6 +130,7 @@ public: void SetParent(std::shared_ptr m) { _parent = m; } std::shared_ptr Parent() const; + static std::shared_ptr CreateNested(); void SetNestedParentMacro(Macro *parent); Macro *GetNestedParentMacro() const { return _nestedParentMacro; } @@ -163,6 +164,7 @@ public: private: void SetupHotkeys(); + void LoadHotkeys(); void ClearHotkeys() const; void SetHotkeysDesc() const; @@ -191,6 +193,7 @@ private: std::weak_ptr _parent; Macro *_nestedParentMacro = nullptr; + bool _isNested = false; uint32_t _groupSize = 0; bool _isGroup = false; bool _isCollapsed = false; @@ -213,6 +216,10 @@ private: obs_hotkey_id _pauseHotkey = OBS_INVALID_HOTKEY_ID; obs_hotkey_id _unpauseHotkey = OBS_INVALID_HOTKEY_ID; obs_hotkey_id _togglePauseHotkey = OBS_INVALID_HOTKEY_ID; + bool _hotkeyLoadPending = false; + OBSDataArrayAutoRelease _pauseHotkeyData; + OBSDataArrayAutoRelease _unpauseHotkeyData; + OBSDataArrayAutoRelease _togglePauseHotkeyData; ActionTriggerMode _actionTriggerMode = ActionTriggerMode::MACRO_RESULT_CHANGED; diff --git a/tests/stubs/macro-action-macro.cpp b/tests/stubs/macro-action-macro.cpp index b0f08488..c24ab043 100644 --- a/tests/stubs/macro-action-macro.cpp +++ b/tests/stubs/macro-action-macro.cpp @@ -5,6 +5,10 @@ namespace advss { bool MacroActionMacro::_registered = false; const std::string MacroActionMacro::id = "macro"; +MacroActionMacro::MacroActionMacro(Macro *m) : MacroAction(m), MacroRefAction(m) +{ +} + bool MacroActionMacro::PerformAction() { return false;