100 lines
3.4 KiB
C
100 lines
3.4 KiB
C
#include <SDL2/SDL.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "cgdoom.h"
|
|
#include "cgdoom-kbd.h"
|
|
#include "doomdef.h"
|
|
|
|
/* Mapping of calculator matrix codes on the PC keyboard */
|
|
static int MatrixCodeToPCKey(int key)
|
|
{
|
|
switch(key)
|
|
{
|
|
case KEYCODE_F1: return SDL_SCANCODE_F1;
|
|
case KEYCODE_F2: return SDL_SCANCODE_F2;
|
|
case KEYCODE_F3: return SDL_SCANCODE_F3;
|
|
case KEYCODE_F4: return SDL_SCANCODE_F4;
|
|
case KEYCODE_F5: return SDL_SCANCODE_F5;
|
|
case KEYCODE_F6: return SDL_SCANCODE_F6;
|
|
|
|
case KEYCODE_UP: return SDL_SCANCODE_UP;
|
|
case KEYCODE_RIGHT: return SDL_SCANCODE_RIGHT;
|
|
case KEYCODE_DOWN: return SDL_SCANCODE_DOWN;
|
|
case KEYCODE_LEFT: return SDL_SCANCODE_LEFT;
|
|
|
|
case KEYCODE_SHIFT: return SDL_SCANCODE_Q;
|
|
case KEYCODE_OPTN: return SDL_SCANCODE_W;
|
|
case KEYCODE_VARS: return SDL_SCANCODE_E;
|
|
case KEYCODE_MENU: return SDL_SCANCODE_R;
|
|
|
|
case KEYCODE_ALPHA: return SDL_SCANCODE_A;
|
|
case KEYCODE_SQUARE: return SDL_SCANCODE_S;
|
|
case KEYCODE_POWER: return SDL_SCANCODE_D;
|
|
case KEYCODE_EXIT: return SDL_SCANCODE_F;
|
|
|
|
case KEYCODE_XOT: return SDL_SCANCODE_T;
|
|
case KEYCODE_LOG: return SDL_SCANCODE_Y;
|
|
case KEYCODE_LN: return SDL_SCANCODE_U;
|
|
case KEYCODE_SIN: return SDL_SCANCODE_I;
|
|
case KEYCODE_COS: return SDL_SCANCODE_O;
|
|
case KEYCODE_TAN: return SDL_SCANCODE_P;
|
|
|
|
case KEYCODE_FRAC: return SDL_SCANCODE_G;
|
|
case KEYCODE_FD: return SDL_SCANCODE_H;
|
|
case KEYCODE_LEFTP: return SDL_SCANCODE_J;
|
|
case KEYCODE_RIGHTP: return SDL_SCANCODE_K;
|
|
case KEYCODE_COMMA: return SDL_SCANCODE_L;
|
|
case KEYCODE_ARROW: return SDL_SCANCODE_SEMICOLON;
|
|
|
|
case KEYCODE_1: return SDL_SCANCODE_1;
|
|
case KEYCODE_2: return SDL_SCANCODE_2;
|
|
case KEYCODE_3: return SDL_SCANCODE_3;
|
|
case KEYCODE_4: return SDL_SCANCODE_4;
|
|
case KEYCODE_5: return SDL_SCANCODE_5;
|
|
case KEYCODE_6: return SDL_SCANCODE_6;
|
|
case KEYCODE_7: return SDL_SCANCODE_7;
|
|
case KEYCODE_8: return SDL_SCANCODE_8;
|
|
case KEYCODE_9: return SDL_SCANCODE_9;
|
|
case KEYCODE_0: return SDL_SCANCODE_0;
|
|
|
|
case KEYCODE_DEL: return SDL_SCANCODE_BACKSPACE;
|
|
case KEYCODE_ACON: return SDL_SCANCODE_ESCAPE;
|
|
|
|
case KEYCODE_MUL: return SDL_SCANCODE_LEFTBRACKET;
|
|
case KEYCODE_DIV: return SDL_SCANCODE_RIGHTBRACKET;
|
|
|
|
case KEYCODE_PLUS: return SDL_SCANCODE_MINUS;
|
|
case KEYCODE_MINUS: return SDL_SCANCODE_EQUALS;
|
|
|
|
case KEYCODE_DOT: return -1;
|
|
case KEYCODE_EXP: return -1;
|
|
case KEYCODE_NEG: return -1;
|
|
|
|
case KEYCODE_EXE: return SDL_SCANCODE_RETURN;
|
|
|
|
default: return -1;
|
|
}
|
|
}
|
|
|
|
void CGD_ScanKeyboard(CGD_KeyboardState state)
|
|
{
|
|
SDL_Event e;
|
|
while(SDL_PollEvent(&e)) {}
|
|
|
|
int length;
|
|
const Uint8 *sdl_state = SDL_GetKeyboardState(&length);
|
|
|
|
for(int row = 0; row < 12; row++) {
|
|
for(int col = 0; col < 8; col++) {
|
|
int matrix_code = (row << 4) | col;
|
|
int index = row ^ 1;
|
|
int pattern = (0x80 >> col);
|
|
|
|
int scancode = MatrixCodeToPCKey(matrix_code);
|
|
state[index] &= ~pattern;
|
|
if(scancode >= 0 && scancode < length && sdl_state[scancode])
|
|
state[index] |= pattern;
|
|
}
|
|
}
|
|
}
|