Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

keyboardsdl.cpp

Go to the documentation of this file.
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 }

Generated on Thu Apr 6 15:25:38 2006 for rcssserver3d by  doxygen 1.4.4