Home | History | Annotate | Download | only in SDL
      1 /*
      2 The zlib/libpng License
      3 
      4 Copyright (c) 2005-2007 Phillip Castaneda (pjcast -- www.wreckedgames.com)
      5 
      6 This software is provided 'as-is', without any express or implied warranty. In no event will
      7 the authors be held liable for any damages arising from the use of this software.
      8 
      9 Permission is granted to anyone to use this software for any purpose, including commercial
     10 applications, and to alter it and redistribute it freely, subject to the following
     11 restrictions:
     12 
     13     1. The origin of this software must not be misrepresented; you must not claim that
     14 		you wrote the original software. If you use this software in a product,
     15 		an acknowledgment in the product documentation would be appreciated but is
     16 		not required.
     17 
     18     2. Altered source versions must be plainly marked as such, and must not be
     19 		misrepresented as being the original software.
     20 
     21     3. This notice may not be removed or altered from any source distribution.
     22 */
     23 #include "SDL/SDLKeyboard.h"
     24 #include "SDL/SDLInputManager.h"
     25 #include "OISException.h"
     26 #include "OISEvents.h"
     27 #include <sstream>
     28 
     29 using namespace OIS;
     30 
     31 //-------------------------------------------------------------------//
     32 SDLKeyboard::SDLKeyboard( bool buffered )
     33 {
     34 	mBuffered = buffered;
     35 	mType = OISKeyboard;
     36 	listener = 0;
     37 
     38 	//Clear our keyboard state buffer
     39 	memset( &KeyBuffer, 0, 256 );
     40 }
     41 
     42 //-------------------------------------------------------------------//
     43 void SDLKeyboard::_initialize()
     44 {
     45 	mModifiers = 0;
     46 	mSDLBuff = 0;
     47 
     48 	mKeyMap.insert( KeyMap::value_type(SDLK_ESCAPE,KC_ESCAPE) );
     49 	mKeyMap.insert( KeyMap::value_type(SDLK_1, KC_1) );
     50 	mKeyMap.insert( KeyMap::value_type(SDLK_2, KC_2) );
     51 	mKeyMap.insert( KeyMap::value_type(SDLK_3, KC_3) );
     52 	mKeyMap.insert( KeyMap::value_type(SDLK_4, KC_4) );
     53 	mKeyMap.insert( KeyMap::value_type(SDLK_5, KC_5) );
     54 	mKeyMap.insert( KeyMap::value_type(SDLK_6, KC_6) );
     55 	mKeyMap.insert( KeyMap::value_type(SDLK_7, KC_7) );
     56 	mKeyMap.insert( KeyMap::value_type(SDLK_8, KC_8) );
     57 	mKeyMap.insert( KeyMap::value_type(SDLK_9, KC_9) );
     58 	mKeyMap.insert( KeyMap::value_type(SDLK_0, KC_0) );
     59 	mKeyMap.insert( KeyMap::value_type(SDLK_MINUS, KC_MINUS) );
     60 	mKeyMap.insert( KeyMap::value_type(SDLK_EQUALS, KC_EQUALS) );
     61 	mKeyMap.insert( KeyMap::value_type(SDLK_BACKSPACE, KC_BACK) );
     62 	mKeyMap.insert( KeyMap::value_type(SDLK_TAB, KC_TAB) );
     63 	mKeyMap.insert( KeyMap::value_type(SDLK_q, KC_Q) );
     64 	mKeyMap.insert( KeyMap::value_type(SDLK_w, KC_W) );
     65 	mKeyMap.insert( KeyMap::value_type(SDLK_e, KC_E) );
     66 	mKeyMap.insert( KeyMap::value_type(SDLK_r, KC_R) );
     67 	mKeyMap.insert( KeyMap::value_type(SDLK_t, KC_T) );
     68 	mKeyMap.insert( KeyMap::value_type(SDLK_y, KC_Y) );
     69 	mKeyMap.insert( KeyMap::value_type(SDLK_u, KC_U) );
     70 	mKeyMap.insert( KeyMap::value_type(SDLK_i, KC_I) );
     71 	mKeyMap.insert( KeyMap::value_type(SDLK_o, KC_O) );
     72 	mKeyMap.insert( KeyMap::value_type(SDLK_p, KC_P) );
     73 	mKeyMap.insert( KeyMap::value_type(SDLK_RETURN, KC_RETURN) );
     74 	mKeyMap.insert( KeyMap::value_type(SDLK_LCTRL, KC_LCONTROL));
     75 	mKeyMap.insert( KeyMap::value_type(SDLK_a, KC_A) );
     76 	mKeyMap.insert( KeyMap::value_type(SDLK_s, KC_S) );
     77 	mKeyMap.insert( KeyMap::value_type(SDLK_d, KC_D) );
     78 	mKeyMap.insert( KeyMap::value_type(SDLK_f, KC_F) );
     79 	mKeyMap.insert( KeyMap::value_type(SDLK_g, KC_G) );
     80 	mKeyMap.insert( KeyMap::value_type(SDLK_h, KC_H) );
     81 	mKeyMap.insert( KeyMap::value_type(SDLK_j, KC_J) );
     82 	mKeyMap.insert( KeyMap::value_type(SDLK_k, KC_K) );
     83 	mKeyMap.insert( KeyMap::value_type(SDLK_l, KC_L) );
     84 	mKeyMap.insert( KeyMap::value_type(SDLK_SEMICOLON, KC_SEMICOLON) );
     85 	mKeyMap.insert( KeyMap::value_type(SDLK_COLON, KC_COLON) );
     86 	mKeyMap.insert( KeyMap::value_type(SDLK_QUOTE, KC_APOSTROPHE) );
     87 	mKeyMap.insert( KeyMap::value_type(SDLK_BACKQUOTE, KC_GRAVE)  );
     88 	mKeyMap.insert( KeyMap::value_type(SDLK_LSHIFT, KC_LSHIFT) );
     89 	mKeyMap.insert( KeyMap::value_type(SDLK_BACKSLASH, KC_BACKSLASH) );
     90 	mKeyMap.insert( KeyMap::value_type(SDLK_SLASH, KC_SLASH) );
     91 	mKeyMap.insert( KeyMap::value_type(SDLK_z, KC_Z) );
     92 	mKeyMap.insert( KeyMap::value_type(SDLK_x, KC_X) );
     93 	mKeyMap.insert( KeyMap::value_type(SDLK_c, KC_C) );
     94 	mKeyMap.insert( KeyMap::value_type(SDLK_v, KC_V) );
     95 	mKeyMap.insert( KeyMap::value_type(SDLK_b, KC_B) );
     96 	mKeyMap.insert( KeyMap::value_type(SDLK_n, KC_N) );
     97 	mKeyMap.insert( KeyMap::value_type(SDLK_m, KC_M) );
     98 	mKeyMap.insert( KeyMap::value_type(SDLK_COMMA, KC_COMMA)  );
     99 	mKeyMap.insert( KeyMap::value_type(SDLK_PERIOD, KC_PERIOD));
    100 	mKeyMap.insert( KeyMap::value_type(SDLK_RSHIFT, KC_RSHIFT));
    101 	mKeyMap.insert( KeyMap::value_type(SDLK_KP_MULTIPLY, KC_MULTIPLY) );
    102 	mKeyMap.insert( KeyMap::value_type(SDLK_LALT, KC_LMENU) );
    103 	mKeyMap.insert( KeyMap::value_type(SDLK_SPACE, KC_SPACE));
    104 	mKeyMap.insert( KeyMap::value_type(SDLK_CAPSLOCK, KC_CAPITAL) );
    105 	mKeyMap.insert( KeyMap::value_type(SDLK_F1, KC_F1) );
    106 	mKeyMap.insert( KeyMap::value_type(SDLK_F2, KC_F2) );
    107 	mKeyMap.insert( KeyMap::value_type(SDLK_F3, KC_F3) );
    108 	mKeyMap.insert( KeyMap::value_type(SDLK_F4, KC_F4) );
    109 	mKeyMap.insert( KeyMap::value_type(SDLK_F5, KC_F5) );
    110 	mKeyMap.insert( KeyMap::value_type(SDLK_F6, KC_F6) );
    111 	mKeyMap.insert( KeyMap::value_type(SDLK_F7, KC_F7) );
    112 	mKeyMap.insert( KeyMap::value_type(SDLK_F8, KC_F8) );
    113 	mKeyMap.insert( KeyMap::value_type(SDLK_F9, KC_F9) );
    114 	mKeyMap.insert( KeyMap::value_type(SDLK_F10, KC_F10) );
    115 	mKeyMap.insert( KeyMap::value_type(SDLK_NUMLOCK, KC_NUMLOCK) );
    116 	mKeyMap.insert( KeyMap::value_type(SDLK_SCROLLOCK, KC_SCROLL));
    117 	mKeyMap.insert( KeyMap::value_type(SDLK_KP7, KC_NUMPAD7) );
    118 	mKeyMap.insert( KeyMap::value_type(SDLK_KP8, KC_NUMPAD8) );
    119 	mKeyMap.insert( KeyMap::value_type(SDLK_KP9, KC_NUMPAD9) );
    120 	mKeyMap.insert( KeyMap::value_type(SDLK_KP_MINUS, KC_SUBTRACT) );
    121 	mKeyMap.insert( KeyMap::value_type(SDLK_KP4, KC_NUMPAD4) );
    122 	mKeyMap.insert( KeyMap::value_type(SDLK_KP5, KC_NUMPAD5) );
    123 	mKeyMap.insert( KeyMap::value_type(SDLK_KP6, KC_NUMPAD6) );
    124 	mKeyMap.insert( KeyMap::value_type(SDLK_KP_PLUS, KC_ADD) );
    125 	mKeyMap.insert( KeyMap::value_type(SDLK_KP1, KC_NUMPAD1) );
    126 	mKeyMap.insert( KeyMap::value_type(SDLK_KP2, KC_NUMPAD2) );
    127 	mKeyMap.insert( KeyMap::value_type(SDLK_KP3, KC_NUMPAD3) );
    128 	mKeyMap.insert( KeyMap::value_type(SDLK_KP0, KC_NUMPAD0) );
    129 	mKeyMap.insert( KeyMap::value_type(SDLK_KP_PERIOD, KC_DECIMAL) );
    130 	mKeyMap.insert( KeyMap::value_type(SDLK_F11, KC_F11) );
    131 	mKeyMap.insert( KeyMap::value_type(SDLK_F12, KC_F12) );
    132 	mKeyMap.insert( KeyMap::value_type(SDLK_F13, KC_F13) );
    133 	mKeyMap.insert( KeyMap::value_type(SDLK_F14, KC_F14) );
    134 	mKeyMap.insert( KeyMap::value_type(SDLK_F15, KC_F15) );
    135 	mKeyMap.insert( KeyMap::value_type(SDLK_KP_EQUALS, KC_NUMPADEQUALS) );
    136 	mKeyMap.insert( KeyMap::value_type(SDLK_KP_DIVIDE, KC_DIVIDE) );
    137 	mKeyMap.insert( KeyMap::value_type(SDLK_SYSREQ, KC_SYSRQ) );
    138 	mKeyMap.insert( KeyMap::value_type(SDLK_RALT, KC_RMENU) );
    139 	mKeyMap.insert( KeyMap::value_type(SDLK_HOME, KC_HOME) );
    140 	mKeyMap.insert( KeyMap::value_type(SDLK_UP, KC_UP) );
    141 	mKeyMap.insert( KeyMap::value_type(SDLK_PAGEUP, KC_PGUP) );
    142 	mKeyMap.insert( KeyMap::value_type(SDLK_LEFT, KC_LEFT) );
    143 	mKeyMap.insert( KeyMap::value_type(SDLK_RIGHT, KC_RIGHT) );
    144 	mKeyMap.insert( KeyMap::value_type(SDLK_END, KC_END) );
    145 	mKeyMap.insert( KeyMap::value_type(SDLK_DOWN, KC_DOWN) );
    146 	mKeyMap.insert( KeyMap::value_type(SDLK_PAGEDOWN, KC_PGDOWN) );
    147 	mKeyMap.insert( KeyMap::value_type(SDLK_INSERT, KC_INSERT) );
    148 	mKeyMap.insert( KeyMap::value_type(SDLK_DELETE, KC_DELETE) );
    149 	mKeyMap.insert( KeyMap::value_type(SDLK_LSUPER, KC_LWIN) );
    150 	mKeyMap.insert( KeyMap::value_type(SDLK_RSUPER, KC_RWIN) );
    151 
    152 	SDL_EnableUNICODE(1);
    153 }
    154 
    155 //-------------------------------------------------------------------//
    156 SDLKeyboard::~SDLKeyboard()
    157 {
    158 }
    159 
    160 //-------------------------------------------------------------------//
    161 void SDLKeyboard::capture()
    162 {
    163 	SDL_Event events[OIS_SDL_KEY_BUFF];
    164 	int count = SDL_PeepEvents(events, OIS_SDL_KEY_BUFF, SDL_GETEVENT,
    165 		SDL_EVENTMASK(SDL_KEYDOWN) | SDL_EVENTMASK(SDL_KEYUP));
    166 
    167 	for( int i = 0; i < count; ++i )
    168 	{
    169 		KeyCode kc = mKeyMap[events[i].key.keysym.sym];
    170 		KeyBuffer[kc] = events[i].key.state;
    171 
    172 		if( mBuffered && listener )
    173 		{
    174 			if( events[i].key.state == SDL_PRESSED )
    175 			{
    176 				if( listener->keyPressed(KeyEvent(this, 0, kc, events[i].key.keysym.unicode)) == false )
    177 					break;
    178 			}
    179 			else
    180 			{
    181 				if( listener->keyReleased(KeyEvent(this, 0, kc, events[i].key.keysym.unicode)) == false )
    182 					break;
    183 			}
    184 		}
    185 	}
    186 
    187 	//Release Grab mode on Alt-Tab combinations (for non-window systems)
    188 	if( KeyBuffer[KC_RMENU] || KeyBuffer[KC_LMENU])
    189 	{
    190 		if( KeyBuffer[KC_TAB] )
    191 			static_cast<SDLInputManager*>(InputManager::getSingletonPtr())->_setGrabMode(false);
    192 	}
    193 }
    194 
    195 //-------------------------------------------------------------------//
    196 bool SDLKeyboard::isKeyDown( KeyCode key )
    197 {
    198 	return KeyBuffer[key] == 1 ? true : false;
    199 }
    200 
    201 //-------------------------------------------------------------------//
    202 const std::string& SDLKeyboard::getAsString( KeyCode kc )
    203 {
    204     switch(kc)
    205     {
    206     case KC_ESCAPE: mGetString = SDL_GetKeyName(SDLK_ESCAPE); break;
    207     case KC_1: mGetString = SDL_GetKeyName(SDLK_1); break;
    208     case KC_2: mGetString = SDL_GetKeyName(SDLK_2); break;
    209     case KC_3: mGetString = SDL_GetKeyName(SDLK_3); break;
    210     case KC_4: mGetString = SDL_GetKeyName(SDLK_4); break;
    211     case KC_5: mGetString = SDL_GetKeyName(SDLK_5); break;
    212     case KC_6: mGetString = SDL_GetKeyName(SDLK_6); break;
    213     case KC_7: mGetString = SDL_GetKeyName(SDLK_7); break;
    214     case KC_8: mGetString = SDL_GetKeyName(SDLK_8); break;
    215     case KC_9: mGetString = SDL_GetKeyName(SDLK_9); break;
    216     case KC_0: mGetString = SDL_GetKeyName(SDLK_0); break;
    217     case KC_MINUS: mGetString = SDL_GetKeyName(SDLK_MINUS); break;
    218     case KC_EQUALS: mGetString = SDL_GetKeyName(SDLK_EQUALS); break;
    219     case KC_BACK: mGetString = SDL_GetKeyName(SDLK_BACKSPACE); break;
    220     case KC_TAB: mGetString = SDL_GetKeyName(SDLK_TAB); break;
    221     case KC_Q: mGetString = SDL_GetKeyName(SDLK_q); break;
    222     case KC_W: mGetString = SDL_GetKeyName(SDLK_w); break;
    223     case KC_E: mGetString = SDL_GetKeyName(SDLK_e); break;
    224     case KC_R: mGetString = SDL_GetKeyName(SDLK_r); break;
    225     case KC_T: mGetString = SDL_GetKeyName(SDLK_t); break;
    226     case KC_Y: mGetString = SDL_GetKeyName(SDLK_y); break;
    227     case KC_U: mGetString = SDL_GetKeyName(SDLK_u); break;
    228     case KC_I: mGetString = SDL_GetKeyName(SDLK_i); break;
    229     case KC_O: mGetString = SDL_GetKeyName(SDLK_o); break;
    230     case KC_P: mGetString = SDL_GetKeyName(SDLK_p); break;
    231     case KC_LBRACKET: mGetString = "["; break;
    232     case KC_RBRACKET: mGetString = "]"; break;
    233     case KC_RETURN: mGetString = SDL_GetKeyName(SDLK_RETURN); break;
    234     case KC_LCONTROL: mGetString = SDL_GetKeyName(SDLK_LCTRL); break;
    235     case KC_A: mGetString = SDL_GetKeyName(SDLK_a); break;
    236     case KC_S: mGetString = SDL_GetKeyName(SDLK_s); break;
    237     case KC_D: mGetString = SDL_GetKeyName(SDLK_d); break;
    238     case KC_F: mGetString = SDL_GetKeyName(SDLK_f); break;
    239     case KC_G: mGetString = SDL_GetKeyName(SDLK_g); break;
    240     case KC_H: mGetString = SDL_GetKeyName(SDLK_h); break;
    241     case KC_J: mGetString = SDL_GetKeyName(SDLK_j); break;
    242     case KC_K: mGetString = SDL_GetKeyName(SDLK_k); break;
    243     case KC_L: mGetString = SDL_GetKeyName(SDLK_l); break;
    244     case KC_SEMICOLON: mGetString = SDL_GetKeyName(SDLK_SEMICOLON); break;
    245     case KC_APOSTROPHE: mGetString = SDL_GetKeyName(SDLK_QUOTE); break;
    246     case KC_GRAVE: mGetString = SDL_GetKeyName(SDLK_BACKQUOTE); break;
    247     case KC_LSHIFT: mGetString = SDL_GetKeyName(SDLK_LSHIFT); break;
    248     case KC_BACKSLASH: mGetString = SDL_GetKeyName(SDLK_BACKSLASH); break;
    249     case KC_Z: mGetString = SDL_GetKeyName(SDLK_z); break;
    250     case KC_X: mGetString = SDL_GetKeyName(SDLK_x); break;
    251     case KC_C: mGetString = SDL_GetKeyName(SDLK_c); break;
    252     case KC_V: mGetString = SDL_GetKeyName(SDLK_v); break;
    253     case KC_B: mGetString = SDL_GetKeyName(SDLK_b); break;
    254     case KC_N: mGetString = SDL_GetKeyName(SDLK_n); break;
    255     case KC_M: mGetString = SDL_GetKeyName(SDLK_m); break;
    256     case KC_COMMA: mGetString = SDL_GetKeyName(SDLK_COMMA); break;
    257     case KC_PERIOD: mGetString = SDL_GetKeyName(SDLK_PERIOD); break;
    258     case KC_SLASH: mGetString = SDL_GetKeyName(SDLK_SLASH); break;
    259     case KC_RSHIFT: mGetString = SDL_GetKeyName(SDLK_RSHIFT); break;
    260     case KC_MULTIPLY: mGetString = SDL_GetKeyName(SDLK_KP_MULTIPLY); break;
    261     case KC_LMENU: mGetString = SDL_GetKeyName(SDLK_LALT); break;
    262     case KC_SPACE: mGetString = SDL_GetKeyName(SDLK_SPACE); break;
    263     case KC_CAPITAL: mGetString = SDL_GetKeyName(SDLK_CAPSLOCK); break;
    264     case KC_F1: mGetString = SDL_GetKeyName(SDLK_F1); break;
    265     case KC_F2: mGetString = SDL_GetKeyName(SDLK_F2); break;
    266     case KC_F3: mGetString = SDL_GetKeyName(SDLK_F3); break;
    267     case KC_F4: mGetString = SDL_GetKeyName(SDLK_F4); break;
    268     case KC_F5: mGetString = SDL_GetKeyName(SDLK_F5); break;
    269     case KC_F6: mGetString = SDL_GetKeyName(SDLK_F6); break;
    270     case KC_F7: mGetString = SDL_GetKeyName(SDLK_F7); break;
    271     case KC_F8: mGetString = SDL_GetKeyName(SDLK_F8); break;
    272     case KC_F9: mGetString = SDL_GetKeyName(SDLK_F9); break;
    273     case KC_F10: mGetString = SDL_GetKeyName(SDLK_F10); break;
    274     case KC_NUMLOCK: mGetString = SDL_GetKeyName(SDLK_NUMLOCK); break;
    275     case KC_SCROLL: mGetString = SDL_GetKeyName(SDLK_SCROLLOCK); break;
    276     case KC_NUMPAD7: mGetString = SDL_GetKeyName(SDLK_KP7); break;
    277     case KC_NUMPAD8: mGetString = SDL_GetKeyName(SDLK_KP8); break;
    278     case KC_NUMPAD9: mGetString = SDL_GetKeyName(SDLK_KP9); break;
    279     case KC_SUBTRACT: mGetString = SDL_GetKeyName(SDLK_KP_MINUS); break;
    280     case KC_NUMPAD4: mGetString = SDL_GetKeyName(SDLK_KP4); break;
    281     case KC_NUMPAD5: mGetString = SDL_GetKeyName(SDLK_KP5); break;
    282     case KC_NUMPAD6: mGetString = SDL_GetKeyName(SDLK_KP6); break;
    283     case KC_ADD: mGetString = SDL_GetKeyName(SDLK_KP_PLUS); break;
    284     case KC_NUMPAD1: mGetString = SDL_GetKeyName(SDLK_KP1); break;
    285     case KC_NUMPAD2: mGetString = SDL_GetKeyName(SDLK_KP2); break;
    286     case KC_NUMPAD3: mGetString = SDL_GetKeyName(SDLK_KP3); break;
    287     case KC_NUMPAD0: mGetString = SDL_GetKeyName(SDLK_KP0); break;
    288     case KC_DECIMAL: mGetString = SDL_GetKeyName(SDLK_KP_PERIOD); break;
    289     case KC_OEM_102: mGetString = "OEM_102"; break;
    290     case KC_F11: mGetString = SDL_GetKeyName(SDLK_F11); break;
    291     case KC_F12: mGetString = SDL_GetKeyName(SDLK_F12); break;
    292     case KC_F13: mGetString = SDL_GetKeyName(SDLK_F13); break;
    293     case KC_F14: mGetString = SDL_GetKeyName(SDLK_F14); break;
    294     case KC_F15: mGetString = SDL_GetKeyName(SDLK_F15); break;
    295     case KC_KANA: mGetString = "Kana"; break;
    296     case KC_ABNT_C1: mGetString = "ABNT_C1"; break;
    297     case KC_CONVERT: mGetString = "CONVERT"; break;
    298     case KC_NOCONVERT: mGetString = "NOCONVERT"; break;
    299     case KC_YEN: mGetString = "YEN"; break;
    300     case KC_ABNT_C2: mGetString = "ABNT_C2"; break;
    301     case KC_NUMPADEQUALS: mGetString = SDL_GetKeyName(SDLK_KP_EQUALS); break;
    302     case KC_PREVTRACK: mGetString = "KC_PREVTRACK"; break;
    303     case KC_AT: mGetString = "KC_AT"; break;
    304     case KC_COLON: mGetString = SDL_GetKeyName(SDLK_COLON); break;
    305     case KC_UNDERLINE: mGetString = "KC_UNDERLINE"; break;
    306     case KC_KANJI: mGetString = "KC_KANJI"; break;
    307     case KC_STOP: mGetString = "KC_STOP"; break;
    308     case KC_AX: mGetString = "KC_AX"; break;
    309     case KC_UNLABELED: mGetString = "KC_UNLABELED"; break;
    310     case KC_NEXTTRACK: mGetString = "KC_NEXTTRACK"; break;
    311     case KC_NUMPADENTER: mGetString = "KC_NUMPADENTER"; break;
    312     case KC_RCONTROL: mGetString = "KC_RCONTROL"; break;
    313     case KC_MUTE: mGetString = "KC_MUTE"; break;
    314     case KC_CALCULATOR: mGetString = "KC_CALCULATOR"; break;
    315     case KC_PLAYPAUSE: mGetString = "KC_PLAYPAUSE"; break;
    316     case KC_MEDIASTOP: mGetString = "KC_MEDIASTOP"; break;
    317     case KC_VOLUMEDOWN: mGetString = "KC_VOLUMEDOWN"; break;
    318     case KC_VOLUMEUP: mGetString = "KC_VOLUMEUP"; break;
    319     case KC_WEBHOME: mGetString = "KC_WEBHOME"; break;
    320     case KC_NUMPADCOMMA: mGetString = "KC_NUMPADCOMMA"; break;
    321     case KC_DIVIDE: mGetString = SDL_GetKeyName(SDLK_KP_DIVIDE); break;
    322     case KC_SYSRQ: mGetString = SDL_GetKeyName(SDLK_SYSREQ); break;
    323     case KC_RMENU: mGetString = SDL_GetKeyName(SDLK_RALT); break;
    324     case KC_PAUSE: mGetString = "Pause"; break;
    325     case KC_HOME: mGetString = SDL_GetKeyName(SDLK_HOME); break;
    326     case KC_UP: mGetString = SDL_GetKeyName(SDLK_UP); break;
    327     case KC_PGUP: mGetString = SDL_GetKeyName(SDLK_PAGEUP); break;
    328     case KC_LEFT: mGetString = SDL_GetKeyName(SDLK_LEFT); break;
    329     case KC_RIGHT: mGetString = SDL_GetKeyName(SDLK_RIGHT); break;
    330     case KC_END:  mGetString = SDL_GetKeyName(SDLK_END); break;
    331     case KC_DOWN: mGetString = SDL_GetKeyName(SDLK_DOWN); break;
    332     case KC_PGDOWN: mGetString = SDL_GetKeyName(SDLK_PAGEDOWN); break;
    333     case KC_INSERT: mGetString = SDL_GetKeyName(SDLK_INSERT); break;
    334     case KC_DELETE: mGetString = SDL_GetKeyName(SDLK_DELETE); break;
    335     case KC_LWIN: mGetString = SDL_GetKeyName(SDLK_LSUPER); break;
    336     case KC_RWIN: mGetString = SDL_GetKeyName(SDLK_RSUPER); break;
    337     case KC_APPS: mGetString = "KC_APPS"; break;
    338     case KC_POWER: mGetString = "KC_POWER"; break;
    339     case KC_SLEEP: mGetString = "KC_SLEEP"; break;
    340     case KC_WAKE: mGetString = "KC_WAKE"; break;
    341     case KC_WEBSEARCH: mGetString = "KC_WEBSEARCH"; break;
    342     case KC_WEBFAVORITES: mGetString = "KC_WEBFAVORITES"; break;
    343     case KC_WEBREFRESH: mGetString = "KC_WEBREFRESH"; break;
    344     case KC_WEBSTOP: mGetString = "KC_WEBSTOP"; break;
    345     case KC_WEBFORWARD: mGetString = "KC_WEBFORWARD"; break;
    346     case KC_WEBBACK: mGetString = "KC_WEBBACK"; break;
    347     case KC_MYCOMPUTER: mGetString = "KC_MYCOMPUTER"; break;
    348     case KC_MAIL: mGetString = "KC_MAIL"; break;
    349     case KC_MEDIASELECT: mGetString = "KC_MEDIASELECT"; break;
    350     default: mGetString = "Unknown"; break;
    351     };
    352 
    353 	return mGetString;
    354 }
    355 
    356 //-------------------------------------------------------------------//
    357 void SDLKeyboard::copyKeyStates( char keys[256] )
    358 {
    359 	for(int i = 0; i < 256; ++i)
    360 		keys[i] = KeyBuffer[i];
    361 }
    362 
    363 //-------------------------------------------------------------------//
    364 void SDLKeyboard::setBuffered(bool buffered)
    365 {
    366 	mBuffered = buffered;
    367 }
    368 
    369 //-------------------------------------------------------------------//
    370 void SDLKeyboard::setTextTranslation( TextTranslationMode mode )
    371 {
    372 	mTextMode = mode;
    373 	if( mode == Off || mode == Ascii )
    374 		SDL_EnableUNICODE(0);
    375 	else if( mode == Unicode )
    376 		SDL_EnableUNICODE(1);
    377 }
    378