parent
c24dfa6846
commit
1baaa6dadc
@ -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
|
@ -0,0 +1,28 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2024 jacqueline <me@jacqueline.id.au> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-3.0-only |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include "hal/lv_hal_indev.h" |
||||||
|
|
||||||
|
namespace input { |
||||||
|
namespace actions { |
||||||
|
|
||||||
|
auto select(lv_indev_data_t*) -> void; |
||||||
|
|
||||||
|
auto scrollUp(lv_indev_data_t*) -> void; |
||||||
|
auto scrollDown(lv_indev_data_t*) -> void; |
||||||
|
|
||||||
|
auto scrollToTop(lv_indev_data_t*) -> void; |
||||||
|
auto scrollToBottom(lv_indev_data_t*) -> void; |
||||||
|
|
||||||
|
auto goBack(lv_indev_data_t*) -> void; |
||||||
|
|
||||||
|
auto volumeUp(lv_indev_data_t*) -> void; |
||||||
|
auto volumeDown(lv_indev_data_t*) -> void; |
||||||
|
|
||||||
|
} // namespace actions
|
||||||
|
} // namespace input
|
@ -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
|
@ -0,0 +1,52 @@ |
|||||||
|
/*
|
||||||
|
* Copyright 2024 jacqueline <me@jacqueline.id.au> |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: GPL-3.0-only |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "input_hook_actions.hpp" |
||||||
|
|
||||||
|
#include <cstdint> |
||||||
|
|
||||||
|
#include "hal/lv_hal_indev.h" |
||||||
|
|
||||||
|
#include "event_queue.hpp" |
||||||
|
#include "ui_events.hpp" |
||||||
|
|
||||||
|
namespace input { |
||||||
|
namespace actions { |
||||||
|
|
||||||
|
auto select(lv_indev_data_t* d) -> void { |
||||||
|
d->state = LV_INDEV_STATE_PRESSED; |
||||||
|
} |
||||||
|
|
||||||
|
auto scrollUp(lv_indev_data_t* d) -> void { |
||||||
|
d->enc_diff = -1; |
||||||
|
} |
||||||
|
|
||||||
|
auto scrollDown(lv_indev_data_t* d) -> void { |
||||||
|
d->enc_diff = 1; |
||||||
|
} |
||||||
|
|
||||||
|
auto scrollToTop(lv_indev_data_t* d) -> void { |
||||||
|
d->enc_diff = INT16_MIN; |
||||||
|
} |
||||||
|
|
||||||
|
auto scrollToBottom(lv_indev_data_t* d) -> void { |
||||||
|
d->enc_diff = INT16_MAX; |
||||||
|
} |
||||||
|
|
||||||
|
auto goBack(lv_indev_data_t* d) -> void { |
||||||
|
events::Ui().Dispatch(ui::internal::BackPressed{}); |
||||||
|
} |
||||||
|
|
||||||
|
auto volumeUp(lv_indev_data_t* d) -> void { |
||||||
|
events::Audio().Dispatch(audio::StepUpVolume{}); |
||||||
|
} |
||||||
|
|
||||||
|
auto volumeDown(lv_indev_data_t* d) -> void { |
||||||
|
events::Audio().Dispatch(audio::StepDownVolume{}); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace actions
|
||||||
|
} // namespace input
|
Loading…
Reference in new issue