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