From 1573a8c4cde1cd9528b422b2dcc598e37ffe94a7 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 2 May 2024 19:12:26 +1000 Subject: WIP merge cyclically dependent components into one big component --- src/tangara/input/input_hook.cpp | 99 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 src/tangara/input/input_hook.cpp (limited to 'src/tangara/input/input_hook.cpp') diff --git a/src/tangara/input/input_hook.cpp b/src/tangara/input/input_hook.cpp new file mode 100644 index 00000000..d346b863 --- /dev/null +++ b/src/tangara/input/input_hook.cpp @@ -0,0 +1,99 @@ +/* + * Copyright 2024 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "input/input_hook.hpp" + +#include +#include + +#include "hal/lv_hal_indev.h" +#include "lua.hpp" + +#include "input/input_trigger.hpp" + +namespace input { + +Hook::Hook(std::string name, std::optional cb) + : name_(name), default_(cb), override_() {} + +auto Hook::invoke(lv_indev_data_t* d) -> void { + auto cb = callback(); + if (cb) { + std::invoke(cb->fn, d); + } +} + +auto Hook::override(std::optional cb) -> void { + override_ = cb; +} + +auto Hook::callback() -> std::optional { + if (override_) { + return override_; + } else if (default_) { + return default_; + } + return {}; +} + +TriggerHooks::TriggerHooks(std::string name, + std::optional click, + std::optional double_click, + std::optional long_press, + std::optional repeat) + : name_(name), + click_("click", click), + double_click_("double_click", double_click), + long_press_("long_press", long_press), + repeat_("repeat", repeat) {} + +auto TriggerHooks::update(bool pressed, lv_indev_data_t* d) -> void { + switch (trigger_.update(pressed)) { + case Trigger::State::kClick: + click_.invoke(d); + break; + case Trigger::State::kDoubleClick: + double_click_.invoke(d); + break; + case Trigger::State::kLongPress: + long_press_.invoke(d); + break; + case Trigger::State::kRepeatPress: + repeat_.invoke(d); + break; + case Trigger::State::kNone: + default: + break; + } +} + +auto TriggerHooks::override(Trigger::State s, std::optional cb) + -> void { + switch (s) { + case Trigger::State::kClick: + click_.override(cb); + break; + case Trigger::State::kLongPress: + long_press_.override(cb); + break; + case Trigger::State::kRepeatPress: + repeat_.override(cb); + break; + case Trigger::State::kNone: + default: + break; + } +} + +auto TriggerHooks::name() const -> const std::string& { + return name_; +} + +auto TriggerHooks::hooks() -> std::vector> { + return {click_, long_press_, repeat_}; +} + +} // namespace input -- cgit v1.2.3 From 26eb580043ad176bdc58d996f30d470e1073ef00 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 2 May 2024 21:52:59 +1000 Subject: move driver includes into a subdir as well --- src/tangara/input/input_hook.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/tangara/input/input_hook.cpp') diff --git a/src/tangara/input/input_hook.cpp b/src/tangara/input/input_hook.cpp index d346b863..6946c07f 100644 --- a/src/tangara/input/input_hook.cpp +++ b/src/tangara/input/input_hook.cpp @@ -70,8 +70,8 @@ auto TriggerHooks::update(bool pressed, lv_indev_data_t* d) -> void { } } -auto TriggerHooks::override(Trigger::State s, std::optional cb) - -> void { +auto TriggerHooks::override(Trigger::State s, + std::optional cb) -> void { switch (s) { case Trigger::State::kClick: click_.override(cb); -- cgit v1.2.3