146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Library General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Library General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Library General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_epocevents.cpp 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Handle the event stream, converting Epoc events into SDL events 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi) 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <stdio.h> 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#undef NULL 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" { 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_error.h" 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_video.h" 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_keysym.h" 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_keyboard.h" 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_timer.h" 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "../../events/SDL_events_c.h" 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; /* extern "C" */ 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_epocvideo.h" 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_epocevents_c.h" 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include <hal.h> 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" { 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* The translation tables from a console scancode to a SDL keysym */ 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDLKey keymap[MAX_SCANCODE]; 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym); 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; /* extern "C" */ 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5546be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerTBool isCursorVisible = ETrue; 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerint EPOC_HandleWsEvent(_THIS, const TWsEvent& aWsEvent) 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int posted = 0; 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_keysym keysym; 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (aWsEvent.Type()) { 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case EEventPointer: /* Mouse pointer events */ 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner const TPointerEvent* pointerEvent = aWsEvent.Pointer(); 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner TPoint mousePos = pointerEvent->iPosition; 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //SDL_TRACE1("SDL: EPOC_HandleWsEvent, pointerEvent->iType=%d", pointerEvent->iType); //!! 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (Private->EPOC_ShrinkedHeight) { 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner mousePos.iY <<= 1; /* Scale y coordinate to shrinked screen height */ 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted += SDL_PrivateMouseMotion(0, 0, mousePos.iX, mousePos.iY); /* Absolute position on screen */ 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (pointerEvent->iType==TPointerEvent::EButton1Down) { 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT, 0, 0); 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (pointerEvent->iType==TPointerEvent::EButton1Up) { 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0); 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (pointerEvent->iType==TPointerEvent::EButton2Down) { 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_RIGHT, 0, 0); 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else if (pointerEvent->iType==TPointerEvent::EButton2Up) { 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_RIGHT, 0, 0); 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //!!posted += SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(aWsEvent.Key()->iScanCode, &keysym)); 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case EEventKeyDown: /* Key events */ 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (void*)TranslateKey(aWsEvent.Key()->iScanCode, &keysym); 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Special handling */ 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch((int)keysym.sym) { 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case SDLK_CAPSLOCK: 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (!isCursorVisible) { 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Enable virtual cursor */ 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HAL::Set(HAL::EMouseState, HAL::EMouseState_Visible); 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner else { 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Disable virtual cursor */ 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner HAL::Set(HAL::EMouseState, HAL::EMouseState_Invisible); 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner isCursorVisible = !isCursorVisible; 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted += SDL_PrivateKeyboard(SDL_PRESSED, &keysym); 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case EEventKeyUp: /* Key events */ 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted += SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(aWsEvent.Key()->iScanCode, &keysym)); 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case EEventFocusGained: /* SDL window got focus */ 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //Private->EPOC_IsWindowFocused = ETrue; 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Draw window background and screen buffer */ 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RedrawWindowL(_this); 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case EEventFocusLost: /* SDL window lost focus */ 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //Private->EPOC_IsWindowFocused = EFalse; 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Wait and eat events until focus is gained again 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (ETrue) { 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus); 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner User::WaitForRequest(Private->EPOC_WsEventStatus); 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Private->EPOC_WsSession.GetEvent(Private->EPOC_WsEvent); 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner TInt eventType = Private->EPOC_WsEvent.Type(); 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Private->EPOC_WsEventStatus = KRequestPending; 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus); 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (eventType == EEventFocusGained) { 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner RedrawWindowL(_this); 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case EEventModifiersChanged: 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner TModifiersChangedEvent* modEvent = aWsEvent.ModifiersChanged(); 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner TUint modstate = KMOD_NONE; 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierLeftShift) 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_LSHIFT; 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierRightShift) 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_RSHIFT; 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierLeftCtrl) 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_LCTRL; 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierRightCtrl) 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_RCTRL; 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierLeftAlt) 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_LALT; 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierRightAlt) 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_RALT; 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierLeftFunc) 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_LMETA; 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierRightFunc) 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_RMETA; 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (modEvent->iModifiers == EModifierCapsLock) 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modstate |= KMOD_CAPS; 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetModState(STATIC_CAST(SDLMod,(modstate | KMOD_LSHIFT))); 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner default: 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return posted; 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerextern "C" { 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid EPOC_PumpEvents(_THIS) 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int posted = 0; // !! Do we need this? 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus); 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while (Private->EPOC_WsEventStatus != KRequestPending) { 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Private->EPOC_WsSession.GetEvent(Private->EPOC_WsEvent); 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner posted = EPOC_HandleWsEvent(_this, Private->EPOC_WsEvent); 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Private->EPOC_WsEventStatus = KRequestPending; 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus); 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turnervoid EPOC_InitOSKeymap(_THIS) 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int i; 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Initialize the key translation table */ 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( i=0; i<SDL_TABLESIZE(keymap); ++i ) 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[i] = SDLK_UNKNOWN; 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Numbers */ 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( i = 0; i<32; ++i ){ 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[' ' + i] = (SDLKey)(SDLK_SPACE+i); 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* e.g. Alphabet keys */ 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( i = 0; i<32; ++i ){ 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap['A' + i] = (SDLKey)(SDLK_a+i); 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyBackspace] = SDLK_BACKSPACE; 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyTab] = SDLK_TAB; 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyEnter] = SDLK_RETURN; 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyEscape] = SDLK_ESCAPE; 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeySpace] = SDLK_SPACE; 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyPause] = SDLK_PAUSE; 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyHome] = SDLK_HOME; 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyEnd] = SDLK_END; 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyPageUp] = SDLK_PAGEUP; 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyPageDown] = SDLK_PAGEDOWN; 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyDelete] = SDLK_DELETE; 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyUpArrow] = SDLK_UP; 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyDownArrow] = SDLK_DOWN; 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyLeftArrow] = SDLK_LEFT; 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyRightArrow] = SDLK_RIGHT; 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyCapsLock] = SDLK_CAPSLOCK; 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyLeftShift] = SDLK_LSHIFT; 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyRightShift] = SDLK_RSHIFT; 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyLeftAlt] = SDLK_LALT; 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyRightAlt] = SDLK_RALT; 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyLeftCtrl] = SDLK_LCTRL; 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyRightCtrl] = SDLK_RCTRL; 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyLeftFunc] = SDLK_LMETA; 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyRightFunc] = SDLK_RMETA; 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyInsert] = SDLK_INSERT; 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyComma] = SDLK_COMMA; 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyFullStop] = SDLK_PERIOD; 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyForwardSlash] = SDLK_SLASH; 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyBackSlash] = SDLK_BACKSLASH; 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeySemiColon] = SDLK_SEMICOLON; 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeySingleQuote] = SDLK_QUOTE; 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyHash] = SDLK_HASH; 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeySquareBracketLeft] = SDLK_LEFTBRACKET; 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeySquareBracketRight] = SDLK_RIGHTBRACKET; 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyMinus] = SDLK_MINUS; 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyEquals] = SDLK_EQUALS; 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF1] = SDLK_F1; /* chr + q */ 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF2] = SDLK_F2; /* chr + w */ 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF3] = SDLK_F3; /* chr + e */ 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF4] = SDLK_F4; /* chr + r */ 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF5] = SDLK_F5; /* chr + t */ 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF6] = SDLK_F6; /* chr + y */ 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF7] = SDLK_F7; /* chr + i */ 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF8] = SDLK_F8; /* chr + o */ 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF9] = SDLK_F9; /* chr + a */ 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF10] = SDLK_F10; /* chr + s */ 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF11] = SDLK_F11; /* chr + d */ 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keymap[EStdKeyF12] = SDLK_F12; /* chr + f */ 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* !!TODO 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNumLock=0x1b, 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyScrollLock=0x1c, 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkpForwardSlash=0x84, 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkpAsterisk=0x85, 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkpMinus=0x86, 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkpPlus=0x87, 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkpEnter=0x88, 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp1=0x89, 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp2=0x8a, 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp3=0x8b, 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp4=0x8c, 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp5=0x8d, 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp6=0x8e, 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp7=0x8f, 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp8=0x90, 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp9=0x91, 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkp0=0x92, 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNkpFullStop=0x93, 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyMenu=0x94, 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyBacklightOn=0x95, 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyBacklightOff=0x96, 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyBacklightToggle=0x97, 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyIncContrast=0x98, 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDecContrast=0x99, 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeySliderDown=0x9a, 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeySliderUp=0x9b, 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDictaphonePlay=0x9c, 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDictaphoneStop=0x9d, 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDictaphoneRecord=0x9e, 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyHelp=0x9f, 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyOff=0xa0, 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDial=0xa1, 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyIncVolume=0xa2, 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDecVolume=0xa3, 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice0=0xa4, 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice1=0xa5, 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice2=0xa6, 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice3=0xa7, 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice4=0xa8, 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice5=0xa9, 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice6=0xaa, 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice7=0xab, 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice8=0xac, 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDevice9=0xad, 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDeviceA=0xae, 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDeviceB=0xaf, 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDeviceC=0xb0, 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDeviceD=0xb1, 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDeviceE=0xb2, 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDeviceF=0xb3, 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication0=0xb4, 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication1=0xb5, 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication2=0xb6, 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication3=0xb7, 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication4=0xb8, 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication5=0xb9, 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication6=0xba, 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication7=0xbb, 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication8=0xbc, 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplication9=0xbd, 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplicationA=0xbe, 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplicationB=0xbf, 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplicationC=0xc0, 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplicationD=0xc1, 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplicationE=0xc2, 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyApplicationF=0xc3, 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyYes=0xc4, 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyNo=0xc5, 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyIncBrightness=0xc6, 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyDecBrightness=0xc7, 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyCaseOpen=0xc8, 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner EStdKeyCaseClose=0xc9 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner */ 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner char debug[256]; 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //SDL_TRACE1("SDL: TranslateKey, scancode=%d", scancode); //!! 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set the keysym information */ 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->scancode = scancode; 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ((scancode >= MAX_SCANCODE) && 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ((scancode - ENonCharacterKeyBase + 0x0081) >= MAX_SCANCODE)) { 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_SetError("Too big scancode"); 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->scancode = SDLK_UNKNOWN; 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->mod = KMOD_NONE; 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return keysym; 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->mod = SDL_GetModState(); //!!Is this right?? 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Handle function keys: F1, F2, F3 ... */ 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (keysym->mod & KMOD_META) { 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (scancode >= 'A' && scancode < ('A' + 24)) { /* first 32 alphapet keys */ 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(scancode) { 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'Q': scancode = EStdKeyF1; break; 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'W': scancode = EStdKeyF2; break; 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'E': scancode = EStdKeyF3; break; 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'R': scancode = EStdKeyF4; break; 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'T': scancode = EStdKeyF5; break; 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'Y': scancode = EStdKeyF6; break; 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'U': scancode = EStdKeyF7; break; 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'I': scancode = EStdKeyF8; break; 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'A': scancode = EStdKeyF9; break; 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'S': scancode = EStdKeyF10; break; 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'D': scancode = EStdKeyF11; break; 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 'F': scancode = EStdKeyF12; break; 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = keymap[scancode]; 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if (scancode >= ENonCharacterKeyBase) { 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // Non character keys 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = keymap[scancode - 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ENonCharacterKeyBase + 0x0081]; // !!hard coded 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->sym = keymap[scancode]; 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* If UNICODE is on, get the UNICODE value for the key */ 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->unicode = 0; 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if 0 // !!TODO:unicode 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( SDL_TranslateUNICODE ) 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Populate the unicode field with the ASCII value */ 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner keysym->unicode = scancode; 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //!! 41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //sprintf(debug, "SDL: TranslateKey: keysym->scancode=%d, keysym->sym=%d, keysym->mod=%d", 41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner // keysym->scancode, keysym->sym, keysym->mod); 41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner //SDL_TRACE(debug); //!! 41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return(keysym); 41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; /* extern "C" */ 41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 420