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