dosgame1/system/sdl/Keyboard.h

179 lines
3.7 KiB
C++

#ifndef GAME_KEYBOARD_H
#define GAME_KEYBOARD_H
#include <SDL.h>
#define KEY_MAX 256
enum {
KeyUnknown = 0x00,
KeyEscape = 0x01,
Key1 = 0x02,
Key2 = 0x03,
Key3 = 0x04,
Key4 = 0x05,
Key5 = 0x06,
Key6 = 0x07,
Key7 = 0x08,
Key8 = 0x09,
Key9 = 0x0a,
Key0 = 0x0b,
KeyMinus = 0x0c,
KeyEqual = 0x0d,
KeyBackspace = 0x0e,
KeyTab = 0x0f,
KeyQ = 0x10,
KeyW = 0x11,
KeyE = 0x12,
KeyR = 0x13,
KeyT = 0x14,
KeyY = 0x15,
KeyU = 0x16,
KeyI = 0x17,
KeyO = 0x18,
KeyP = 0x19,
KeyBracketLeft = 0x1a,
KeyBracketRight = 0x1b,
KeyEnter = 0x1c,
KeyLeftCtrl = 0x1d,
KeyA = 0x1e,
KeyS = 0x1f,
KeyD = 0x20,
KeyF = 0x21,
KeyG = 0x22,
KeyH = 0x23,
KeyJ = 0x24,
KeyK = 0x25,
KeyL = 0x26,
KeySemicolon = 0x27,
KeyApostrophe = 0x28,
KeyBacktick = 0x29,
KeyLeftShift = 0x2a,
KeyBackslash = 0x2b,
KeyZ = 0x2c,
KeyX = 0x2d,
KeyC = 0x2e,
KeyV = 0x2f,
KeyB = 0x30,
KeyN = 0x31,
KeyM = 0x32,
KeyComma = 0x33,
KeyPeriod = 0x34,
KeySlash = 0x35,
KeyRightShift = 0x36,
KeyKeypadMultiply = 0x37,
KeyLeftAlt = 0x38,
KeySpace = 0x39,
KeyCapsLock = 0x3a,
KeyF1 = 0x3b,
KeyF2 = 0x3c,
KeyF3 = 0x3d,
KeyF4 = 0x3e,
KeyF5 = 0x3f,
KeyF6 = 0x40,
KeyF7 = 0x41,
KeyF8 = 0x42,
KeyF9 = 0x43,
KeyF10 = 0x44,
KeyNumLock = 0x45,
KeyScrollLock = 0x46,
KeyKeypad7 = 0x47,
KeyKeypad8 = 0x48,
KeyKeypad9 = 0x49,
KeyKeypadMinus = 0x4a,
KeyKeypad4 = 0x4b,
KeyKeypad5 = 0x4c,
KeyKeypad6 = 0x4d,
KeyKeypadPlus = 0x4e,
KeyKeypad1 = 0x4f,
KeyKeypad2 = 0x50,
KeyKeypad3 = 0x51,
KeyKeypad0 = 0x52,
KeyKeypadPeriod = 0x53,
KeyF11 = 0x57,
KeyF12 = 0x58,
KeyMediaPrev = 0x90,
KeyMediaNext = 0x99,
KeyKeypadEnter = 0x9c,
KeyRightControl = 0x9d,
KeyMediaMute = 0xa0,
KeyMediaCalculator = 0xa1,
KeyMediaPlay = 0xa2,
KeyMediaStop = 0xa4,
KeyMediaVolumeDown = 0xae,
KeyMediaVolumeUp = 0xb0,
KeyMediaWww = 0xb2,
KeyKeypadDivide = 0xb5,
KeyRightAlt = 0xb8,
KeyHome = 0xc7,
KeyUp = 0xc8,
KeyPageUp = 0xc9,
KeyLeft = 0xcb,
KeyRight = 0xcd,
KeyEnd = 0xcf,
KeyDown = 0xd0,
KeyPageDown = 0xd1,
KeyInsert = 0xd2,
KeyDelete = 0xd3,
KeyLeftGui = 0xdb,
KeyRightGui = 0xdc,
KeyApps = 0xdd,
KeyAcpiPower = 0xde,
KeyAcpiSleep = 0xdf,
KeyAcpiWake = 0xe3,
KeyMediaWwwSearch = 0xe5,
KeyMediaWwwFavorites = 0xe6,
KeyMediaWwwRefresh = 0xe7,
KeyMediaWwwStop = 0xe8,
KeyMediaWwwForward = 0xe9,
KeyMediaWwwBack = 0xea,
KeyMediaMyComputer = 0xeb,
KeyMediaEmail = 0xec,
KeyMediaSelect = 0xed,
KeyPrint = 0xfe,
KeyPause = 0xff,
};
class Keyboard {
public:
using KeyHandleFunction = void (*)(unsigned char);
Keyboard();
~Keyboard();
KeyHandleFunction setKeyUpHandler(KeyHandleFunction handler);
KeyHandleFunction setKeyDownHandler(KeyHandleFunction handler);
KeyHandleFunction setKeyRepeatHandler(KeyHandleFunction handler);
bool keyState[KEY_MAX]{};
const char *getKeyName(unsigned char keyCode);
private:
friend class Events;
friend void keyboardIsr();
void Isr();
enum State {
Start,
Extended,
PauseBegin,
PausePressed1,
PauseReleased1,
PrintPressed1,
PrintPressed2,
PrintReleased1,
PrintReleased2,
};
State _state;
KeyHandleFunction _keyDownHandler{nullptr}, _keyUpHandler{nullptr}, _keyRepeatHandler{nullptr};
void keyDown(SDL_Keycode c);
void keyUp(SDL_Keycode c);
};
extern Keyboard keyboard;
#endif //GAME_KEYBOARD_H