mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-20 22:16:49 +01:00
134 lines
4.4 KiB
C
134 lines
4.4 KiB
C
/*
|
|
Simple DirectMedia Layer
|
|
Copyright (C) 2017 BlackBerry Limited
|
|
|
|
This software is provided 'as-is', without any express or implied
|
|
warranty. In no event will the authors be held liable for any damages
|
|
arising from the use of this software.
|
|
|
|
Permission is granted to anyone to use this software for any purpose,
|
|
including commercial applications, and to alter it and redistribute it
|
|
freely, subject to the following restrictions:
|
|
|
|
1. The origin of this software must not be misrepresented; you must not
|
|
claim that you wrote the original software. If you use this software
|
|
in a product, an acknowledgment in the product documentation would be
|
|
appreciated but is not required.
|
|
2. Altered source versions must be plainly marked as such, and must not be
|
|
misrepresented as being the original software.
|
|
3. This notice may not be removed or altered from any source distribution.
|
|
*/
|
|
|
|
#include "../../SDL_internal.h"
|
|
#include "../../events/SDL_keyboard_c.h"
|
|
#include "SDL_scancode.h"
|
|
#include "SDL_events.h"
|
|
#include "sdl_qnx.h"
|
|
#include <sys/keycodes.h>
|
|
|
|
/**
|
|
* A map thta translates Screen key names to SDL scan codes.
|
|
* This map is incomplete, but should include most major keys.
|
|
*/
|
|
static int key_to_sdl[] = {
|
|
[KEYCODE_SPACE] = SDL_SCANCODE_SPACE,
|
|
[KEYCODE_APOSTROPHE] = SDL_SCANCODE_APOSTROPHE,
|
|
[KEYCODE_COMMA] = SDL_SCANCODE_COMMA,
|
|
[KEYCODE_MINUS] = SDL_SCANCODE_MINUS,
|
|
[KEYCODE_PERIOD] = SDL_SCANCODE_PERIOD,
|
|
[KEYCODE_SLASH] = SDL_SCANCODE_SLASH,
|
|
[KEYCODE_ZERO] = SDL_SCANCODE_0,
|
|
[KEYCODE_ONE] = SDL_SCANCODE_1,
|
|
[KEYCODE_TWO] = SDL_SCANCODE_2,
|
|
[KEYCODE_THREE] = SDL_SCANCODE_3,
|
|
[KEYCODE_FOUR] = SDL_SCANCODE_4,
|
|
[KEYCODE_FIVE] = SDL_SCANCODE_5,
|
|
[KEYCODE_SIX] = SDL_SCANCODE_6,
|
|
[KEYCODE_SEVEN] = SDL_SCANCODE_7,
|
|
[KEYCODE_EIGHT] = SDL_SCANCODE_8,
|
|
[KEYCODE_NINE] = SDL_SCANCODE_9,
|
|
[KEYCODE_SEMICOLON] = SDL_SCANCODE_SEMICOLON,
|
|
[KEYCODE_EQUAL] = SDL_SCANCODE_EQUALS,
|
|
[KEYCODE_LEFT_BRACKET] = SDL_SCANCODE_LEFTBRACKET,
|
|
[KEYCODE_BACK_SLASH] = SDL_SCANCODE_BACKSLASH,
|
|
[KEYCODE_RIGHT_BRACKET] = SDL_SCANCODE_RIGHTBRACKET,
|
|
[KEYCODE_GRAVE] = SDL_SCANCODE_GRAVE,
|
|
[KEYCODE_A] = SDL_SCANCODE_A,
|
|
[KEYCODE_B] = SDL_SCANCODE_B,
|
|
[KEYCODE_C] = SDL_SCANCODE_C,
|
|
[KEYCODE_D] = SDL_SCANCODE_D,
|
|
[KEYCODE_E] = SDL_SCANCODE_E,
|
|
[KEYCODE_F] = SDL_SCANCODE_F,
|
|
[KEYCODE_G] = SDL_SCANCODE_G,
|
|
[KEYCODE_H] = SDL_SCANCODE_H,
|
|
[KEYCODE_I] = SDL_SCANCODE_I,
|
|
[KEYCODE_J] = SDL_SCANCODE_J,
|
|
[KEYCODE_K] = SDL_SCANCODE_K,
|
|
[KEYCODE_L] = SDL_SCANCODE_L,
|
|
[KEYCODE_M] = SDL_SCANCODE_M,
|
|
[KEYCODE_N] = SDL_SCANCODE_N,
|
|
[KEYCODE_O] = SDL_SCANCODE_O,
|
|
[KEYCODE_P] = SDL_SCANCODE_P,
|
|
[KEYCODE_Q] = SDL_SCANCODE_Q,
|
|
[KEYCODE_R] = SDL_SCANCODE_R,
|
|
[KEYCODE_S] = SDL_SCANCODE_S,
|
|
[KEYCODE_T] = SDL_SCANCODE_T,
|
|
[KEYCODE_U] = SDL_SCANCODE_U,
|
|
[KEYCODE_V] = SDL_SCANCODE_V,
|
|
[KEYCODE_W] = SDL_SCANCODE_W,
|
|
[KEYCODE_X] = SDL_SCANCODE_X,
|
|
[KEYCODE_Y] = SDL_SCANCODE_Y,
|
|
[KEYCODE_Z] = SDL_SCANCODE_Z,
|
|
[KEYCODE_UP] = SDL_SCANCODE_UP,
|
|
[KEYCODE_DOWN] = SDL_SCANCODE_DOWN,
|
|
[KEYCODE_LEFT] = SDL_SCANCODE_LEFT,
|
|
[KEYCODE_PG_UP] = SDL_SCANCODE_PAGEUP,
|
|
[KEYCODE_PG_DOWN] = SDL_SCANCODE_PAGEDOWN,
|
|
[KEYCODE_RIGHT] = SDL_SCANCODE_RIGHT,
|
|
[KEYCODE_RETURN] = SDL_SCANCODE_RETURN,
|
|
[KEYCODE_TAB] = SDL_SCANCODE_TAB,
|
|
[KEYCODE_ESCAPE] = SDL_SCANCODE_ESCAPE,
|
|
};
|
|
|
|
/**
|
|
* Called from the event dispatcher when a keyboard event is encountered.
|
|
* Translates the event such that it can be handled by SDL.
|
|
* @param event Screen keyboard event
|
|
*/
|
|
void
|
|
handleKeyboardEvent(screen_event_t event)
|
|
{
|
|
int val;
|
|
SDL_Scancode scancode;
|
|
|
|
// Get the key value.
|
|
if (screen_get_event_property_iv(event, SCREEN_PROPERTY_SYM, &val) < 0) {
|
|
return;
|
|
}
|
|
|
|
// Skip unrecognized keys.
|
|
if ((val < 0) || (val >= SDL_TABLESIZE(key_to_sdl))) {
|
|
return;
|
|
}
|
|
|
|
// Translate to an SDL scan code.
|
|
scancode = key_to_sdl[val];
|
|
if (scancode == 0) {
|
|
return;
|
|
}
|
|
|
|
// Get event flags (key state).
|
|
if (screen_get_event_property_iv(event, SCREEN_PROPERTY_FLAGS, &val) < 0) {
|
|
return;
|
|
}
|
|
|
|
// Propagate the event to SDL.
|
|
// FIXME:
|
|
// Need to handle more key states (such as key combinations).
|
|
if (val & KEY_DOWN) {
|
|
SDL_SendKeyboardKey(SDL_PRESSED, scancode);
|
|
} else {
|
|
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
|
|
}
|
|
}
|