summaryrefslogtreecommitdiff
path: root/src/input/input_hook.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/input_hook.cpp')
-rw-r--r--src/input/input_hook.cpp67
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