00001 /* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- 00002 00003 this file is part of rcssserver3D 00004 Fri May 9 2003 00005 Copyright (C) 2002,2003 Koblenz University 00006 Copyright (C) 2003 RoboCup Soccer Server 3D Maintenance Group 00007 $Id: keyboardsdl.cpp,v 1.5 2004/04/23 20:43:54 fruit Exp $ 00008 00009 This program is free software; you can redistribute it and/or modify 00010 it under the terms of the GNU General Public License as published by 00011 the Free Software Foundation; version 2 of the License. 00012 00013 This program is distributed in the hope that it will be useful, 00014 but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 GNU General Public License for more details. 00017 00018 You should have received a copy of the GNU General Public License 00019 along with this program; if not, write to the Free Software 00020 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00021 */ 00022 #include "keyboardsdl.h" 00023 #include <kerosin/inputserver/inputserver.h> 00024 #include <zeitgeist/logserver/logserver.h> 00025 00026 using namespace kerosin; 00027 00028 KeyboardSDL::KeyboardSDL() 00029 { 00030 SetupSymMap(); 00031 } 00032 00033 KeyboardSDL::~KeyboardSDL() 00034 { 00035 } 00036 00037 void KeyboardSDL::SetupSymMap() 00038 { 00039 mSymbols.clear(); 00040 00041 // symbols taken from <SDL/SDL_keysm.h> 00042 00043 mSymbols[SDLK_BACKSPACE] = InputServer::IC_BACKSPACE; 00044 mSymbols[SDLK_TAB] = InputServer::InputServer::IC_TAB; 00045 // SDLK_CLEAR ?? 00046 mSymbols[SDLK_RETURN] = InputServer::IC_RETURN; 00047 mSymbols[SDLK_PAUSE] = InputServer::IC_PAUSE; 00048 mSymbols[SDLK_ESCAPE] = InputServer::IC_ESCAPE; 00049 mSymbols[SDLK_SPACE] = InputServer::IC_SPACE; 00050 // SDLK_EXCLAIM 00051 // SDLK_QUOTEDBL 00052 // SDLK_HASH 00053 // SDLK_DOLLAR 00054 // SDLK_AMPERSAND 00055 // SDLK_QUOTE 00056 // SDLK_LEFTPAREN 00057 // SDLK_RIGHTPAREN 00058 // SDLK_ASTERISK 00059 // SDLK_PLUS 00060 mSymbols[SDLK_COMMA] = InputServer::IC_COMMA; 00061 mSymbols[SDLK_MINUS] = InputServer::IC_MINUS; 00062 mSymbols[SDLK_PERIOD] = InputServer::IC_PERIOD; 00063 mSymbols[SDLK_SLASH] = InputServer::IC_SLASH; 00064 mSymbols[SDLK_0] = InputServer::IC_0; 00065 mSymbols[SDLK_1] = InputServer::IC_1; 00066 mSymbols[SDLK_2] = InputServer::IC_2; 00067 mSymbols[SDLK_3] = InputServer::IC_3; 00068 mSymbols[SDLK_4] = InputServer::IC_4; 00069 mSymbols[SDLK_5] = InputServer::IC_5; 00070 mSymbols[SDLK_6] = InputServer::IC_6; 00071 mSymbols[SDLK_7] = InputServer::IC_7; 00072 mSymbols[SDLK_8] = InputServer::IC_8; 00073 mSymbols[SDLK_9] = InputServer::IC_9; 00074 // SDLK_COLON 00075 mSymbols[SDLK_SEMICOLON] = InputServer::IC_SEMICOLON; 00076 // SDLK_LESS 00077 // SDLK_EQUALS 00078 mSymbols[SDLK_EQUALS] = InputServer::IC_EQUALS; 00079 // SDLK_GREATER 00080 // SDLK_QUESTION 00081 // SDLK_AT 00082 mSymbols[SDLK_LEFTBRACKET] = InputServer::IC_LBRACKET; 00083 mSymbols[SDLK_BACKSLASH] = InputServer::IC_BACKSLASH; 00084 mSymbols[SDLK_RIGHTBRACKET] = InputServer::IC_RBRACKET; 00085 // SDLK_CARET 00086 // SDLK_UNDERSCORE 00087 // SDLK_BACKQUOTE 00088 mSymbols[SDLK_a] = InputServer::IC_A; 00089 mSymbols[SDLK_b] = InputServer::IC_B; 00090 mSymbols[SDLK_c] = InputServer::IC_C; 00091 mSymbols[SDLK_d] = InputServer::IC_D; 00092 mSymbols[SDLK_e] = InputServer::IC_E; 00093 mSymbols[SDLK_f] = InputServer::IC_F; 00094 mSymbols[SDLK_g] = InputServer::IC_G; 00095 mSymbols[SDLK_h] = InputServer::IC_H; 00096 mSymbols[SDLK_i] = InputServer::IC_I; 00097 mSymbols[SDLK_j] = InputServer::IC_J; 00098 mSymbols[SDLK_k] = InputServer::IC_K; 00099 mSymbols[SDLK_l] = InputServer::IC_L; 00100 mSymbols[SDLK_m] = InputServer::IC_M; 00101 mSymbols[SDLK_n] = InputServer::IC_N; 00102 mSymbols[SDLK_o] = InputServer::IC_O; 00103 mSymbols[SDLK_p] = InputServer::IC_P; 00104 mSymbols[SDLK_q] = InputServer::IC_Q; 00105 mSymbols[SDLK_r] = InputServer::IC_R; 00106 mSymbols[SDLK_s] = InputServer::IC_S; 00107 mSymbols[SDLK_t] = InputServer::IC_T; 00108 mSymbols[SDLK_u] = InputServer::IC_U; 00109 mSymbols[SDLK_v] = InputServer::IC_V; 00110 mSymbols[SDLK_w] = InputServer::IC_W; 00111 mSymbols[SDLK_x] = InputServer::IC_X; 00112 mSymbols[SDLK_y] = InputServer::IC_Y; 00113 mSymbols[SDLK_z] = InputServer::IC_Z; 00114 mSymbols[SDLK_DELETE] = InputServer::IC_DELETE; 00115 // SDLK_WORLD_0 00116 // [...] 00117 // SDLK_WORLD_95 00118 mSymbols[SDLK_KP0] = InputServer::IC_KP0; 00119 mSymbols[SDLK_KP1] = InputServer::IC_KP1; 00120 mSymbols[SDLK_KP2] = InputServer::IC_KP2; 00121 mSymbols[SDLK_KP3] = InputServer::IC_KP3; 00122 mSymbols[SDLK_KP4] = InputServer::IC_KP4; 00123 mSymbols[SDLK_KP5] = InputServer::IC_KP5; 00124 mSymbols[SDLK_KP6] = InputServer::IC_KP6; 00125 mSymbols[SDLK_KP7] = InputServer::IC_KP7; 00126 mSymbols[SDLK_KP8] = InputServer::IC_KP8; 00127 mSymbols[SDLK_KP9] = InputServer::IC_KP9; 00128 mSymbols[SDLK_KP_PERIOD] = InputServer::IC_KP_DECIMAL; 00129 mSymbols[SDLK_KP_DIVIDE] = InputServer::IC_KP_DIVIDE; 00130 mSymbols[SDLK_KP_MULTIPLY] = InputServer::IC_KP_MULTIPLY; 00131 mSymbols[SDLK_KP_MINUS] = InputServer::IC_KP_MINUS; 00132 mSymbols[SDLK_KP_PLUS] = InputServer::IC_KP_PLUS; 00133 mSymbols[SDLK_KP_ENTER] = InputServer::IC_KP_ENTER; 00134 // SDLK_KP_EQUALS 00135 mSymbols[SDLK_UP] = InputServer::IC_UP; 00136 mSymbols[SDLK_DOWN] = InputServer::IC_DOWN; 00137 mSymbols[SDLK_RIGHT] = InputServer::IC_RIGHT; 00138 mSymbols[SDLK_LEFT] = InputServer::IC_LEFT; 00139 mSymbols[SDLK_INSERT] = InputServer::IC_INSERT; 00140 mSymbols[SDLK_HOME] = InputServer::IC_HOME; 00141 mSymbols[SDLK_END] = InputServer::IC_END; 00142 mSymbols[SDLK_PAGEUP] = InputServer::IC_PAGEUP; 00143 mSymbols[SDLK_PAGEDOWN] = InputServer::IC_PAGEDOWN; 00144 mSymbols[SDLK_F1] = InputServer::IC_F1; 00145 mSymbols[SDLK_F2] = InputServer::IC_F2; 00146 mSymbols[SDLK_F3] = InputServer::IC_F3; 00147 mSymbols[SDLK_F4] = InputServer::IC_F4; 00148 mSymbols[SDLK_F5] = InputServer::IC_F5; 00149 mSymbols[SDLK_F6] = InputServer::IC_F6; 00150 mSymbols[SDLK_F7] = InputServer::IC_F7; 00151 mSymbols[SDLK_F8] = InputServer::IC_F8; 00152 mSymbols[SDLK_F9] = InputServer::IC_F9; 00153 mSymbols[SDLK_F10] = InputServer::IC_F10; 00154 mSymbols[SDLK_F11] = InputServer::IC_F11; 00155 mSymbols[SDLK_F12] = InputServer::IC_F12; 00156 // SDLK_F13 00157 // SDLK_F14 00158 // SDLK_F15 00159 mSymbols[SDLK_NUMLOCK] = InputServer::IC_NUMLOCK; 00160 mSymbols[SDLK_CAPSLOCK] = InputServer::IC_CAPSLOCK; 00161 mSymbols[SDLK_SCROLLOCK] = InputServer::IC_SCROLLOCK; 00162 mSymbols[SDLK_RSHIFT] = InputServer::IC_RSHIFT; 00163 mSymbols[SDLK_LSHIFT] = InputServer::IC_LSHIFT; 00164 mSymbols[SDLK_RCTRL] = InputServer::IC_RCTRL; 00165 mSymbols[SDLK_LCTRL] = InputServer::IC_LCTRL; 00166 mSymbols[SDLK_RALT] = InputServer::IC_RALT; 00167 mSymbols[SDLK_LALT] = InputServer::IC_LALT; 00168 // SDLK_RMETA 00169 // SDLK_LMETA 00170 mSymbols[SDLK_LSUPER] = InputServer::IC_LSUPER; 00171 mSymbols[SDLK_RSUPER] = InputServer::IC_RSUPER; 00172 // SDLK_MODE 00173 // SDLK_COMPOSE 00174 // SDLK_HELP 00175 mSymbols[SDLK_PRINT] = InputServer::IC_PRINT; 00176 // SDLK_SYSREQ 00177 // SDLK_BREAK 00178 // SDLK_MENU 00179 // SDLK_POWER 00180 // SDLK_EURO 00181 // SDLK_UNDO 00182 } 00183 00184 bool 00185 KeyboardSDL::Init(kerosin::InputSystem *inputSystem) 00186 { 00187 return InputDevice::Init(inputSystem); 00188 } 00189 00190 bool 00191 KeyboardSDL::TranslateSymbol(int& sym) 00192 { 00193 TSymMap::iterator iter = mSymbols.find(sym); 00194 if (iter == mSymbols.end()) 00195 { 00196 return false; 00197 } 00198 00199 sym = (*iter).second; 00200 return true; 00201 } 00202 00203 int 00204 KeyboardSDL::EventFilter(const SDL_Event* event) 00205 { 00206 // we only want keyboard events 00207 if ( 00208 (event->type != SDL_KEYDOWN) && 00209 (event->type != SDL_KEYUP) 00210 ) 00211 { 00212 return 1; 00213 } 00214 00215 unsigned int& modState = 00216 mInputSystem->GetInputServer()->mModifierState; 00217 00218 if (event->key.keysym.mod & KMOD_LSHIFT) 00219 { 00220 modState |= InputServer::eLShift; 00221 } 00222 00223 if (event->key.keysym.mod & KMOD_RSHIFT) 00224 { 00225 modState |= InputServer::eRShift; 00226 } 00227 00228 if (event->key.keysym.mod & KMOD_LALT) 00229 { 00230 modState |= InputServer::eLAlt; 00231 } 00232 00233 if (event->key.keysym.mod & KMOD_RALT) 00234 { 00235 modState |= InputServer::eRAlt; 00236 } 00237 00238 if (event->key.keysym.sym == 0) 00239 { 00240 return 1; 00241 } 00242 00243 int sym = event->key.keysym.sym; 00244 if (! TranslateSymbol(sym)) 00245 { 00246 GetLog()->Warning() 00247 << "(KeyboardSDL) WARNING: encountered unknown SDL key symbol " 00248 << sym << "\n"; 00249 return 1; 00250 } 00251 00252 InputServer::Input input(InputServer::eButton, sym); 00253 input.data.l = (event->type == SDL_KEYDOWN); 00254 mInputSystem->AddInputInternal(input); 00255 00256 return 0; 00257 }