aboutsummaryrefslogtreecommitdiffstats
path: root/distrib/sdl-1.2.12/src/video/epoc/SDL_epocevents.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'distrib/sdl-1.2.12/src/video/epoc/SDL_epocevents.cpp')
-rw-r--r--distrib/sdl-1.2.12/src/video/epoc/SDL_epocevents.cpp419
1 files changed, 419 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.12/src/video/epoc/SDL_epocevents.cpp b/distrib/sdl-1.2.12/src/video/epoc/SDL_epocevents.cpp
new file mode 100644
index 0000000..f0e6945
--- /dev/null
+++ b/distrib/sdl-1.2.12/src/video/epoc/SDL_epocevents.cpp
@@ -0,0 +1,419 @@
+/*
+ SDL - Simple DirectMedia Layer
+ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+ Sam Lantinga
+ slouken@libsdl.org
+*/
+#include "SDL_config.h"
+
+/*
+ SDL_epocevents.cpp
+ Handle the event stream, converting Epoc events into SDL events
+
+ Epoc version by Hannu Viitala (hannu.j.viitala@mbnet.fi)
+*/
+
+
+#include <stdio.h>
+#undef NULL
+
+extern "C" {
+#include "SDL_error.h"
+#include "SDL_video.h"
+#include "SDL_keysym.h"
+#include "SDL_keyboard.h"
+#include "SDL_timer.h"
+#include "../../events/SDL_events_c.h"
+}; /* extern "C" */
+
+#include "SDL_epocvideo.h"
+#include "SDL_epocevents_c.h"
+
+#include <hal.h>
+
+extern "C" {
+/* The translation tables from a console scancode to a SDL keysym */
+static SDLKey keymap[MAX_SCANCODE];
+static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym);
+}; /* extern "C" */
+
+TBool isCursorVisible = ETrue;
+
+int EPOC_HandleWsEvent(_THIS, const TWsEvent& aWsEvent)
+{
+ int posted = 0;
+ SDL_keysym keysym;
+
+
+ switch (aWsEvent.Type()) {
+
+ case EEventPointer: /* Mouse pointer events */
+ {
+ const TPointerEvent* pointerEvent = aWsEvent.Pointer();
+ TPoint mousePos = pointerEvent->iPosition;
+
+ //SDL_TRACE1("SDL: EPOC_HandleWsEvent, pointerEvent->iType=%d", pointerEvent->iType); //!!
+
+ if (Private->EPOC_ShrinkedHeight) {
+ mousePos.iY <<= 1; /* Scale y coordinate to shrinked screen height */
+ }
+ posted += SDL_PrivateMouseMotion(0, 0, mousePos.iX, mousePos.iY); /* Absolute position on screen */
+ if (pointerEvent->iType==TPointerEvent::EButton1Down) {
+ posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT, 0, 0);
+ }
+ else if (pointerEvent->iType==TPointerEvent::EButton1Up) {
+ posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0);
+ }
+ else if (pointerEvent->iType==TPointerEvent::EButton2Down) {
+ posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_RIGHT, 0, 0);
+ }
+ else if (pointerEvent->iType==TPointerEvent::EButton2Up) {
+ posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_RIGHT, 0, 0);
+ }
+ //!!posted += SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(aWsEvent.Key()->iScanCode, &keysym));
+ break;
+ }
+
+ case EEventKeyDown: /* Key events */
+ {
+ (void*)TranslateKey(aWsEvent.Key()->iScanCode, &keysym);
+
+ /* 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;
+ }
+
+ posted += SDL_PrivateKeyboard(SDL_PRESSED, &keysym);
+ break;
+ }
+
+ case EEventKeyUp: /* Key events */
+ {
+ posted += SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(aWsEvent.Key()->iScanCode, &keysym));
+ break;
+ }
+
+ case EEventFocusGained: /* SDL window got focus */
+ {
+ //Private->EPOC_IsWindowFocused = ETrue;
+ /* Draw window background and screen buffer */
+ RedrawWindowL(_this);
+ break;
+ }
+
+ case EEventFocusLost: /* SDL window lost focus */
+ {
+ //Private->EPOC_IsWindowFocused = EFalse;
+
+ // Wait and eat events until focus is gained again
+ /*
+ while (ETrue) {
+ Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);
+ User::WaitForRequest(Private->EPOC_WsEventStatus);
+ Private->EPOC_WsSession.GetEvent(Private->EPOC_WsEvent);
+ TInt eventType = Private->EPOC_WsEvent.Type();
+ Private->EPOC_WsEventStatus = KRequestPending;
+ //Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);
+ if (eventType == EEventFocusGained) {
+ RedrawWindowL(_this);
+ break;
+ }
+ }
+ */
+ 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;
+ }
+ default:
+ break;
+ }
+
+ return posted;
+}
+
+extern "C" {
+
+void EPOC_PumpEvents(_THIS)
+{
+ int posted = 0; // !! Do we need this?
+ //Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);
+ while (Private->EPOC_WsEventStatus != KRequestPending) {
+
+ Private->EPOC_WsSession.GetEvent(Private->EPOC_WsEvent);
+ posted = EPOC_HandleWsEvent(_this, Private->EPOC_WsEvent);
+ Private->EPOC_WsEventStatus = KRequestPending;
+ Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus);
+ }
+}
+
+
+void EPOC_InitOSKeymap(_THIS)
+{
+ 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; /* chr + q */
+ keymap[EStdKeyF2] = SDLK_F2; /* chr + w */
+ keymap[EStdKeyF3] = SDLK_F3; /* chr + e */
+ keymap[EStdKeyF4] = SDLK_F4; /* chr + r */
+ keymap[EStdKeyF5] = SDLK_F5; /* chr + t */
+ keymap[EStdKeyF6] = SDLK_F6; /* chr + y */
+ keymap[EStdKeyF7] = SDLK_F7; /* chr + i */
+ keymap[EStdKeyF8] = SDLK_F8; /* chr + o */
+
+ keymap[EStdKeyF9] = SDLK_F9; /* chr + a */
+ keymap[EStdKeyF10] = SDLK_F10; /* chr + s */
+ keymap[EStdKeyF11] = SDLK_F11; /* chr + d */
+ keymap[EStdKeyF12] = SDLK_F12; /* chr + f */
+
+ /* !!TODO
+ EStdKeyNumLock=0x1b,
+ EStdKeyScrollLock=0x1c,
+
+ EStdKeyNkpForwardSlash=0x84,
+ EStdKeyNkpAsterisk=0x85,
+ EStdKeyNkpMinus=0x86,
+ EStdKeyNkpPlus=0x87,
+ EStdKeyNkpEnter=0x88,
+ EStdKeyNkp1=0x89,
+ EStdKeyNkp2=0x8a,
+ EStdKeyNkp3=0x8b,
+ EStdKeyNkp4=0x8c,
+ EStdKeyNkp5=0x8d,
+ EStdKeyNkp6=0x8e,
+ EStdKeyNkp7=0x8f,
+ EStdKeyNkp8=0x90,
+ EStdKeyNkp9=0x91,
+ EStdKeyNkp0=0x92,
+ EStdKeyNkpFullStop=0x93,
+ EStdKeyMenu=0x94,
+ EStdKeyBacklightOn=0x95,
+ EStdKeyBacklightOff=0x96,
+ EStdKeyBacklightToggle=0x97,
+ EStdKeyIncContrast=0x98,
+ EStdKeyDecContrast=0x99,
+ EStdKeySliderDown=0x9a,
+ EStdKeySliderUp=0x9b,
+ EStdKeyDictaphonePlay=0x9c,
+ EStdKeyDictaphoneStop=0x9d,
+ EStdKeyDictaphoneRecord=0x9e,
+ EStdKeyHelp=0x9f,
+ EStdKeyOff=0xa0,
+ EStdKeyDial=0xa1,
+ EStdKeyIncVolume=0xa2,
+ EStdKeyDecVolume=0xa3,
+ EStdKeyDevice0=0xa4,
+ EStdKeyDevice1=0xa5,
+ EStdKeyDevice2=0xa6,
+ EStdKeyDevice3=0xa7,
+ EStdKeyDevice4=0xa8,
+ EStdKeyDevice5=0xa9,
+ EStdKeyDevice6=0xaa,
+ EStdKeyDevice7=0xab,
+ EStdKeyDevice8=0xac,
+ EStdKeyDevice9=0xad,
+ EStdKeyDeviceA=0xae,
+ EStdKeyDeviceB=0xaf,
+ EStdKeyDeviceC=0xb0,
+ EStdKeyDeviceD=0xb1,
+ EStdKeyDeviceE=0xb2,
+ EStdKeyDeviceF=0xb3,
+ EStdKeyApplication0=0xb4,
+ EStdKeyApplication1=0xb5,
+ EStdKeyApplication2=0xb6,
+ EStdKeyApplication3=0xb7,
+ EStdKeyApplication4=0xb8,
+ EStdKeyApplication5=0xb9,
+ EStdKeyApplication6=0xba,
+ EStdKeyApplication7=0xbb,
+ EStdKeyApplication8=0xbc,
+ EStdKeyApplication9=0xbd,
+ EStdKeyApplicationA=0xbe,
+ EStdKeyApplicationB=0xbf,
+ EStdKeyApplicationC=0xc0,
+ EStdKeyApplicationD=0xc1,
+ EStdKeyApplicationE=0xc2,
+ EStdKeyApplicationF=0xc3,
+ EStdKeyYes=0xc4,
+ EStdKeyNo=0xc5,
+ EStdKeyIncBrightness=0xc6,
+ EStdKeyDecBrightness=0xc7,
+ EStdKeyCaseOpen=0xc8,
+ EStdKeyCaseClose=0xc9
+ */
+
+}
+
+
+
+static SDL_keysym *TranslateKey(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(); //!!Is this right??
+
+ /* Handle function keys: F1, F2, F3 ... */
+ if (keysym->mod & KMOD_META) {
+ if (scancode >= 'A' && scancode < ('A' + 24)) { /* first 32 alphapet 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];
+ }
+
+
+ /* 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" */
+
+