#include <SDL2/SDL.h>
typedef struct {
SDL_Scancode sdl_key;
int row;
int col;
} KeyMapping;
static const KeyMapping key_mappings[] = {
// Arrow keys
{SDL_SCANCODE_UP, 6, 3},
{SDL_SCANCODE_DOWN, 6, 0},
{SDL_SCANCODE_LEFT, 6, 1},
{SDL_SCANCODE_RIGHT, 6, 2},
// Primary keys
{SDL_SCANCODE_RETURN, 5, 0}, // Enter
{SDL_SCANCODE_ESCAPE, 5, 6}, // Clear
{SDL_SCANCODE_BACKSPACE, 0, 7}, // Del
// Numbers
{SDL_SCANCODE_0, 2, 0},
{SDL_SCANCODE_1, 2, 1},
{SDL_SCANCODE_2, 3, 1},
{SDL_SCANCODE_3, 4, 1},
{SDL_SCANCODE_4, 2, 2},
{SDL_SCANCODE_5, 3, 2},
{SDL_SCANCODE_6, 4, 2},
{SDL_SCANCODE_7, 2, 3},
{SDL_SCANCODE_8, 3, 3},
{SDL_SCANCODE_9, 4, 3},
// Math operations
{SDL_SCANCODE_KP_PLUS, 5, 1},
{SDL_SCANCODE_KP_MINUS, 5, 2},
{SDL_SCANCODE_KP_MULTIPLY, 5, 3},
{SDL_SCANCODE_KP_DIVIDE, 5, 4},
// End marker
{SDL_SCANCODE_UNKNOWN, -1, -1}
};
void handle_sdl_keyboard(SyncEmu* emu, SDL_Event* event) {
if (event->type != SDL_KEYDOWN && event->type != SDL_KEYUP) {
return;
}
SDL_Scancode scancode = event->key.keysym.scancode;
int down = (event->type == SDL_KEYDOWN) ? 1 : 0;
// Find mapping
for (int i = 0; key_mappings[i].sdl_key != SDL_SCANCODE_UNKNOWN; i++) {
if (key_mappings[i].sdl_key == scancode) {
emu_set_key(emu, key_mappings[i].row,
key_mappings[i].col, down);
break;
}
}
}
// Usage in event loop
SDL_Event event;
while (SDL_PollEvent(&event)) {
handle_sdl_keyboard(emu, &event);
}