diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index a8d608e4..bc6b2c0b 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -119,9 +119,13 @@ AdvSceneSwitcher.condition.audio.entry="{{checkType}} of {{audioSources}} is {{c AdvSceneSwitcher.condition.cursor="Cursor" AdvSceneSwitcher.condition.cursor.type.region="is in region" AdvSceneSwitcher.condition.cursor.type.moving="is moving" +AdvSceneSwitcher.condition.cursor.type.click="clicked" +AdvSceneSwitcher.condition.cursor.button.left="Left mouse button" +AdvSceneSwitcher.condition.cursor.button.middle="Middle mouse button" +AdvSceneSwitcher.condition.cursor.button.right="Right mouse button" AdvSceneSwitcher.condition.cursor.showFrame="Show frame" AdvSceneSwitcher.condition.cursor.hideFrame="Hide frame" -AdvSceneSwitcher.condition.cursor.entry.line1="Cursor is {{conditions}} {{minX}} {{minY}} {{maxX}} {{maxY}} - {{toggleFrameButton}}" +AdvSceneSwitcher.condition.cursor.entry.line1="Cursor is {{conditions}}{{buttons}}{{minX}}{{minY}}{{maxX}}{{maxY}}{{toggleFrameButton}}" AdvSceneSwitcher.condition.cursor.entry.line2="Cursor is currently at {{xPos}} x {{yPos}}" AdvSceneSwitcher.condition.scene="Scene" AdvSceneSwitcher.condition.scene.type.current="Current scene is" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 58545581..4c9ad0a1 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -85,7 +85,6 @@ AdvSceneSwitcher.macroTab.minimize="Minimizar" AdvSceneSwitcher.macroTab.highlightExecutedMacros="Resaltar macros ejecutadas recientemente" AdvSceneSwitcher.macroTab.highlightTrueConditions="Resaltar condiciones de la macro seleccionada, que se evaluaron como verdaderas recientemente" AdvSceneSwitcher.macroTab.highlightPerformedActions="Resaltar acciones realizadas recientemente de la macro seleccionada actualmente" -AdvSceneSwitcher.macroTab.disableHotkeys="Registre teclas de acceso rápido para controlar el estado de pausa de la macro seleccionada" ; Lógica de macros AdvSceneSwitcher.logic.none="Omitir entrada" @@ -111,7 +110,7 @@ AdvSceneSwitcher.condition.cursor.type.region="está en la región" AdvSceneSwitcher.condition.cursor.type.moving="se está moviendo" AdvSceneSwitcher.condition.cursor.showFrame="Mostrar cuadro" AdvSceneSwitcher.condition.cursor.hideFrame="Ocultar cuadro" -AdvSceneSwitcher.condition.cursor.entry.line1="El cursor es {{conditions}} {{minX}} {{minY}} {{maxX}} {{maxY}} - {{toggleFrameButton}}" +AdvSceneSwitcher.condition.cursor.entry.line1="El cursor es {{conditions}}{{buttons}}{{minX}}{{minY}}{{maxX}}{{maxY}}{{toggleFrameButton}}" AdvSceneSwitcher.condition.cursor.entry.line2="El cursor se encuentra actualmente en {{xPos}} x {{yPos}}" AdvSceneSwitcher.condition.scene="Escena" AdvSceneSwitcher.condition.scene.type.current="La escena actual es" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index 9bdf218b..9874c276 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -101,7 +101,7 @@ AdvSceneSwitcher.condition.cursor.type.region="alanında" AdvSceneSwitcher.condition.cursor.type.moving="hareketlidir" AdvSceneSwitcher.condition.cursor.showFrame="Çerçeveyi Göster" AdvSceneSwitcher.condition.cursor.hideFrame="Çerçeveyi Gizle" -AdvSceneSwitcher.condition.cursor.entry.line1="İmleç {{conditions}} {{minX}} {{minY}} {{maxX}} {{maxY}} - {{toggleFrameButton}}" +AdvSceneSwitcher.condition.cursor.entry.line1="İmleç {{conditions}}{{buttons}}{{minX}}{{minY}}{{maxX}}{{maxY}}{{toggleFrameButton}}" AdvSceneSwitcher.condition.cursor.entry.line2="İmleç şuanda {{xPos}} x {{yPos}}" AdvSceneSwitcher.condition.scene="Sahne" AdvSceneSwitcher.condition.scene.type.current="Mevcut Sahne" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 9a2be9ae..81d54c5c 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -118,7 +118,7 @@ AdvSceneSwitcher.condition.cursor.type.region="当前位置" AdvSceneSwitcher.condition.cursor.type.moving="正在移动" AdvSceneSwitcher.condition.cursor.showFrame="显示帧率" AdvSceneSwitcher.condition.cursor.hideFrame="隐藏帧率" -AdvSceneSwitcher.condition.cursor.entry.line1="鼠标 处于{{conditions}} {{minX}} {{minY}} {{maxX}} {{maxY}} - {{toggleFrameButton}}" +AdvSceneSwitcher.condition.cursor.entry.line1="鼠标 处于{{conditions}}{{buttons}}{{minX}}{{minY}}{{maxX}}{{maxY}}{{toggleFrameButton}}" AdvSceneSwitcher.condition.cursor.entry.line2="鼠标当前位于 {{xPos}} x {{yPos}}" AdvSceneSwitcher.condition.scene="场景" AdvSceneSwitcher.condition.scene.type.current="当前场景是" diff --git a/src/linux/advanced-scene-switcher-nix.cpp b/src/linux/advanced-scene-switcher-nix.cpp index 8eced83a..71bf4432 100644 --- a/src/linux/advanced-scene-switcher-nix.cpp +++ b/src/linux/advanced-scene-switcher-nix.cpp @@ -1,4 +1,5 @@ #include "platform-funcs.hpp" +#include "hotkey.hpp" #include #include @@ -46,6 +47,10 @@ static XScreenSaverAllocInfoFunc allocSSFunc = nullptr; static XScreenSaverQueryInfoFunc querySSFunc = nullptr; bool canGetIdleTime = false; +std::chrono::high_resolution_clock::time_point lastMouseLeftClickTime{}; +std::chrono::high_resolution_clock::time_point lastMouseMiddleClickTime{}; +std::chrono::high_resolution_clock::time_point lastMouseRightClickTime{}; + Display *disp() { if (!xdisplay) { diff --git a/src/macro-core/macro-condition-cursor.cpp b/src/macro-core/macro-condition-cursor.cpp index bf06ba4a..4e724737 100644 --- a/src/macro-core/macro-condition-cursor.cpp +++ b/src/macro-core/macro-condition-cursor.cpp @@ -10,32 +10,65 @@ bool MacroConditionCursor::_registered = MacroConditionFactory::Register( {MacroConditionCursor::Create, MacroConditionCursorEdit::Create, "AdvSceneSwitcher.condition.cursor"}); -static std::map cursorConditionTypes = { - {CursorCondition::REGION, - "AdvSceneSwitcher.condition.cursor.type.region"}, - {CursorCondition::MOVING, - "AdvSceneSwitcher.condition.cursor.type.moving"}, +static std::map + cursorConditionTypes = { + {MacroConditionCursor::Condition::REGION, + "AdvSceneSwitcher.condition.cursor.type.region"}, + {MacroConditionCursor::Condition::MOVING, + "AdvSceneSwitcher.condition.cursor.type.moving"}, +#ifdef _WIN32 // Not implemented for MacOS and Linux + {MacroConditionCursor::Condition::CLICK, + "AdvSceneSwitcher.condition.cursor.type.click"}, +#endif }; +static std::map buttonTypes = { + {MacroConditionCursor::Button::LEFT, + "AdvSceneSwitcher.condition.cursor.button.left"}, + {MacroConditionCursor::Button::MIDDLE, + "AdvSceneSwitcher.condition.cursor.button.middle"}, + {MacroConditionCursor::Button::RIGHT, + "AdvSceneSwitcher.condition.cursor.button.right"}, +}; + +bool MacroConditionCursor::CheckClick() +{ + switch (_button) { + case MacroConditionCursor::Button::LEFT: + return _lastCheckTime < lastMouseLeftClickTime; + case MacroConditionCursor::Button::MIDDLE: + return _lastCheckTime < lastMouseMiddleClickTime; + case MacroConditionCursor::Button::RIGHT: + return _lastCheckTime < lastMouseRightClickTime; + } + return false; +} + bool MacroConditionCursor::CheckCondition() { + bool ret = false; std::pair cursorPos = getCursorPos(); switch (_condition) { - case CursorCondition::REGION: - return cursorPos.first >= _minX && cursorPos.second >= _minY && - cursorPos.first <= _maxX && cursorPos.second <= _maxY; - case CursorCondition::MOVING: - return switcher->cursorPosChanged; - default: + case Condition::REGION: + ret = cursorPos.first >= _minX && cursorPos.second >= _minY && + cursorPos.first <= _maxX && cursorPos.second <= _maxY; + break; + case Condition::MOVING: + ret = switcher->cursorPosChanged; + break; + case Condition::CLICK: + ret = CheckClick(); break; } - return false; + _lastCheckTime = std::chrono::high_resolution_clock::now(); + return ret; } bool MacroConditionCursor::Save(obs_data_t *obj) { MacroCondition::Save(obj); obs_data_set_int(obj, "condition", static_cast(_condition)); + obs_data_set_int(obj, "button", static_cast(_button)); obs_data_set_int(obj, "minX", _minX); obs_data_set_int(obj, "minY", _minY); obs_data_set_int(obj, "maxX", _maxX); @@ -46,8 +79,8 @@ bool MacroConditionCursor::Save(obs_data_t *obj) bool MacroConditionCursor::Load(obs_data_t *obj) { MacroCondition::Load(obj); - _condition = static_cast( - obs_data_get_int(obj, "condition")); + _condition = static_cast(obs_data_get_int(obj, "condition")); + _button = static_cast