#pragma once #include #include #include #include #include #include #include #include #include "fumotris.h" #define IO_BUF_SIZE 16 enum InputType { KEY, AXIS, JOYSTICK, ESCAPE }; struct InputRecord { u16 bind; u8 type; union { struct { bool is_down; bool is_up; } button; struct { u64 value; } axis; struct { u32 x; u32 y; } joystick; }; struct timespec timestamp; }; struct RecordBuffer { struct InputRecord records[IO_BUF_SIZE]; size_t count; pthread_mutex_t mutex; }; struct InputAxis { union { struct { u32 value; bool is_down; bool is_held; bool is_up; } button; struct { u64 value; } axis; struct { u32 x; u32 y; } joystick; }; struct timespec last_pressed; struct timespec last_released; }; enum CtrlCode { LEFT, RIGHT, SOFT_DROP, HARD_DROP, ROTATE_CCW, ROTATE_CW, ROTATE_180, SWAP, ESC, VSCROLL, HSCROLL, MOUSE }; typedef u32 hashtype; struct ctrl_bkt { hashtype hash; u16 value; u8 type; struct InputAxis *axis; }; struct ctrl_dict { size_t capacity; size_t filled; struct ctrl_bkt *bkts; }; struct Controller { struct ctrl_dict codes; struct ctrl_dict binds; struct InputAxis *axes; struct RecordBuffer buf; pthread_t thread; }; bool NewCtrl(struct Controller *ctrl, size_t code_cap, size_t bind_cap); void FreeCtrl(struct Controller *ctrl); bool CtrlMap(struct Controller *ctrl, u16f code, u16f bind, u8f type); struct InputAxis *CtrlGet(struct Controller *ctrl, u16f code, u8f type); bool CtrlPoll(struct Controller *ctrl);