mirror of
https://github.com/JorjBauer/aiie.git
synced 2024-11-25 19:31:36 +00:00
158 lines
3.5 KiB
C++
158 lines
3.5 KiB
C++
|
#include "sdl-keyboard.h"
|
||
|
|
||
|
#include "sdl-paddles.h"
|
||
|
#include "globals.h"
|
||
|
|
||
|
SDLKeyboard::SDLKeyboard(VMKeyboard *k) : PhysicalKeyboard(k)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
SDLKeyboard::~SDLKeyboard()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
typedef struct {
|
||
|
int8_t actualKey;
|
||
|
bool shifted;
|
||
|
} keymapChar;
|
||
|
|
||
|
void SDLKeyboard::handleKeypress(SDL_KeyboardEvent *key)
|
||
|
{
|
||
|
bool releaseEvent = key->type == SDL_KEYUP;
|
||
|
|
||
|
if ( (key->keysym.sym >= 'a' && key->keysym.sym <= 'z') ||
|
||
|
(key->keysym.sym >= '0' && key->keysym.sym <= '9') ||
|
||
|
key->keysym.sym == '-' ||
|
||
|
key->keysym.sym == '=' ||
|
||
|
key->keysym.sym == '[' ||
|
||
|
key->keysym.sym == '`' ||
|
||
|
key->keysym.sym == ']' ||
|
||
|
key->keysym.sym == '\\' ||
|
||
|
key->keysym.sym == ';' ||
|
||
|
key->keysym.sym == '\'' ||
|
||
|
key->keysym.sym == ',' ||
|
||
|
key->keysym.sym == '.' ||
|
||
|
key->keysym.sym == '/' ||
|
||
|
key->keysym.sym == ' ' ||
|
||
|
key->keysym.sym == 27 || // ESC
|
||
|
key->keysym.sym == 13 || // return
|
||
|
key->keysym.sym == 9) { // tab
|
||
|
|
||
|
// Simple keypresses
|
||
|
if (key->keysym.mod & (KMOD_LCTRL|KMOD_RCTRL)) {
|
||
|
key->keysym.sym -= ('a'-1);
|
||
|
}
|
||
|
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(key->keysym.sym);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(key->keysym.sym);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// delete key
|
||
|
if (key->keysym.sym == 8) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(DEL);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(DEL);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//modifier handling
|
||
|
if (key->keysym.sym == SDLK_CAPSLOCK) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(LOCK);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(LOCK);
|
||
|
}
|
||
|
|
||
|
if (key->keysym.sym == SDLK_LSHIFT ||
|
||
|
key->keysym.sym == SDLK_RSHIFT) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(LSHFT);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(LSHFT);
|
||
|
}
|
||
|
|
||
|
// arrows
|
||
|
if (key->keysym.sym == SDLK_LEFT) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(LARR);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(LARR);
|
||
|
}
|
||
|
if (key->keysym.sym == SDLK_RIGHT) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(RARR);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(RARR);
|
||
|
}
|
||
|
|
||
|
if (key->keysym.sym == SDLK_LEFT) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(LARR);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(LARR);
|
||
|
}
|
||
|
|
||
|
if (key->keysym.sym == SDLK_UP) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(UARR);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(UARR);
|
||
|
}
|
||
|
|
||
|
if (key->keysym.sym == SDLK_DOWN) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(DARR);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(DARR);
|
||
|
}
|
||
|
|
||
|
// Paddles
|
||
|
if (key->keysym.sym == SDLK_LGUI) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(LA);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(LA);
|
||
|
}
|
||
|
|
||
|
if (key->keysym.sym == SDLK_RGUI) {
|
||
|
if (releaseEvent)
|
||
|
vmkeyboard->keyReleased(RA);
|
||
|
else
|
||
|
vmkeyboard->keyDepressed(RA);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void SDLKeyboard::maintainKeyboard()
|
||
|
{
|
||
|
SDL_Event event;
|
||
|
if (SDL_PollEvent( &event )) {
|
||
|
|
||
|
// Handle keydown/keyup (and quit, incidentally)
|
||
|
switch (event.type) {
|
||
|
case SDL_KEYDOWN:
|
||
|
case SDL_KEYUP:
|
||
|
// Don't handle repeats; we have our own repeat code
|
||
|
if (event.key.repeat == 0)
|
||
|
handleKeypress(&event.key);
|
||
|
break;
|
||
|
case SDL_MOUSEMOTION:
|
||
|
// We are handling the SDL input loop, so need to pass this off to the paddles. :/
|
||
|
// FIXME: nasty rooting around in other objects and typecasting.
|
||
|
// FIXME: event.motion.state & SDL_BUTTON_LMASK, et al?
|
||
|
|
||
|
((SDLPaddles *)g_paddles)->gotMouseMovement(event.motion.x, event.motion.y);
|
||
|
break;
|
||
|
|
||
|
case SDL_QUIT:
|
||
|
exit(0);
|
||
|
}
|
||
|
}
|
||
|
}
|