diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 7db5e652..10094b2d 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -91,7 +91,7 @@ AdvSceneSwitcher.condition.scene.type.previous="Previous" AdvSceneSwitcher.condition.scene.entry="{{sceneType}} scene is {{scenes}}" AdvSceneSwitcher.condition.window="Window" AdvSceneSwitcher.condition.window.entry.line1="{{windows}} exist and ..." -AdvSceneSwitcher.condition.window.entry.line2="... is {{fullscreen}} fullscreen {{maximized}} maximized {{focused}} focused" +AdvSceneSwitcher.condition.window.entry.line2="... is {{fullscreen}} fullscreen {{maximized}} maximized {{focused}} focused {{windowFocusChanged}} foreground window changed" AdvSceneSwitcher.condition.file="File" AdvSceneSwitcher.condition.file.entry.line1="Content of {{fileType}} {{filePath}} {{browseButton}} matches:" AdvSceneSwitcher.condition.file.entry.line2="{{matchText}}" diff --git a/src/headers/macro-condition-window.hpp b/src/headers/macro-condition-window.hpp index 022430e3..66d8fcc2 100644 --- a/src/headers/macro-condition-window.hpp +++ b/src/headers/macro-condition-window.hpp @@ -24,6 +24,7 @@ public: bool _fullscreen = false; bool _maximized = false; bool _focus = true; + bool _windowFocusChanged = false; private: static bool _registered; @@ -50,13 +51,15 @@ private slots: void WindowChanged(const QString &text); void FullscreenChanged(int state); void MaximizedChanged(int state); - void FocusChanged(int state); + void FocusedChanged(int state); + void WindowFocusChanged(int state); protected: QComboBox *_windowSelection; QCheckBox *_fullscreen; QCheckBox *_maximized; QCheckBox *_focused; + QCheckBox *_windowFocusChanged; std::shared_ptr _entryData; private: diff --git a/src/macro-condition-window.cpp b/src/macro-condition-window.cpp index e0289ba6..a1743842 100644 --- a/src/macro-condition-window.cpp +++ b/src/macro-condition-window.cpp @@ -47,11 +47,14 @@ bool MacroConditionWindow::CheckWindowTitleSwitchRegex( return match; } +bool foregroundWindowChanged() +{ + return switcher->currentTitle != switcher->lastTitle; +} + bool MacroConditionWindow::CheckCondition() { - std::string currentWindowTitle; - GetCurrentWindowTitle(currentWindowTitle); - + std::string currentWindowTitle = switcher->currentTitle; std::vector windowList; GetWindowList(windowList); @@ -64,6 +67,7 @@ bool MacroConditionWindow::CheckCondition() match = CheckWindowTitleSwitchRegex(currentWindowTitle, windowList); } + match = match && (!_windowFocusChanged || foregroundWindowChanged()); return match; } @@ -75,6 +79,7 @@ bool MacroConditionWindow::Save(obs_data_t *obj) obs_data_set_bool(obj, "fullscreen", _fullscreen); obs_data_set_bool(obj, "maximized", _maximized); obs_data_set_bool(obj, "focus", _focus); + obs_data_set_bool(obj, "windowFocusChanged", _windowFocusChanged); return true; } @@ -85,6 +90,7 @@ bool MacroConditionWindow::Load(obs_data_t *obj) _fullscreen = obs_data_get_bool(obj, "fullscreen"); _maximized = obs_data_get_bool(obj, "maximized"); _focus = obs_data_get_bool(obj, "focus"); + _windowFocusChanged = obs_data_get_bool(obj, "windowFocusChanged"); return true; } @@ -99,6 +105,7 @@ MacroConditionWindowEdit::MacroConditionWindowEdit( _fullscreen = new QCheckBox(); _maximized = new QCheckBox(); _focused = new QCheckBox(); + _windowFocusChanged = new QCheckBox(); QWidget::connect(_windowSelection, SIGNAL(currentTextChanged(const QString &)), this, @@ -108,7 +115,9 @@ MacroConditionWindowEdit::MacroConditionWindowEdit( QWidget::connect(_maximized, SIGNAL(stateChanged(int)), this, SLOT(MaximizedChanged(int))); QWidget::connect(_focused, SIGNAL(stateChanged(int)), this, - SLOT(FocusChanged(int))); + SLOT(FocusedChanged(int))); + QWidget::connect(_windowFocusChanged, SIGNAL(stateChanged(int)), this, + SLOT(WindowFocusChanged(int))); populateWindowSelection(_windowSelection); @@ -117,6 +126,7 @@ MacroConditionWindowEdit::MacroConditionWindowEdit( {"{{fullscreen}}", _fullscreen}, {"{{maximized}}", _maximized}, {"{{focused}}", _focused}, + {"{{windowFocusChanged}}", _windowFocusChanged}, }; QVBoxLayout *mainLayout = new QVBoxLayout; @@ -167,7 +177,7 @@ void MacroConditionWindowEdit::MaximizedChanged(int state) _entryData->_maximized = state; } -void MacroConditionWindowEdit::FocusChanged(int state) +void MacroConditionWindowEdit::FocusedChanged(int state) { if (_loading || !_entryData) { return; @@ -177,6 +187,16 @@ void MacroConditionWindowEdit::FocusChanged(int state) _entryData->_focus = state; } +void MacroConditionWindowEdit::WindowFocusChanged(int state) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_windowFocusChanged = state; +} + void MacroConditionWindowEdit::UpdateEntryData() { if (!_entryData) { @@ -187,4 +207,5 @@ void MacroConditionWindowEdit::UpdateEntryData() _fullscreen->setChecked(_entryData->_fullscreen); _maximized->setChecked(_entryData->_maximized); _focused->setChecked(_entryData->_focus); + _windowFocusChanged->setChecked(_entryData->_windowFocusChanged); }