summaryrefslogtreecommitdiff
path: root/src/input/include/input_hook.hpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-04-15 14:18:20 +1000
committerjacqueline <me@jacqueline.id.au>2024-04-15 14:18:20 +1000
commit1baaa6dadcea5b8a85f1629e31119f4edba91b75 (patch)
treefeae0c19f1a6744b60f3e59a5d9b8df1c28c6ebf /src/input/include/input_hook.hpp
parentc24dfa6846929e8a7659c4aa2633b82494ac7fe1 (diff)
downloadtangara-fw-1baaa6dadcea5b8a85f1629e31119f4edba91b75.tar.gz
Use more generic 'hooks' for each input device's actions
Diffstat (limited to 'src/input/include/input_hook.hpp')
-rw-r--r--src/input/include/input_hook.hpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/input/include/input_hook.hpp b/src/input/include/input_hook.hpp
new file mode 100644
index 00000000..96b9b5cd
--- /dev/null
+++ b/src/input/include/input_hook.hpp
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2024 jacqueline <me@jacqueline.id.au>
+ *
+ * SPDX-License-Identifier: GPL-3.0-only
+ */
+
+#pragma once
+
+#include <functional>
+#include <optional>
+
+#include "hal/lv_hal_indev.h"
+#include "input_trigger.hpp"
+
+namespace input {
+
+using HookCb = std::optional<std::function<void(lv_indev_data_t*)>>;
+
+class Hook {
+ public:
+ Hook(HookCb);
+
+ auto invoke(lv_indev_data_t*) -> void;
+ auto override(HookCb) -> void;
+
+ private:
+ HookCb default_;
+ HookCb override_;
+};
+
+class TriggerHooks {
+ public:
+ TriggerHooks(HookCb cb) : TriggerHooks(cb, cb, cb) {}
+ TriggerHooks(HookCb, HookCb, HookCb);
+
+ auto update(bool, lv_indev_data_t*) -> void;
+ auto override(Trigger::State, HookCb) -> void;
+
+ private:
+ Trigger trigger_;
+
+ Hook click_;
+ Hook long_press_;
+ Hook repeat_;
+};
+
+} // namespace input