Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 42 additions & 1 deletion include/rex/input/mnk/mnk_input_driver.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@
#pragma once

#include <rex/input/input_driver.h>
#include <rex/ui/virtual_key.h>
#include <rex/ui/window_listener.h>

#include <chrono>
#include <cstdint>
#include <mutex>
#include <queue>
Expand Down Expand Up @@ -50,13 +52,42 @@ class MnkInputDriver final : public InputDriver,
void OnLostFocus(rex::ui::UISetupEvent& e) override;
void OnGotFocus(rex::ui::UISetupEvent& e) override;

// Per-pad-button slot index for keystroke edge tracking and repeat timing.
enum PadIdx {
kPadIdxA = 0,
kPadIdxB,
kPadIdxX,
kPadIdxY,
kPadIdxLB,
kPadIdxRB,
kPadIdxStart,
kPadIdxBack,
kPadIdxL3,
kPadIdxR3,
kPadIdxDU,
kPadIdxDD,
kPadIdxDL,
kPadIdxDR,
kPadIdxLT,
kPadIdxRT,
kPadIdxLStick,
kPadIdxRStick,
kPadIdxCount
};

private:
uint32_t UserIndex() const;
bool IsEnabled() const;
void CenterCursor();
void UpdateMouseCapture();
void SetKeyState(uint16_t vk, bool down);
void EnqueueKeystroke(uint16_t vk_pad, bool down);
void EnqueueKeystroke(uint16_t vk_pad, uint16_t flags);
void HandleEdge(PadIdx idx, uint16_t vk_pad, bool down);
void HandleStickDirChange(PadIdx idx, uint16_t new_dir);
void EmitButtonChange(rex::ui::VirtualKey key_vk, bool down);
void RecomputeLstickDir();
void EnqueueRStickIfChanged(int16_t rx, int16_t ry);
void TickRepeats();

rex::ui::Window* attached_window_ = nullptr;

Expand All @@ -74,6 +105,16 @@ class MnkInputDriver final : public InputDriver,
// Keystroke queue
std::queue<X_INPUT_KEYSTROKE> keystroke_queue_;

// Per-pad-button state for KEYDOWN/KEYUP edge tracking and KEYSTROKE_REPEAT
// timing. Stick slots store the currently-held direction as vk_pad.
struct PadKeyState {
bool held = false;
uint16_t vk_pad = 0; // VirtualKey value, 0 = kNone
std::chrono::steady_clock::time_point pressed_at;
std::chrono::steady_clock::time_point last_event_at;
};
PadKeyState pad_states_[kPadIdxCount];

// Packet number incremented on state change
uint32_t packet_number_ = 0;
};
Expand Down
Loading