Mercurial > sdl-ios-xcode
view src/video/symbian/EKA2/SDL_epocevents.cpp @ 4135:cd98d1dc385c SDL-1.2
Damien Carbery fixed bug #542
In SDL 1.2.13 sdl.m4 the AM_PATH_SDL function looks for sdl-config.
It sets the PATH:
PATH="$prefix/bin:$prefix/usr/bin:$PATH"
but does not save the current PATH or restore the current PATH at the end.
This breaks the build on Solaris because we have GNU tools in another dir
(listed at the top of PATH) but non-GNU tools with the same names in
$prefix/bin. Later configure tests finds the non-GNU tools and quits in error
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 24 Jan 2008 15:50:20 +0000 |
parents | e85e65aec22f |
children |
line wrap: on
line source
#include "epoc_sdl.h" #include <stdio.h> #undef NULL extern "C" { //#define DEBUG_TRACE_ENABLED #include "SDL_error.h" #include "SDL_video.h" #include "SDL_keysym.h" #include "SDL_keyboard.h" #include "SDL_events_c.h" #include "SDL_timer.h" } /* extern "C" */ #include "SDL_epocvideo.h" #include "SDL_epocevents_c.h" #include "sdlepocapi.h" #include <eikenv.h> #include<bautils.h> extern "C" { static SDL_keysym *TranslateKey(_THIS, int scancode, SDL_keysym *keysym); } //extern "C" { /* The translation tables from a console scancode to a SDL keysym */ static SDLKey keymap[MAX_SCANCODE]; static SDL_keysym *TranslateKey(_THIS, int scancode, SDL_keysym *keysym); void DisableKeyBlocking(_THIS); //} /* extern "C" */ SDLKey* KeyMap() { return keymap; } TBool isCursorVisible = EFalse; void ResetKeyMap() { int i; /* Initialize the key translation table */ for ( i=0; i<SDL_TABLESIZE(keymap); ++i ) keymap[i] = SDLK_UNKNOWN; /* Numbers */ for ( i = 0; i<32; ++i ){ keymap[' ' + i] = (SDLKey)(SDLK_SPACE+i); } /* e.g. Alphabet keys */ for ( i = 0; i<32; ++i ){ keymap['A' + i] = (SDLKey)(SDLK_a+i); } keymap[EStdKeyBackspace] = SDLK_BACKSPACE; keymap[EStdKeyTab] = SDLK_TAB; keymap[EStdKeyEnter] = SDLK_RETURN; keymap[EStdKeyEscape] = SDLK_ESCAPE; keymap[EStdKeySpace] = SDLK_SPACE; keymap[EStdKeyPause] = SDLK_PAUSE; keymap[EStdKeyHome] = SDLK_HOME; keymap[EStdKeyEnd] = SDLK_END; keymap[EStdKeyPageUp] = SDLK_PAGEUP; keymap[EStdKeyPageDown] = SDLK_PAGEDOWN; keymap[EStdKeyDelete] = SDLK_DELETE; keymap[EStdKeyUpArrow] = SDLK_UP; keymap[EStdKeyDownArrow] = SDLK_DOWN; keymap[EStdKeyLeftArrow] = SDLK_LEFT; keymap[EStdKeyRightArrow] = SDLK_RIGHT; keymap[EStdKeyCapsLock] = SDLK_CAPSLOCK; keymap[EStdKeyLeftShift] = SDLK_LSHIFT; keymap[EStdKeyRightShift] = SDLK_RSHIFT; keymap[EStdKeyLeftAlt] = SDLK_LALT; keymap[EStdKeyRightAlt] = SDLK_RALT; keymap[EStdKeyLeftCtrl] = SDLK_LCTRL; keymap[EStdKeyRightCtrl] = SDLK_RCTRL; keymap[EStdKeyLeftFunc] = SDLK_LMETA; keymap[EStdKeyRightFunc] = SDLK_RMETA; keymap[EStdKeyInsert] = SDLK_INSERT; keymap[EStdKeyComma] = SDLK_COMMA; keymap[EStdKeyFullStop] = SDLK_PERIOD; keymap[EStdKeyForwardSlash] = SDLK_SLASH; keymap[EStdKeyBackSlash] = SDLK_BACKSLASH; keymap[EStdKeySemiColon] = SDLK_SEMICOLON; keymap[EStdKeySingleQuote] = SDLK_QUOTE; keymap[EStdKeyHash] = SDLK_HASH; keymap[EStdKeySquareBracketLeft] = SDLK_LEFTBRACKET; keymap[EStdKeySquareBracketRight] = SDLK_RIGHTBRACKET; keymap[EStdKeyMinus] = SDLK_MINUS; keymap[EStdKeyEquals] = SDLK_EQUALS; keymap[EStdKeyF1] = SDLK_F1; keymap[EStdKeyF2] = SDLK_F2; keymap[EStdKeyF3] = SDLK_F3; keymap[EStdKeyF4] = SDLK_F4; keymap[EStdKeyF5] = SDLK_F5; keymap[EStdKeyF6] = SDLK_F6; keymap[EStdKeyF7] = SDLK_F7; keymap[EStdKeyF8] = SDLK_F8; keymap[EStdKeyF9] = SDLK_F9; keymap[EStdKeyF10] = SDLK_F10; keymap[EStdKeyF11] = SDLK_F11; keymap[EStdKeyF12] = SDLK_F12; keymap[EStdKeyXXX] = SDLK_RETURN; /* "fire" key */ keymap[EStdKeyDevice3] = SDLK_RETURN; /* "fire" key */ keymap[EStdKeyNkpAsterisk] = SDLK_ASTERISK; keymap[EStdKeyYes] = SDLK_HOME; /* "call" key */ keymap[EStdKeyNo] = SDLK_END; /* "end call" key */ keymap[EStdKeyDevice0] = SDLK_SPACE; /* right menu key */ keymap[EStdKeyDevice1] = SDLK_ESCAPE; /* left menu key */ keymap[EStdKeyDevice2] = SDLK_POWER; /* power key */ keymap[EStdKeyMenu] = SDLK_MENU; // menu key keymap[EStdKeyDevice6] = SDLK_LEFT; // Rocker (joystick) left keymap[EStdKeyDevice7] = SDLK_RIGHT; // Rocker (joystick) right keymap[EStdKeyDevice8] = SDLK_UP; // Rocker (joystick) up keymap[EStdKeyDevice9] = SDLK_DOWN; // Rocker (joystick) down keymap[EStdKeyLeftFunc] = SDLK_LALT; //chr? keymap[EStdKeyRightFunc] = SDLK_RALT; keymap[EStdKeyDeviceA] = SDLK_RETURN; /* "fire" key */ /////////////////////////////////////////////////////////// /* RFs fs; if(KErrNone == fs.Connect()) { RArray<TInt> array; TRAPD(err, ReadL(fs, array)); if(err == KErrNone && array.Count() > 0) { SDLKey temp[MAX_SCANCODE]; Mem::Copy(temp, keymap, MAX_SCANCODE * sizeof(SDLKey)); for(TInt k = 0; k < array.Count(); k+= 2) { const TInt oldval = array[k]; const TInt newval = array[k + 1]; if(oldval >= 0 && oldval < MAX_SCANCODE && newval >= 0 && newval < MAX_SCANCODE) { keymap[oldval] = temp[newval]; } } } array.Close(); } fs.Close();*/ /////////////////////////////////////////////////////////// keymap[EStdKeyNumLock] = SDLK_NUMLOCK; keymap[EStdKeyScrollLock] = SDLK_SCROLLOCK; keymap[EStdKeyNkpForwardSlash] = SDLK_KP_DIVIDE; keymap[EStdKeyNkpAsterisk] = SDLK_KP_MULTIPLY; keymap[EStdKeyNkpMinus] = SDLK_KP_MINUS; keymap[EStdKeyNkpPlus] = SDLK_KP_PLUS; keymap[EStdKeyNkpEnter] = SDLK_KP_ENTER; keymap[EStdKeyNkp1] = SDLK_KP1; keymap[EStdKeyNkp2] = SDLK_KP2; keymap[EStdKeyNkp3] = SDLK_KP3; keymap[EStdKeyNkp4] = SDLK_KP4; keymap[EStdKeyNkp5] = SDLK_KP5; keymap[EStdKeyNkp6] = SDLK_KP6; keymap[EStdKeyNkp7] = SDLK_KP7; keymap[EStdKeyNkp8] = SDLK_KP8; keymap[EStdKeyNkp9] = SDLK_KP9; keymap[EStdKeyNkp0] = SDLK_KP0; keymap[EStdKeyNkpFullStop] = SDLK_KP_PERIOD; /* keymap[EStdKeyMenu] = SDLK_MENU; should be, but not yet keymap[EStdKeyBacklightOn] = keymap[EStdKeyBacklightOff] = keymap[EStdKeyBacklightToggle] = keymap[EStdKeyIncContrast] = keymap[EStdKeyDecContrast] = keymap[EStdKeySliderDown] = keymap[EStdKeySliderUp] = keymap[EStdKeyDictaphonePlay] = keymap[EStdKeyDictaphoneStop] = keymap[EStdKeyDictaphoneRecord] = keymap[EStdKeyHelp] = keymap[EStdKeyOff] = keymap[EStdKeyDial] = keymap[EStdKeyIncVolume] = keymap[EStdKeyDecVolume] = keymap[EStdKeyDevice0] = keymap[EStdKeyDevice1] = keymap[EStdKeyDevice2] = keymap[EStdKeyDevice3] = keymap[EStdKeyDevice4] = keymap[EStdKeyDevice5] = keymap[EStdKeyDevice6] = keymap[EStdKeyDevice7] = keymap[EStdKeyDevice8] = keymap[EStdKeyDevice9] = keymap[EStdKeyDeviceA] = keymap[EStdKeyDeviceB] = keymap[EStdKeyDeviceC] = keymap[EStdKeyDeviceD] = keymap[EStdKeyDeviceE] = keymap[EStdKeyDeviceF] = keymap[EStdKeyApplication0] = keymap[EStdKeyApplication1] = keymap[EStdKeyApplication2] = keymap[EStdKeyApplication3] = keymap[EStdKeyApplication4] = keymap[EStdKeyApplication5] = keymap[EStdKeyApplication6] = keymap[EStdKeyApplication7] = keymap[EStdKeyApplication8] = keymap[EStdKeyApplication9] = keymap[EStdKeyApplicationA] = keymap[EStdKeyApplicationB] = keymap[EStdKeyApplicationC] = keymap[EStdKeyApplicationD] = keymap[EStdKeyApplicationE] = keymap[EStdKeyApplicationF] = keymap[EStdKeyYes] = keymap[EStdKeyNo] = keymap[EStdKeyIncBrightness] = keymap[EStdKeyDecBrightness] = keymap[EStdKeyCaseOpen] = keymap[EStdKeyCaseClose] = */ } int EPOC_HandleWsEvent(_THIS, const TWsEvent& aWsEvent) { int posted = 0; SDL_keysym keysym; // SDL_TRACE1("hws %d", aWsEvent.Type()); switch (aWsEvent.Type()) { case EEventPointer: /* Mouse pointer events */ { /* const TPointerCursorMode mode = EpocSdlEnv::PointerMode(); if(mode == EPointerCursorNone) { return 0; //TODO: Find out why events are get despite of cursor should be off } */ const TPointerEvent* pointerEvent = aWsEvent.Pointer(); const TPoint mousePos = EpocSdlEnv::WindowCoordinates(pointerEvent->iPosition); /*!! TODO Pointer do not yet work properly //SDL_TRACE1("SDL: EPOC_HandleWsEvent, pointerEvent->iType=%d", pointerEvent->iType); //!! if (Private->EPOC_ShrinkedHeight) { mousePos.iY <<= 1; // Scale y coordinate to shrinked screen height } if (Private->EPOC_ShrinkedWidth) { mousePos.iX <<= 1; // Scale x coordinate to shrinked screen width } */ posted += SDL_PrivateMouseMotion(0, 0, mousePos.iX, mousePos.iY); /* Absolute position on screen */ switch (pointerEvent->iType) { case TPointerEvent::EButton1Down: posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT, 0, 0); break; case TPointerEvent::EButton1Up: posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0); break; case TPointerEvent::EButton2Down: posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_RIGHT, 0, 0); break; case TPointerEvent::EButton2Up: posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_RIGHT, 0, 0); break; case TPointerEvent::EButton3Down: posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_MIDDLE, 0, 0); break; case TPointerEvent::EButton3Up: posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_MIDDLE, 0, 0); break; } // switch break; } case EEventKeyDown: /* Key events */ { #ifdef SYMBIAN_CRYSTAL // special case: 9300/9500 rocker down, simulate left mouse button if (aWsEvent.Key()->iScanCode == EStdKeyDeviceA) { const TPointerCursorMode mode = Private->EPOC_WsSession.PointerCursorMode(); if(mode != EPointerCursorNone) posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT, 0, 0); } #endif (void*)TranslateKey(_this, aWsEvent.Key()->iScanCode, &keysym); #ifndef DISABLE_JOYSTICK /* Special handling */ switch((int)keysym.sym) { case SDLK_CAPSLOCK: if (!isCursorVisible) { /* Enable virtual cursor */ HAL::Set(HAL::EMouseState, HAL::EMouseState_Visible); } else { /* Disable virtual cursor */ HAL::Set(HAL::EMouseState, HAL::EMouseState_Invisible); } isCursorVisible = !isCursorVisible; break; } #endif posted += SDL_PrivateKeyboard(SDL_PRESSED, &keysym); break; } case EEventKeyUp: /* Key events */ { #ifdef SYMBIAN_CRYSTAL // special case: 9300/9500 rocker up, simulate left mouse button if (aWsEvent.Key()->iScanCode == EStdKeyDeviceA) { posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0); } #endif posted += SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(_this, aWsEvent.Key()->iScanCode, &keysym)); break; } case EEventFocusGained: /* SDL window got focus */ { Private->iIsWindowFocused = ETrue; posted += SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS); /* Draw window background and screen buffer */ DisableKeyBlocking(_this); //Markus: guess why:-) //RedrawWindowL(_this); break; } case EEventFocusLost: /* SDL window lost focus */ { Private->iIsWindowFocused = EFalse; posted += SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS); break; } case EEventModifiersChanged: { TModifiersChangedEvent* modEvent = aWsEvent.ModifiersChanged(); TUint modstate = KMOD_NONE; if (modEvent->iModifiers == EModifierLeftShift) modstate |= KMOD_LSHIFT; if (modEvent->iModifiers == EModifierRightShift) modstate |= KMOD_RSHIFT; if (modEvent->iModifiers == EModifierLeftCtrl) modstate |= KMOD_LCTRL; if (modEvent->iModifiers == EModifierRightCtrl) modstate |= KMOD_RCTRL; if (modEvent->iModifiers == EModifierLeftAlt) modstate |= KMOD_LALT; if (modEvent->iModifiers == EModifierRightAlt) modstate |= KMOD_RALT; if (modEvent->iModifiers == EModifierLeftFunc) modstate |= KMOD_LMETA; if (modEvent->iModifiers == EModifierRightFunc) modstate |= KMOD_RMETA; if (modEvent->iModifiers == EModifierCapsLock) modstate |= KMOD_CAPS; SDL_SetModState(STATIC_CAST(SDLMod,(modstate | KMOD_LSHIFT))); break; } case EEventScreenDeviceChanged: { EpocSdlEnv::WaitDeviceChange(); } break; default: break; } return posted; } extern "C" { void EPOC_PumpEvents(_THIS) { MEventQueue& events = EpocSdlEnv::EventQueue(); while(events.HasData()) { events.Lock(); //there have to be a copy, so we can release //lock immediately. HandleWsEvent may cause //deadlock otherwise. const TWsEvent event = events.Shift(); events.Unlock(); // const TWsEvent& event = events.Top(); EPOC_HandleWsEvent(_this, event); // events.Shift(); } } void EPOC_InitOSKeymap(_THIS) { ResetKeyMap(); EpocSdlEnv::ObserverEvent(MSDLObserver::EEventKeyMapInit ,0); } static SDL_keysym *TranslateKey(_THIS, int scancode, SDL_keysym *keysym) { // char debug[256]; //SDL_TRACE1("SDL: TranslateKey, scancode=%d", scancode); //!! /* Set the keysym information */ keysym->scancode = scancode; if ((scancode >= MAX_SCANCODE) && ((scancode - ENonCharacterKeyBase + 0x0081) >= MAX_SCANCODE)) { SDL_SetError("Too big scancode"); keysym->scancode = SDLK_UNKNOWN; keysym->mod = KMOD_NONE; return keysym; } keysym->mod = SDL_GetModState(); /* Handle function keys: F1, F2, F3 ... */ if (keysym->mod & KMOD_META) { if (scancode >= 'A' && scancode < ('A' + 24)) { /* first 32 alphabet keys */ switch(scancode) { case 'Q': scancode = EStdKeyF1; break; case 'W': scancode = EStdKeyF2; break; case 'E': scancode = EStdKeyF3; break; case 'R': scancode = EStdKeyF4; break; case 'T': scancode = EStdKeyF5; break; case 'Y': scancode = EStdKeyF6; break; case 'U': scancode = EStdKeyF7; break; case 'I': scancode = EStdKeyF8; break; case 'A': scancode = EStdKeyF9; break; case 'S': scancode = EStdKeyF10; break; case 'D': scancode = EStdKeyF11; break; case 'F': scancode = EStdKeyF12; break; } keysym->sym = keymap[scancode]; } } if (scancode >= ENonCharacterKeyBase) { // Non character keys keysym->sym = keymap[scancode - ENonCharacterKeyBase + 0x0081]; // !!hard coded } else { keysym->sym = keymap[scancode]; } /* Remap the arrow keys if the device is rotated */ /* if (Private->EPOC_ScreenOrientation == CFbsBitGc::EGraphicsOrientationRotated270) { switch(keysym->sym) { case SDLK_UP: keysym->sym = SDLK_LEFT; break; case SDLK_DOWN: keysym->sym = SDLK_RIGHT; break; case SDLK_LEFT: keysym->sym = SDLK_DOWN; break; case SDLK_RIGHT:keysym->sym = SDLK_UP; break; } } */ /* If UNICODE is on, get the UNICODE value for the key */ keysym->unicode = 0; #if 0 // !!TODO:unicode if ( SDL_TranslateUNICODE ) { /* Populate the unicode field with the ASCII value */ keysym->unicode = scancode; } #endif //!! //sprintf(debug, "SDL: TranslateKey: keysym->scancode=%d, keysym->sym=%d, keysym->mod=%d", // keysym->scancode, keysym->sym, keysym->mod); //SDL_TRACE(debug); //!! return(keysym); } } /* extern "C" */