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