205 lines
5.9 KiB
C++
205 lines
5.9 KiB
C++
/*
|
|
* \brief SDL input support
|
|
* \author Norman Feske
|
|
* \date 2006-08-16
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2006-2013 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU General Public License version 2.
|
|
*/
|
|
|
|
/* Linux */
|
|
#include <SDL/SDL.h>
|
|
|
|
/* Genode */
|
|
#include <input/keycodes.h>
|
|
|
|
/* Local */
|
|
#include <input/component.h>
|
|
|
|
#include <base/printf.h>
|
|
|
|
/**
|
|
* Convert SDL keycode to Genode keycode
|
|
*/
|
|
static long convert_keycode(int sdl_keycode)
|
|
{
|
|
using namespace Input;
|
|
|
|
switch (sdl_keycode) {
|
|
|
|
case SDLK_BACKSPACE: return KEY_BACKSPACE;
|
|
case SDLK_TAB: return KEY_TAB;
|
|
case SDLK_RETURN: return KEY_ENTER;
|
|
case SDLK_PAUSE: return KEY_PAUSE;
|
|
case SDLK_ESCAPE: return KEY_ESC;
|
|
case SDLK_SPACE: return KEY_SPACE;
|
|
case SDLK_QUOTE: return KEY_APOSTROPHE;
|
|
case SDLK_HASH: return KEY_APOSTROPHE;
|
|
case SDLK_COMMA: return KEY_COMMA;
|
|
case SDLK_MINUS: return KEY_MINUS;
|
|
case SDLK_PERIOD: return KEY_DOT;
|
|
case SDLK_SLASH: return KEY_SLASH;
|
|
case SDLK_0: return KEY_0;
|
|
case SDLK_1: return KEY_1;
|
|
case SDLK_2: return KEY_2;
|
|
case SDLK_3: return KEY_3;
|
|
case SDLK_4: return KEY_4;
|
|
case SDLK_5: return KEY_5;
|
|
case SDLK_6: return KEY_6;
|
|
case SDLK_7: return KEY_7;
|
|
case SDLK_8: return KEY_8;
|
|
case SDLK_9: return KEY_9;
|
|
case SDLK_SEMICOLON: return KEY_SEMICOLON;
|
|
case SDLK_LESS: return KEY_BACKSLASH;
|
|
case SDLK_EQUALS: return KEY_EQUAL;
|
|
case SDLK_QUESTION: return KEY_QUESTION;
|
|
case SDLK_LEFTBRACKET: return KEY_LEFTBRACE;
|
|
case SDLK_BACKSLASH: return KEY_BACKSLASH;
|
|
case SDLK_RIGHTBRACKET: return KEY_RIGHTBRACE;
|
|
case SDLK_BACKQUOTE: return KEY_GRAVE;
|
|
case SDLK_a: return KEY_A;
|
|
case SDLK_b: return KEY_B;
|
|
case SDLK_c: return KEY_C;
|
|
case SDLK_d: return KEY_D;
|
|
case SDLK_e: return KEY_E;
|
|
case SDLK_f: return KEY_F;
|
|
case SDLK_g: return KEY_G;
|
|
case SDLK_h: return KEY_H;
|
|
case SDLK_i: return KEY_I;
|
|
case SDLK_j: return KEY_J;
|
|
case SDLK_k: return KEY_K;
|
|
case SDLK_l: return KEY_L;
|
|
case SDLK_m: return KEY_M;
|
|
case SDLK_n: return KEY_N;
|
|
case SDLK_o: return KEY_O;
|
|
case SDLK_p: return KEY_P;
|
|
case SDLK_q: return KEY_Q;
|
|
case SDLK_r: return KEY_R;
|
|
case SDLK_s: return KEY_S;
|
|
case SDLK_t: return KEY_T;
|
|
case SDLK_u: return KEY_U;
|
|
case SDLK_v: return KEY_V;
|
|
case SDLK_w: return KEY_W;
|
|
case SDLK_x: return KEY_X;
|
|
case SDLK_y: return KEY_Y;
|
|
case SDLK_z: return KEY_Z;
|
|
case SDLK_DELETE: return KEY_DELETE;
|
|
|
|
/* arrows + home/end pad */
|
|
case SDLK_UP: return KEY_UP;
|
|
case SDLK_DOWN: return KEY_DOWN;
|
|
case SDLK_RIGHT: return KEY_RIGHT;
|
|
case SDLK_LEFT: return KEY_LEFT;
|
|
case SDLK_INSERT: return KEY_INSERT;
|
|
case SDLK_HOME: return KEY_HOME;
|
|
case SDLK_END: return KEY_END;
|
|
case SDLK_PAGEUP: return KEY_PAGEUP;
|
|
case SDLK_PAGEDOWN: return KEY_PAGEDOWN;
|
|
|
|
/* function keys */
|
|
case SDLK_F1: return KEY_F1;
|
|
case SDLK_F2: return KEY_F2;
|
|
case SDLK_F3: return KEY_F3;
|
|
case SDLK_F4: return KEY_F4;
|
|
case SDLK_F5: return KEY_F5;
|
|
case SDLK_F6: return KEY_F6;
|
|
case SDLK_F7: return KEY_F7;
|
|
case SDLK_F8: return KEY_F8;
|
|
case SDLK_F9: return KEY_F9;
|
|
case SDLK_F10: return KEY_F10;
|
|
case SDLK_F11: return KEY_F11;
|
|
case SDLK_F12: return KEY_F12;
|
|
case SDLK_F13: return KEY_F13;
|
|
case SDLK_F14: return KEY_F14;
|
|
case SDLK_F15: return KEY_F15;
|
|
|
|
/* special keys */
|
|
case SDLK_PRINT: return KEY_PRINT;
|
|
case SDLK_SCROLLOCK: return KEY_SCROLLLOCK;
|
|
case SDLK_MENU: return KEY_MENU;
|
|
|
|
/* key state modifier keys */
|
|
case SDLK_NUMLOCK: return KEY_NUMLOCK;
|
|
case SDLK_CAPSLOCK: return KEY_CAPSLOCK;
|
|
case SDLK_RSHIFT: return KEY_RIGHTSHIFT;
|
|
case SDLK_LSHIFT: return KEY_LEFTSHIFT;
|
|
case SDLK_RCTRL: return KEY_RIGHTCTRL;
|
|
case SDLK_LCTRL: return KEY_LEFTCTRL;
|
|
case SDLK_RALT: return KEY_RIGHTALT;
|
|
case SDLK_LALT: return KEY_LEFTALT;
|
|
case SDLK_RMETA: return KEY_RIGHTMETA;
|
|
case SDLK_LMETA: return KEY_LEFTMETA;
|
|
|
|
default: return 0;
|
|
}
|
|
};
|
|
|
|
|
|
void Input::event_handling(bool enable) { }
|
|
bool Input::event_pending() { return SDL_PollEvent(0); }
|
|
|
|
|
|
/**
|
|
* Wait for an event, Zzz...zz..
|
|
*/
|
|
Input::Event Input::get_event()
|
|
{
|
|
using namespace Input;
|
|
|
|
SDL_Event event;
|
|
static int mx, my;
|
|
static int ox, oy;
|
|
|
|
SDL_WaitEvent(&event);
|
|
|
|
/* query new mouse position */
|
|
ox = mx; oy = my;
|
|
if (event.type == SDL_MOUSEMOTION)
|
|
SDL_GetMouseState(&mx, &my);
|
|
|
|
/* determine keycode */
|
|
long keycode = 0;
|
|
switch (event.type) {
|
|
case SDL_KEYUP:
|
|
case SDL_KEYDOWN:
|
|
|
|
keycode = convert_keycode(event.key.keysym.sym);
|
|
break;
|
|
|
|
case SDL_MOUSEBUTTONDOWN:
|
|
case SDL_MOUSEBUTTONUP:
|
|
|
|
switch (event.button.button) {
|
|
case SDL_BUTTON_LEFT: keycode = BTN_LEFT; break;
|
|
case SDL_BUTTON_RIGHT: keycode = BTN_RIGHT; break;
|
|
default: keycode = 0;
|
|
}
|
|
}
|
|
|
|
/* determine event type */
|
|
Event::Type type;
|
|
switch (event.type) {
|
|
case SDL_MOUSEMOTION: type = Event::MOTION; break;
|
|
case SDL_KEYUP:
|
|
case SDL_MOUSEBUTTONUP: type = Event::RELEASE; break;
|
|
case SDL_KEYDOWN:
|
|
case SDL_MOUSEBUTTONDOWN:
|
|
if (event.button.button == SDL_BUTTON_WHEELUP) {
|
|
type = Event::WHEEL;
|
|
return Event(type, 0, 0, 0, 0, 1);
|
|
} else if (event.button.button == SDL_BUTTON_WHEELDOWN) {
|
|
type = Event::WHEEL;
|
|
return Event(type, 0, 0, 0, 0, -1);
|
|
}
|
|
type = Event::PRESS;
|
|
break;
|
|
default: type = Event::INVALID;
|
|
}
|
|
|
|
return Event(type, keycode, mx, my, mx - ox, my - oy);
|
|
}
|