diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index db1bb86b..b44bd10b 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -223,7 +223,7 @@ AdvSceneSwitcher.condition.record.state.pause="Aufnahme pausiert" AdvSceneSwitcher.condition.record.state.stop="Aufnahme gestoppt" AdvSceneSwitcher.condition.record.entry="{{recordState}}" AdvSceneSwitcher.condition.process="Prozess" -AdvSceneSwitcher.condition.process.entry="{{processes}} läuft {{focused}} und ist fokusiert" +AdvSceneSwitcher.condition.process.entry="{{processes}}{{regex}}läuft{{focused}}und ist fokusiert" AdvSceneSwitcher.condition.process.entry.focus="Aktueller Vordergrundprozess: {{focusProcess}}" AdvSceneSwitcher.condition.idle="Leerlauf" AdvSceneSwitcher.condition.idle.entry="Keine Tastatur- oder Mauseingaben für {{duration}}" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 582202f6..b0eff907 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -300,7 +300,7 @@ AdvSceneSwitcher.condition.record.state.pause="Recording paused" AdvSceneSwitcher.condition.record.state.stop="Recording stopped" AdvSceneSwitcher.condition.record.entry="{{recordState}}" AdvSceneSwitcher.condition.process="Process" -AdvSceneSwitcher.condition.process.entry="{{processes}}is running{{focused}}and is focused" +AdvSceneSwitcher.condition.process.entry="{{processes}}{{regex}}is running{{focused}}and is focused" AdvSceneSwitcher.condition.process.entry.focus="Current foreground process:{{focusProcess}}" AdvSceneSwitcher.condition.idle="Idle" AdvSceneSwitcher.condition.idle.entry="No keyboard or mouse inputs for{{duration}}" @@ -1489,6 +1489,8 @@ AdvSceneSwitcher.tempVar.macro.runCount.description="The number of times a macro AdvSceneSwitcher.tempVar.macro.matchedCount="Matched count" AdvSceneSwitcher.tempVar.macro.matchedCount.description="The number of macros of which the condition state was true." +AdvSceneSwitcher.tempVar.process.name="Process name" + AdvSceneSwitcher.selectScene="--select scene--" AdvSceneSwitcher.selectPreviousScene="Previous Scene" AdvSceneSwitcher.selectCurrentScene="Current Scene" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index b5d2f4d9..d2a650b3 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -184,7 +184,7 @@ AdvSceneSwitcher.condition.record.state.pause="Grabación en pausa" AdvSceneSwitcher.condition.record.state.stop="Grabación detenida" AdvSceneSwitcher.condition.record.entry="{{recordState}}" AdvSceneSwitcher.condition.process="Proceso" -AdvSceneSwitcher.condition.process.entry="{{processes}} se está ejecutando {{focused}} y está enfocado" +AdvSceneSwitcher.condition.process.entry="{{processes}}{{regex}}se está ejecutando{{focused}}y está enfocado" AdvSceneSwitcher.condition.idle="Inactivo" AdvSceneSwitcher.condition.idle.entry="No hay entradas de teclado o ratón durante {{duration}}" AdvSceneSwitcher.condition.pluginState="Estado del complemento" diff --git a/data/locale/fr-FR.ini b/data/locale/fr-FR.ini index c5da6be5..b5f1e78a 100644 --- a/data/locale/fr-FR.ini +++ b/data/locale/fr-FR.ini @@ -286,7 +286,7 @@ AdvSceneSwitcher.condition.record.state.start="Enregistrement en cours" AdvSceneSwitcher.condition.record.state.pause="Enregistrement en pause" AdvSceneSwitcher.condition.record.state.stop="Arrêt de l'enregistrement" AdvSceneSwitcher.condition.process="Processus" -AdvSceneSwitcher.condition.process.entry="{{processes}}en cours d'exécution{{focused}}et est au premier plan" +AdvSceneSwitcher.condition.process.entry="{{processes}}{{regex}}en cours d'exécution{{focused}}et est au premier plan" AdvSceneSwitcher.condition.process.entry.focus="Processus au premier plan actuel :{{focusProcess}}" AdvSceneSwitcher.condition.idle="Inactif" AdvSceneSwitcher.condition.idle.entry="Aucune entrée de clavier ou de souris pendant{{duration}}" diff --git a/data/locale/ru-RU.ini b/data/locale/ru-RU.ini index 25c0cece..dcb6dd55 100644 --- a/data/locale/ru-RU.ini +++ b/data/locale/ru-RU.ini @@ -107,7 +107,7 @@ AdvSceneSwitcher.condition.record.state.start="Запись запущена" AdvSceneSwitcher.condition.record.state.pause="Запись приостановлена" AdvSceneSwitcher.condition.record.state.stop="Запись остановлена" AdvSceneSwitcher.condition.process="Процесс" -AdvSceneSwitcher.condition.process.entry="{{processes}} запущен {{focused}} и сфокусирован" +AdvSceneSwitcher.condition.process.entry="{{processes}}{{regex}}запущен{{focused}}и сфокусирован" AdvSceneSwitcher.condition.idle="Простой" AdvSceneSwitcher.condition.idle.entry="Не было ни клавиатуры, ни мыши в течении{{duration}}" AdvSceneSwitcher.condition.pluginState="Состояние плагина" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 33897317..eff85b84 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -161,7 +161,7 @@ AdvSceneSwitcher.condition.record.state.pause="Kayıt durakladı" AdvSceneSwitcher.condition.record.state.stop="Kayıt durdu" AdvSceneSwitcher.condition.record.entry="{{recordState}}" AdvSceneSwitcher.condition.process="İşlem" -AdvSceneSwitcher.condition.process.entry="{{processes}} çalışıyor {{focused}} ve odaklandı" +AdvSceneSwitcher.condition.process.entry="{{processes}}{{regex}}çalışıyor{{focused}}ve odaklandı" AdvSceneSwitcher.condition.idle="Boşta" AdvSceneSwitcher.condition.idle.entry="...için klavye veya fare girişi yok {{duration}}" AdvSceneSwitcher.condition.pluginState="Eklenti durumu" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 99531456..696089e6 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -269,7 +269,7 @@ AdvSceneSwitcher.condition.record.state.pause="录制暂停" AdvSceneSwitcher.condition.record.state.stop="录制停止" AdvSceneSwitcher.condition.record.entry="{{recordState}}" AdvSceneSwitcher.condition.process="进程" -AdvSceneSwitcher.condition.process.entry="{{processes}} 是正在运行 {{focused}} 并且是获得焦点" +AdvSceneSwitcher.condition.process.entry="{{processes}}{{regex}}是正在运行{{focused}}并且是获得焦点" AdvSceneSwitcher.condition.process.entry.focus="当前焦点进程: {{focusProcess}}" AdvSceneSwitcher.condition.idle="闲置检测" AdvSceneSwitcher.condition.idle.entry="没有键盘或鼠标输入{{duration}}" diff --git a/src/macro-core/macro-condition-process.cpp b/src/macro-core/macro-condition-process.cpp index e917ef05..b38aaa0b 100644 --- a/src/macro-core/macro-condition-process.cpp +++ b/src/macro-core/macro-condition-process.cpp @@ -19,25 +19,43 @@ bool MacroConditionProcess::CheckCondition() QStringList runningProcesses; QString proc = QString::fromStdString(_process); GetProcessList(runningProcesses); + std::string foregroundProcessName; + GetForegroundProcessName(foregroundProcessName); - bool equals = runningProcesses.contains(proc); - bool matches = runningProcesses.indexOf(QRegularExpression(proc)) != -1; - bool focus = !_focus || IsInFocus(proc); + SetVariableValue(foregroundProcessName); - if (IsReferencedInVars()) { - std::string name; - GetForegroundProcessName(name); - SetVariableValue(name); + if (!_regex.Enabled()) { + if (runningProcesses.contains(proc) && + (!_checkFocus || IsInFocus(proc))) { + SetTempVarValue("name", proc.toStdString()); + return true; + } + return false; } - return (equals || matches) && focus; + auto matchIndex = runningProcesses.indexOf(QRegularExpression(proc)); + if (matchIndex == -1) { + return false; + } + if (!_checkFocus) { + SetTempVarValue("name", + runningProcesses.at(matchIndex).toStdString()); + return true; + } + if (!IsInFocus(proc)) { + return false; + } + SetTempVarValue("name", foregroundProcessName); + return true; } bool MacroConditionProcess::Save(obs_data_t *obj) const { MacroCondition::Save(obj); obs_data_set_string(obj, "process", _process.c_str()); - obs_data_set_bool(obj, "focus", _focus); + obs_data_set_bool(obj, "focus", _checkFocus); + _regex.Save(obj); + obs_data_set_int(obj, "version", 1); return true; } @@ -45,7 +63,13 @@ bool MacroConditionProcess::Load(obs_data_t *obj) { MacroCondition::Load(obj); _process = obs_data_get_string(obj, "process"); - _focus = obs_data_get_bool(obj, "focus"); + _checkFocus = obs_data_get_bool(obj, "focus"); + // Fall back to partial match regex as default for old version + if (!obs_data_has_user_value(obj, "version")) { + _regex.SetEnabled(true); + } else { + _regex.Load(obj); + } return true; } @@ -54,10 +78,18 @@ std::string MacroConditionProcess::GetShortDesc() const return _process; } +void MacroConditionProcess::SetupTempVars() +{ + MacroCondition::SetupTempVars(); + AddTempvar("name", + obs_module_text("AdvSceneSwitcher.tempVar.process.name")); +} + MacroConditionProcessEdit::MacroConditionProcessEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), _processSelection(new QComboBox()), + _regex(new RegexConfigWidget(this)), _focused(new QCheckBox()), _focusProcess(new QLabel()), _focusLayout(new QHBoxLayout()) @@ -68,6 +100,8 @@ MacroConditionProcessEdit::MacroConditionProcessEdit( QWidget::connect(_processSelection, SIGNAL(currentTextChanged(const QString &)), this, SLOT(ProcessChanged(const QString &))); + QWidget::connect(_regex, SIGNAL(RegexConfigChanged(RegexConfig)), this, + SLOT(RegexChanged(RegexConfig))); QWidget::connect(_focused, SIGNAL(stateChanged(int)), this, SLOT(FocusChanged(int))); QWidget::connect(&_timer, SIGNAL(timeout()), this, @@ -77,6 +111,7 @@ MacroConditionProcessEdit::MacroConditionProcessEdit( std::unordered_map widgetPlaceholders = { {"{{processes}}", _processSelection}, + {"{{regex}}", _regex}, {"{{focused}}", _focused}, {"{{focusProcess}}", _focusProcess}, }; @@ -112,6 +147,18 @@ void MacroConditionProcessEdit::ProcessChanged(const QString &text) QString::fromStdString(_entryData->GetShortDesc())); } +void MacroConditionProcessEdit::RegexChanged(RegexConfig conf) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_regex = conf; + adjustSize(); + updateGeometry(); +} + void MacroConditionProcessEdit::FocusChanged(int state) { if (_loading || !_entryData) { @@ -119,7 +166,7 @@ void MacroConditionProcessEdit::FocusChanged(int state) } auto lock = LockContext(); - _entryData->_focus = state; + _entryData->_checkFocus = state; SetWidgetVisibility(); } @@ -134,7 +181,7 @@ void MacroConditionProcessEdit::SetWidgetVisibility() if (!_entryData) { return; } - SetLayoutVisible(_focusLayout, _entryData->_focus); + SetLayoutVisible(_focusLayout, _entryData->_checkFocus); adjustSize(); } @@ -145,7 +192,8 @@ void MacroConditionProcessEdit::UpdateEntryData() } _processSelection->setCurrentText(_entryData->_process.c_str()); - _focused->setChecked(_entryData->_focus); + _regex->SetRegexConfig(_entryData->_regex); + _focused->setChecked(_entryData->_checkFocus); SetWidgetVisibility(); } diff --git a/src/macro-core/macro-condition-process.hpp b/src/macro-core/macro-condition-process.hpp index 6bf0a795..8265329b 100644 --- a/src/macro-core/macro-condition-process.hpp +++ b/src/macro-core/macro-condition-process.hpp @@ -1,5 +1,6 @@ #pragma once #include "macro-condition-edit.hpp" +#include "regex-config.hpp" #include #include @@ -20,9 +21,12 @@ public: } std::string _process; - bool _focus = true; + bool _checkFocus = true; + RegexConfig _regex = RegexConfig::PartialMatchRegexConfig(); private: + void SetupTempVars(); + static bool _registered; static const std::string id; }; @@ -45,22 +49,22 @@ public: private slots: void ProcessChanged(const QString &text); + void RegexChanged(RegexConfig); void FocusChanged(int state); void UpdateFocusProcess(); signals: void HeaderInfoChanged(const QString &); -protected: +private: + void SetWidgetVisibility(); + QComboBox *_processSelection; + RegexConfigWidget *_regex; QCheckBox *_focused; QLabel *_focusProcess; QHBoxLayout *_focusLayout; QTimer _timer; std::shared_ptr _entryData; - -private: - void SetWidgetVisibility(); - bool _loading = true; };