diff options
Diffstat (limited to 'src/input/input_hook.cpp')
| -rw-r--r-- | src/input/input_hook.cpp | 67 |
1 files changed, 54 insertions, 13 deletions
diff --git a/src/input/input_hook.cpp b/src/input/input_hook.cpp index d22a0b7a..1bb92196 100644 --- a/src/input/input_hook.cpp +++ b/src/input/input_hook.cpp @@ -9,25 +9,42 @@ #include <functional> #include <optional> #include "hal/lv_hal_indev.h" +#include "input_trigger.hpp" +#include "lua.h" namespace input { -Hook::Hook(HookCb fn) : default_(fn), override_() {} +Hook::Hook(std::string name, std::optional<HookCallback> cb) + : name_(name), default_(cb), override_() {} auto Hook::invoke(lv_indev_data_t* d) -> void { - if (override_) { - std::invoke(*override_, d); - } else if (default_) { - std::invoke(*default_, d); + auto cb = callback(); + if (cb) { + std::invoke(cb->fn, d); } } -auto Hook::override(HookCb fn) -> void { - override_ = fn; +auto Hook::override(std::optional<HookCallback> cb) -> void { + override_ = cb; +} + +auto Hook::callback() -> std::optional<HookCallback> { + if (override_) { + return override_; + } else if (default_) { + return default_; + } + return {}; } -TriggerHooks::TriggerHooks(HookCb click, HookCb long_press, HookCb repeat) - : click_(click), long_press_(long_press), repeat_(repeat) {} +TriggerHooks::TriggerHooks(std::string name, + std::optional<HookCallback> click, + std::optional<HookCallback> long_press, + std::optional<HookCallback> repeat) + : name_(name), + click_("click", 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)) { @@ -46,16 +63,17 @@ auto TriggerHooks::update(bool pressed, lv_indev_data_t* d) -> void { } } -auto TriggerHooks::override(Trigger::State s, HookCb fn) -> void { +auto TriggerHooks::override(Trigger::State s, std::optional<HookCallback> cb) + -> void { switch (s) { case Trigger::State::kClick: - click_.override(fn); + click_.override(cb); break; case Trigger::State::kLongPress: - long_press_.override(fn); + long_press_.override(cb); break; case Trigger::State::kRepeatPress: - repeat_.override(fn); + repeat_.override(cb); break; case Trigger::State::kNone: default: @@ -63,4 +81,27 @@ auto TriggerHooks::override(Trigger::State s, HookCb fn) -> void { } } +auto TriggerHooks::name() const -> const std::string& { + return name_; +} + +auto TriggerHooks::pushHooks(lua_State* L) -> void { + lua_newtable(L); + + auto add_trigger = [&](Hook& h) { + lua_pushlstring(L, h.name().data(), h.name().size()); + auto cb = h.callback(); + if (cb) { + lua_pushlstring(L, cb->name.data(), cb->name.size()); + } else { + lua_pushnil(L); + } + lua_rawset(L, -3); + }; + + add_trigger(click_); + add_trigger(long_press_); + add_trigger(repeat_); +} + } // namespace input |
