/*
 * \brief  Genode-specific event backend
 * \author Stefan Kalkowski
 * \date   2008-12-12
 */

/*
 * Copyright (c) <2008> Stefan Kalkowski
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */
#include <base/printf.h>
#include <input_session/connection.h>
#include <input/event.h>
#include <input/keycodes.h>

extern "C" {

#include <SDL/SDL.h>
#include "SDL_events_c.h"
#include "SDL_sysevents.h"
#include "SDL_genode_fb_events.h"

	static Input::Connection *input = 0;
	static Input::Event *ev_buf = 0;
	static const int KEYNUM_MAX = 512;
	static SDLKey keymap[KEYNUM_MAX];
	static int buttonmap[KEYNUM_MAX];


	inline SDL_keysym *Genode_Fb_TranslateKey(int keycode, SDL_keysym *k)
	{
		k->scancode = keycode;
		k->sym = keymap[keycode];
		k->mod = SDL_GetModState();
		k->unicode = keymap[keycode];
		return k;
	}


	void Genode_Fb_PumpEvents(SDL_VideoDevice *t)
	{
		if (!input->is_pending())
			return;
		int num_ev = input->flush();
		for (int src_ev_cnt = 0; src_ev_cnt < num_ev; src_ev_cnt++)
		{
			Input::Event curr = ev_buf[src_ev_cnt];
			SDL_keysym ksym;
			switch(curr.type())
			{
			case Input::Event::MOTION:
				SDL_PrivateMouseMotion(0, 1, curr.rx(), curr.ry());
				break;
			case Input::Event::PRESS:
				if(curr.keycode() >= Input::BTN_MISC &&
				   curr.keycode() <= Input::BTN_GEAR_UP)
					SDL_PrivateMouseButton(SDL_PRESSED,
					                       buttonmap[curr.keycode()],
					                       0, 0);
				else
					SDL_PrivateKeyboard(SDL_PRESSED,
					                    Genode_Fb_TranslateKey(curr.keycode(),
					                    &ksym));
				break;
			case Input::Event::RELEASE:
				if(curr.keycode() >= Input::BTN_MISC &&
				   curr.keycode() <= Input::BTN_GEAR_UP)
					SDL_PrivateMouseButton(SDL_RELEASED,
					                       buttonmap[curr.keycode()],
					                       0, 0);
				else
					SDL_PrivateKeyboard(SDL_RELEASED,
					                    Genode_Fb_TranslateKey(curr.keycode(),
					                    &ksym));
				break;
			case Input::Event::WHEEL:
				PWRN("Mouse wheel, not implemented yet!");
				break;
			default:
				break;
			}
		}
	}


	void Genode_Fb_InitOSKeymap(SDL_VideoDevice *t)
	{
		using namespace Input;
		input = new(Genode::env()->heap()) Connection();
		if(!input->cap().valid())
		{
			PERR("No input driver available!");
			return;
		}

		/* Attach event buffer to address space */
		ev_buf = Genode::env()->rm_session()->attach(input->dataspace());

		/* Prepare button mappings */
		for (int i=0; i<KEYNUM_MAX; i++)
		{
			switch(i)
			{
			case BTN_LEFT: buttonmap[i]=SDL_BUTTON_LEFT; break;
			case BTN_RIGHT: buttonmap[i]=SDL_BUTTON_RIGHT; break;
			case BTN_MIDDLE: buttonmap[i]=SDL_BUTTON_MIDDLE; break;
			case BTN_0:
			case BTN_1:
			case BTN_2:
			case BTN_3:
			case BTN_4:
			case BTN_5:
			case BTN_6:
			case BTN_7:
			case BTN_8:
			case BTN_9:
			case BTN_SIDE:
			case BTN_EXTRA:
			case BTN_FORWARD:
			case BTN_BACK:
			case BTN_TASK:
			case BTN_TRIGGER:
			case BTN_THUMB:
			case BTN_THUMB2:
			case BTN_TOP:
			case BTN_TOP2:
			case BTN_PINKIE:
			case BTN_BASE:
			case BTN_BASE2:
			case BTN_BASE3:
			case BTN_BASE4:
			case BTN_BASE5:
			case BTN_BASE6:
			case BTN_DEAD:
			case BTN_A:
			case BTN_B:
			case BTN_C:
			case BTN_X:
			case BTN_Y:
			case BTN_Z:
			case BTN_TL:
			case BTN_TR:
			case BTN_TL2:
			case BTN_TR2:
			case BTN_SELECT:
			case BTN_START:
			case BTN_MODE:
			case BTN_THUMBL:
			case BTN_THUMBR:
			case BTN_TOOL_PEN:
			case BTN_TOOL_RUBBER:
			case BTN_TOOL_BRUSH:
			case BTN_TOOL_PENCIL:
			case BTN_TOOL_AIRBRUSH:
			case BTN_TOOL_FINGER:
			case BTN_TOOL_MOUSE:
			case BTN_TOOL_LENS:
			case BTN_TOUCH:
			case BTN_STYLUS:
			case BTN_STYLUS2:
			case BTN_TOOL_DOUBLETAP:
			case BTN_TOOL_TRIPLETAP:
			case BTN_GEAR_DOWN:
			case BTN_GEAR_UP:
			default: buttonmap[i]=0;
			}
		}

		/* Prepare key mappings */
		for(int i=0; i<KEYNUM_MAX; i++)
		{
			switch(i)
			{
			case KEY_RESERVED: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_ESC: keymap[i]=SDLK_ESCAPE; break;
			case KEY_1: keymap[i]=SDLK_1; break;
			case KEY_2: keymap[i]=SDLK_2; break;
			case KEY_3: keymap[i]=SDLK_3; break;
			case KEY_4: keymap[i]=SDLK_4; break;
			case KEY_5: keymap[i]=SDLK_5; break;
			case KEY_6: keymap[i]=SDLK_6; break;
			case KEY_7: keymap[i]=SDLK_7; break;
			case KEY_8: keymap[i]=SDLK_8; break;
			case KEY_9: keymap[i]=SDLK_9; break;
			case KEY_0: keymap[i]=SDLK_0; break;
			case KEY_MINUS: keymap[i]=SDLK_MINUS; break;
			case KEY_EQUAL: keymap[i]=SDLK_EQUALS; break;
			case KEY_BACKSPACE: keymap[i]=SDLK_BACKSPACE; break;
			case KEY_TAB: keymap[i]=SDLK_TAB; break;
			case KEY_Q: keymap[i]=SDLK_q; break;
			case KEY_W: keymap[i]=SDLK_w; break;
			case KEY_E: keymap[i]=SDLK_e; break;
			case KEY_R: keymap[i]=SDLK_r; break;
			case KEY_T: keymap[i]=SDLK_t; break;
			case KEY_Y: keymap[i]=SDLK_y; break;
			case KEY_U: keymap[i]=SDLK_u; break;
			case KEY_I: keymap[i]=SDLK_i; break;
			case KEY_O: keymap[i]=SDLK_o; break;
			case KEY_P: keymap[i]=SDLK_p; break;
			case KEY_LEFTBRACE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_RIGHTBRACE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_ENTER: keymap[i]=SDLK_KP_ENTER; break;
			case KEY_LEFTCTRL: keymap[i]=SDLK_LCTRL; break;
			case KEY_A: keymap[i]=SDLK_a; break;
			case KEY_S: keymap[i]=SDLK_s; break;
			case KEY_D: keymap[i]=SDLK_d; break;
			case KEY_F: keymap[i]=SDLK_f; break;
			case KEY_G: keymap[i]=SDLK_g; break;
			case KEY_H: keymap[i]=SDLK_h; break;
			case KEY_J: keymap[i]=SDLK_j; break;
			case KEY_K: keymap[i]=SDLK_k; break;
			case KEY_L: keymap[i]=SDLK_l; break;
			case KEY_SEMICOLON: keymap[i]=SDLK_SEMICOLON; break;
			case KEY_APOSTROPHE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_GRAVE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_LEFTSHIFT: keymap[i]=SDLK_LSHIFT; break;
			case KEY_BACKSLASH: keymap[i]=SDLK_BACKSLASH; break;
			case KEY_Z: keymap[i]=SDLK_z; break;
			case KEY_X: keymap[i]=SDLK_x; break;
			case KEY_C: keymap[i]=SDLK_c; break;
			case KEY_V: keymap[i]=SDLK_v; break;
			case KEY_B: keymap[i]=SDLK_b; break;
			case KEY_N: keymap[i]=SDLK_n; break;
			case KEY_M: keymap[i]=SDLK_m; break;
			case KEY_COMMA: keymap[i]=SDLK_COMMA; break;
			case KEY_DOT: keymap[i]=SDLK_PERIOD; break;
			case KEY_SLASH: keymap[i]=SDLK_SLASH; break;
			case KEY_RIGHTSHIFT: keymap[i]=SDLK_RSHIFT; break;
			case KEY_KPASTERISK: keymap[i]=SDLK_ASTERISK; break;
			case KEY_LEFTALT: keymap[i]=SDLK_LALT; break;
			case KEY_SPACE: keymap[i]=SDLK_SPACE; break;
			case KEY_CAPSLOCK: keymap[i]=SDLK_CAPSLOCK; break;
			case KEY_F1: keymap[i]=SDLK_F1; break;
			case KEY_F2: keymap[i]=SDLK_F2; break;
			case KEY_F3: keymap[i]=SDLK_F3; break;
			case KEY_F4: keymap[i]=SDLK_F4; break;
			case KEY_F5: keymap[i]=SDLK_F5; break;
			case KEY_F6: keymap[i]=SDLK_F6; break;
			case KEY_F7: keymap[i]=SDLK_F7; break;
			case KEY_F8: keymap[i]=SDLK_F8; break;
			case KEY_F9: keymap[i]=SDLK_F9; break;
			case KEY_F10: keymap[i]=SDLK_F10; break;
			case KEY_NUMLOCK: keymap[i]=SDLK_NUMLOCK; break;
			case KEY_SCROLLLOCK: keymap[i]=SDLK_SCROLLOCK; break;
			case KEY_KP7: keymap[i]=SDLK_KP7; break;
			case KEY_KP8: keymap[i]=SDLK_KP8; break;
			case KEY_KP9: keymap[i]=SDLK_KP9; break;
			case KEY_KPMINUS: keymap[i]=SDLK_KP_MINUS; break;
			case KEY_KP4: keymap[i]=SDLK_KP4; break;
			case KEY_KP5: keymap[i]=SDLK_KP5; break;
			case KEY_KP6: keymap[i]=SDLK_KP6; break;
			case KEY_KPPLUS: keymap[i]=SDLK_KP_PLUS; break;
			case KEY_KP1: keymap[i]=SDLK_KP1; break;
			case KEY_KP2: keymap[i]=SDLK_KP2; break;
			case KEY_KP3: keymap[i]=SDLK_KP3; break;
			case KEY_KP0: keymap[i]=SDLK_KP0; break;
			case KEY_KPDOT: keymap[i]=SDLK_KP_PERIOD; break;
			case KEY_ZENKAKUHANKAKU: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_102ND: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F11: keymap[i]=SDLK_F11; break;
			case KEY_F12: keymap[i]=SDLK_F12; break;
			case KEY_RO: keymap[i]=SDLK_EURO; break;
			case KEY_KATAKANA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_HIRAGANA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_HENKAN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_KATAKANAHIRAGANA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MUHENKAN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_KPJPCOMMA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_KPENTER: keymap[i]=SDLK_KP_ENTER; break;
			case KEY_RIGHTCTRL: keymap[i]=SDLK_RCTRL; break;
			case KEY_KPSLASH: keymap[i]=SDLK_KP_DIVIDE; break;
			case KEY_SYSRQ: keymap[i]=SDLK_SYSREQ; break;
			case KEY_RIGHTALT: keymap[i]=SDLK_RALT; break;
			case KEY_LINEFEED: keymap[i]=SDLK_RETURN; break;
			case KEY_HOME: keymap[i]=SDLK_HOME; break;
			case KEY_UP: keymap[i]=SDLK_UP; break;
			case KEY_PAGEUP: keymap[i]=SDLK_PAGEUP; break;
			case KEY_LEFT: keymap[i]=SDLK_LEFT; break;
			case KEY_RIGHT: keymap[i]=SDLK_RIGHT; break;
			case KEY_END: keymap[i]=SDLK_END; break;
			case KEY_DOWN: keymap[i]=SDLK_DOWN; break;
			case KEY_PAGEDOWN: keymap[i]=SDLK_PAGEDOWN; break;
			case KEY_INSERT: keymap[i]=SDLK_INSERT; break;
			case KEY_DELETE: keymap[i]=SDLK_DELETE; break;
			case KEY_MACRO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MUTE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_VOLUMEDOWN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_VOLUMEUP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_POWER: keymap[i]=SDLK_POWER; break;
			case KEY_KPEQUAL: keymap[i]=SDLK_KP_EQUALS; break;
			case KEY_KPPLUSMINUS: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PAUSE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_KPCOMMA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_HANGUEL: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_HANJA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_YEN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_LEFTMETA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_RIGHTMETA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_COMPOSE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_STOP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_AGAIN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PROPS: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_UNDO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_FRONT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_COPY: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_OPEN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PASTE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_FIND: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CUT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_HELP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MENU: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CALC: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SETUP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SLEEP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_WAKEUP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_FILE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SENDFILE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_DELETEFILE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_XFER: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PROG1: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PROG2: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_WWW: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MSDOS: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_COFFEE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_DIRECTION: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CYCLEWINDOWS: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MAIL: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_BOOKMARKS: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_COMPUTER: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_BACK: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_FORWARD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CLOSECD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_EJECTCD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_EJECTCLOSECD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_NEXTSONG: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PLAYPAUSE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PREVIOUSSONG: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_STOPCD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_RECORD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_REWIND: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PHONE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_ISO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CONFIG: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_HOMEPAGE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_REFRESH: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_EXIT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MOVE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_EDIT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SCROLLUP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SCROLLDOWN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_KPLEFTPAREN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_KPRIGHTPAREN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F13: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F14: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F15: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F16: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F17: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F18: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F19: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F20: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F21: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F22: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F23: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_F24: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PLAYCD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PAUSECD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PROG3: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PROG4: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SUSPEND: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CLOSE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PLAY: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_FASTFORWARD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_BASSBOOST: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PRINT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_HP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CAMERA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SOUND: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_QUESTION: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_EMAIL: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CHAT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SEARCH: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CONNECT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_FINANCE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SPORT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SHOP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_ALTERASE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CANCEL: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_BRIGHTNESSDOWN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_BRIGHTNESSUP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MEDIA: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_OK: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SELECT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_GOTO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CLEAR: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_POWER2: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_OPTION: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_INFO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TIME: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_VENDOR: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_ARCHIVE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PROGRAM: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CHANNEL: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_FAVORITES: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_EPG: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PVR: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MHP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_LANGUAGE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TITLE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SUBTITLE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_ANGLE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_ZOOM: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MODE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_KEYBOARD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SCREEN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PC: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TV: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TV2: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_VCR: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_VCR2: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SAT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SAT2: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TAPE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_RADIO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TUNER: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PLAYER: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TEXT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_DVD: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_AUX: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MP3: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_AUDIO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_VIDEO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_DIRECTORY: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_LIST: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MEMO: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CALENDAR: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_RED: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_GREEN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_YELLOW: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_BLUE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CHANNELUP: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_CHANNELDOWN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_FIRST: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_LAST: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_AB: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_NEXT: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_RESTART: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SLOW: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_SHUFFLE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_BREAK: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_PREVIOUS: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_DIGITS: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TEEN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_TWEN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_DEL_EOL: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_DEL_EOS: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_INS_LINE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_DEL_LINE: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_UNKNOWN: keymap[i]=SDLK_UNKNOWN; break;
			case KEY_MAX: keymap[i]=SDLK_UNKNOWN; break;
			default:
				keymap[i]=SDLK_UNKNOWN;
			}
		}
	}
}//exern"C"
