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