mirror of
https://github.com/wiiu-env/WiiUPluginLoaderBackend.git
synced 2026-05-06 21:16:20 -05:00
53 lines
1.5 KiB
C++
53 lines
1.5 KiB
C++
#pragma once
|
|
#include "utils/input/Input.h"
|
|
#include <cstdint>
|
|
|
|
class InputRepeater {
|
|
public:
|
|
// thresholdDelay: frames to wait before starting repeat (e.g., 15)
|
|
// repeatRate: frames between repeats (e.g., 6)
|
|
explicit InputRepeater(uint32_t thresholdDelay = 15, uint32_t repeatRate = 6)
|
|
: mThresholdDelay(thresholdDelay), mRepeatRate(repeatRate) {}
|
|
|
|
uint32_t update(const Input &input, uint32_t mask) {
|
|
uint32_t currentPressed = input.data.buttons_d & mask;
|
|
uint32_t currentHeld = input.data.buttons_h & mask;
|
|
|
|
if (currentPressed) {
|
|
// New press: reset and return the button immediately
|
|
mScrollTimer = 0;
|
|
mHeldButton = currentPressed;
|
|
mInRepeatMode = false;
|
|
return currentPressed;
|
|
}
|
|
|
|
if (currentHeld && (currentHeld == mHeldButton)) {
|
|
mScrollTimer++;
|
|
uint32_t threshold = mInRepeatMode ? mRepeatRate : mThresholdDelay;
|
|
|
|
if (mScrollTimer >= threshold) {
|
|
mScrollTimer = 0;
|
|
mInRepeatMode = true;
|
|
return currentHeld;
|
|
}
|
|
} else {
|
|
// Button released or changed
|
|
reset();
|
|
}
|
|
|
|
return 0; // No action this frame
|
|
}
|
|
|
|
void reset() {
|
|
mScrollTimer = 0;
|
|
mHeldButton = 0;
|
|
mInRepeatMode = false;
|
|
}
|
|
|
|
private:
|
|
uint32_t mThresholdDelay;
|
|
uint32_t mRepeatRate;
|
|
uint32_t mScrollTimer = 0;
|
|
uint32_t mHeldButton = 0;
|
|
bool mInRepeatMode = false;
|
|
}; |