diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-04-15 14:18:20 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-04-15 14:18:20 +1000 |
| commit | 1baaa6dadcea5b8a85f1629e31119f4edba91b75 (patch) | |
| tree | feae0c19f1a6744b60f3e59a5d9b8df1c28c6ebf /src/input/input_hook.cpp | |
| parent | c24dfa6846929e8a7659c4aa2633b82494ac7fe1 (diff) | |
| download | tangara-fw-1baaa6dadcea5b8a85f1629e31119f4edba91b75.tar.gz | |
Use more generic 'hooks' for each input device's actions
Diffstat (limited to 'src/input/input_hook.cpp')
| -rw-r--r-- | src/input/input_hook.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/input/input_hook.cpp b/src/input/input_hook.cpp new file mode 100644 index 00000000..d22a0b7a --- /dev/null +++ b/src/input/input_hook.cpp @@ -0,0 +1,66 @@ +/* + * Copyright 2024 jacqueline <me@jacqueline.id.au> + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#include "input_hook.hpp" + +#include <functional> +#include <optional> +#include "hal/lv_hal_indev.h" + +namespace input { + +Hook::Hook(HookCb fn) : default_(fn), override_() {} + +auto Hook::invoke(lv_indev_data_t* d) -> void { + if (override_) { + std::invoke(*override_, d); + } else if (default_) { + std::invoke(*default_, d); + } +} + +auto Hook::override(HookCb fn) -> void { + override_ = fn; +} + +TriggerHooks::TriggerHooks(HookCb click, HookCb long_press, HookCb repeat) + : click_(click), long_press_(long_press), 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::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, HookCb fn) -> void { + switch (s) { + case Trigger::State::kClick: + click_.override(fn); + break; + case Trigger::State::kLongPress: + long_press_.override(fn); + break; + case Trigger::State::kRepeatPress: + repeat_.override(fn); + break; + case Trigger::State::kNone: + default: + break; + } +} + +} // namespace input |
