|
|
|
@ -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
|
|
|
|
|