1 /* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Library General Public 7 License as published by the Free Software Foundation; either 8 version 2 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Library General Public License for more details. 14 15 You should have received a copy of the GNU Library General Public 16 License along with this library; if not, write to the Free 17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 19 Sam Lantinga 20 slouken (at) libsdl.org 21 */ 22 #include "SDL_config.h" 23 24 /* 25 SDL_epocevents.cpp 26 Handle the event stream, converting Epoc events into SDL events 27 28 Epoc version by Hannu Viitala (hannu.j.viitala (at) mbnet.fi) 29 */ 30 31 32 #include <stdio.h> 33 #undef NULL 34 35 extern "C" { 36 #include "SDL_error.h" 37 #include "SDL_video.h" 38 #include "SDL_keysym.h" 39 #include "SDL_keyboard.h" 40 #include "SDL_timer.h" 41 #include "../../events/SDL_events_c.h" 42 }; /* extern "C" */ 43 44 #include "SDL_epocvideo.h" 45 #include "SDL_epocevents_c.h" 46 47 #include <hal.h> 48 49 extern "C" { 50 /* The translation tables from a console scancode to a SDL keysym */ 51 static SDLKey keymap[MAX_SCANCODE]; 52 static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym); 53 }; /* extern "C" */ 54 55 TBool isCursorVisible = ETrue; 56 57 int EPOC_HandleWsEvent(_THIS, const TWsEvent& aWsEvent) 58 { 59 int posted = 0; 60 SDL_keysym keysym; 61 62 63 switch (aWsEvent.Type()) { 64 65 case EEventPointer: /* Mouse pointer events */ 66 { 67 const TPointerEvent* pointerEvent = aWsEvent.Pointer(); 68 TPoint mousePos = pointerEvent->iPosition; 69 70 //SDL_TRACE1("SDL: EPOC_HandleWsEvent, pointerEvent->iType=%d", pointerEvent->iType); //!! 71 72 if (Private->EPOC_ShrinkedHeight) { 73 mousePos.iY <<= 1; /* Scale y coordinate to shrinked screen height */ 74 } 75 posted += SDL_PrivateMouseMotion(0, 0, mousePos.iX, mousePos.iY); /* Absolute position on screen */ 76 if (pointerEvent->iType==TPointerEvent::EButton1Down) { 77 posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT, 0, 0); 78 } 79 else if (pointerEvent->iType==TPointerEvent::EButton1Up) { 80 posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0); 81 } 82 else if (pointerEvent->iType==TPointerEvent::EButton2Down) { 83 posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_RIGHT, 0, 0); 84 } 85 else if (pointerEvent->iType==TPointerEvent::EButton2Up) { 86 posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_RIGHT, 0, 0); 87 } 88 //!!posted += SDL_PrivateKeyboard(SDL_PRESSED, TranslateKey(aWsEvent.Key()->iScanCode, &keysym)); 89 break; 90 } 91 92 case EEventKeyDown: /* Key events */ 93 { 94 (void*)TranslateKey(aWsEvent.Key()->iScanCode, &keysym); 95 96 /* Special handling */ 97 switch((int)keysym.sym) { 98 case SDLK_CAPSLOCK: 99 if (!isCursorVisible) { 100 /* Enable virtual cursor */ 101 HAL::Set(HAL::EMouseState, HAL::EMouseState_Visible); 102 } 103 else { 104 /* Disable virtual cursor */ 105 HAL::Set(HAL::EMouseState, HAL::EMouseState_Invisible); 106 } 107 isCursorVisible = !isCursorVisible; 108 break; 109 } 110 111 posted += SDL_PrivateKeyboard(SDL_PRESSED, &keysym); 112 break; 113 } 114 115 case EEventKeyUp: /* Key events */ 116 { 117 posted += SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(aWsEvent.Key()->iScanCode, &keysym)); 118 break; 119 } 120 121 case EEventFocusGained: /* SDL window got focus */ 122 { 123 //Private->EPOC_IsWindowFocused = ETrue; 124 /* Draw window background and screen buffer */ 125 RedrawWindowL(_this); 126 break; 127 } 128 129 case EEventFocusLost: /* SDL window lost focus */ 130 { 131 //Private->EPOC_IsWindowFocused = EFalse; 132 133 // Wait and eat events until focus is gained again 134 /* 135 while (ETrue) { 136 Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus); 137 User::WaitForRequest(Private->EPOC_WsEventStatus); 138 Private->EPOC_WsSession.GetEvent(Private->EPOC_WsEvent); 139 TInt eventType = Private->EPOC_WsEvent.Type(); 140 Private->EPOC_WsEventStatus = KRequestPending; 141 //Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus); 142 if (eventType == EEventFocusGained) { 143 RedrawWindowL(_this); 144 break; 145 } 146 } 147 */ 148 break; 149 } 150 151 case EEventModifiersChanged: 152 { 153 TModifiersChangedEvent* modEvent = aWsEvent.ModifiersChanged(); 154 TUint modstate = KMOD_NONE; 155 if (modEvent->iModifiers == EModifierLeftShift) 156 modstate |= KMOD_LSHIFT; 157 if (modEvent->iModifiers == EModifierRightShift) 158 modstate |= KMOD_RSHIFT; 159 if (modEvent->iModifiers == EModifierLeftCtrl) 160 modstate |= KMOD_LCTRL; 161 if (modEvent->iModifiers == EModifierRightCtrl) 162 modstate |= KMOD_RCTRL; 163 if (modEvent->iModifiers == EModifierLeftAlt) 164 modstate |= KMOD_LALT; 165 if (modEvent->iModifiers == EModifierRightAlt) 166 modstate |= KMOD_RALT; 167 if (modEvent->iModifiers == EModifierLeftFunc) 168 modstate |= KMOD_LMETA; 169 if (modEvent->iModifiers == EModifierRightFunc) 170 modstate |= KMOD_RMETA; 171 if (modEvent->iModifiers == EModifierCapsLock) 172 modstate |= KMOD_CAPS; 173 SDL_SetModState(STATIC_CAST(SDLMod,(modstate | KMOD_LSHIFT))); 174 break; 175 } 176 default: 177 break; 178 } 179 180 return posted; 181 } 182 183 extern "C" { 184 185 void EPOC_PumpEvents(_THIS) 186 { 187 int posted = 0; // !! Do we need this? 188 //Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus); 189 while (Private->EPOC_WsEventStatus != KRequestPending) { 190 191 Private->EPOC_WsSession.GetEvent(Private->EPOC_WsEvent); 192 posted = EPOC_HandleWsEvent(_this, Private->EPOC_WsEvent); 193 Private->EPOC_WsEventStatus = KRequestPending; 194 Private->EPOC_WsSession.EventReady(&Private->EPOC_WsEventStatus); 195 } 196 } 197 198 199 void EPOC_InitOSKeymap(_THIS) 200 { 201 int i; 202 203 /* Initialize the key translation table */ 204 for ( i=0; i<SDL_TABLESIZE(keymap); ++i ) 205 keymap[i] = SDLK_UNKNOWN; 206 207 208 /* Numbers */ 209 for ( i = 0; i<32; ++i ){ 210 keymap[' ' + i] = (SDLKey)(SDLK_SPACE+i); 211 } 212 /* e.g. Alphabet keys */ 213 for ( i = 0; i<32; ++i ){ 214 keymap['A' + i] = (SDLKey)(SDLK_a+i); 215 } 216 217 keymap[EStdKeyBackspace] = SDLK_BACKSPACE; 218 keymap[EStdKeyTab] = SDLK_TAB; 219 keymap[EStdKeyEnter] = SDLK_RETURN; 220 keymap[EStdKeyEscape] = SDLK_ESCAPE; 221 keymap[EStdKeySpace] = SDLK_SPACE; 222 keymap[EStdKeyPause] = SDLK_PAUSE; 223 keymap[EStdKeyHome] = SDLK_HOME; 224 keymap[EStdKeyEnd] = SDLK_END; 225 keymap[EStdKeyPageUp] = SDLK_PAGEUP; 226 keymap[EStdKeyPageDown] = SDLK_PAGEDOWN; 227 keymap[EStdKeyDelete] = SDLK_DELETE; 228 keymap[EStdKeyUpArrow] = SDLK_UP; 229 keymap[EStdKeyDownArrow] = SDLK_DOWN; 230 keymap[EStdKeyLeftArrow] = SDLK_LEFT; 231 keymap[EStdKeyRightArrow] = SDLK_RIGHT; 232 keymap[EStdKeyCapsLock] = SDLK_CAPSLOCK; 233 keymap[EStdKeyLeftShift] = SDLK_LSHIFT; 234 keymap[EStdKeyRightShift] = SDLK_RSHIFT; 235 keymap[EStdKeyLeftAlt] = SDLK_LALT; 236 keymap[EStdKeyRightAlt] = SDLK_RALT; 237 keymap[EStdKeyLeftCtrl] = SDLK_LCTRL; 238 keymap[EStdKeyRightCtrl] = SDLK_RCTRL; 239 keymap[EStdKeyLeftFunc] = SDLK_LMETA; 240 keymap[EStdKeyRightFunc] = SDLK_RMETA; 241 keymap[EStdKeyInsert] = SDLK_INSERT; 242 keymap[EStdKeyComma] = SDLK_COMMA; 243 keymap[EStdKeyFullStop] = SDLK_PERIOD; 244 keymap[EStdKeyForwardSlash] = SDLK_SLASH; 245 keymap[EStdKeyBackSlash] = SDLK_BACKSLASH; 246 keymap[EStdKeySemiColon] = SDLK_SEMICOLON; 247 keymap[EStdKeySingleQuote] = SDLK_QUOTE; 248 keymap[EStdKeyHash] = SDLK_HASH; 249 keymap[EStdKeySquareBracketLeft] = SDLK_LEFTBRACKET; 250 keymap[EStdKeySquareBracketRight] = SDLK_RIGHTBRACKET; 251 keymap[EStdKeyMinus] = SDLK_MINUS; 252 keymap[EStdKeyEquals] = SDLK_EQUALS; 253 254 keymap[EStdKeyF1] = SDLK_F1; /* chr + q */ 255 keymap[EStdKeyF2] = SDLK_F2; /* chr + w */ 256 keymap[EStdKeyF3] = SDLK_F3; /* chr + e */ 257 keymap[EStdKeyF4] = SDLK_F4; /* chr + r */ 258 keymap[EStdKeyF5] = SDLK_F5; /* chr + t */ 259 keymap[EStdKeyF6] = SDLK_F6; /* chr + y */ 260 keymap[EStdKeyF7] = SDLK_F7; /* chr + i */ 261 keymap[EStdKeyF8] = SDLK_F8; /* chr + o */ 262 263 keymap[EStdKeyF9] = SDLK_F9; /* chr + a */ 264 keymap[EStdKeyF10] = SDLK_F10; /* chr + s */ 265 keymap[EStdKeyF11] = SDLK_F11; /* chr + d */ 266 keymap[EStdKeyF12] = SDLK_F12; /* chr + f */ 267 268 /* !!TODO 269 EStdKeyNumLock=0x1b, 270 EStdKeyScrollLock=0x1c, 271 272 EStdKeyNkpForwardSlash=0x84, 273 EStdKeyNkpAsterisk=0x85, 274 EStdKeyNkpMinus=0x86, 275 EStdKeyNkpPlus=0x87, 276 EStdKeyNkpEnter=0x88, 277 EStdKeyNkp1=0x89, 278 EStdKeyNkp2=0x8a, 279 EStdKeyNkp3=0x8b, 280 EStdKeyNkp4=0x8c, 281 EStdKeyNkp5=0x8d, 282 EStdKeyNkp6=0x8e, 283 EStdKeyNkp7=0x8f, 284 EStdKeyNkp8=0x90, 285 EStdKeyNkp9=0x91, 286 EStdKeyNkp0=0x92, 287 EStdKeyNkpFullStop=0x93, 288 EStdKeyMenu=0x94, 289 EStdKeyBacklightOn=0x95, 290 EStdKeyBacklightOff=0x96, 291 EStdKeyBacklightToggle=0x97, 292 EStdKeyIncContrast=0x98, 293 EStdKeyDecContrast=0x99, 294 EStdKeySliderDown=0x9a, 295 EStdKeySliderUp=0x9b, 296 EStdKeyDictaphonePlay=0x9c, 297 EStdKeyDictaphoneStop=0x9d, 298 EStdKeyDictaphoneRecord=0x9e, 299 EStdKeyHelp=0x9f, 300 EStdKeyOff=0xa0, 301 EStdKeyDial=0xa1, 302 EStdKeyIncVolume=0xa2, 303 EStdKeyDecVolume=0xa3, 304 EStdKeyDevice0=0xa4, 305 EStdKeyDevice1=0xa5, 306 EStdKeyDevice2=0xa6, 307 EStdKeyDevice3=0xa7, 308 EStdKeyDevice4=0xa8, 309 EStdKeyDevice5=0xa9, 310 EStdKeyDevice6=0xaa, 311 EStdKeyDevice7=0xab, 312 EStdKeyDevice8=0xac, 313 EStdKeyDevice9=0xad, 314 EStdKeyDeviceA=0xae, 315 EStdKeyDeviceB=0xaf, 316 EStdKeyDeviceC=0xb0, 317 EStdKeyDeviceD=0xb1, 318 EStdKeyDeviceE=0xb2, 319 EStdKeyDeviceF=0xb3, 320 EStdKeyApplication0=0xb4, 321 EStdKeyApplication1=0xb5, 322 EStdKeyApplication2=0xb6, 323 EStdKeyApplication3=0xb7, 324 EStdKeyApplication4=0xb8, 325 EStdKeyApplication5=0xb9, 326 EStdKeyApplication6=0xba, 327 EStdKeyApplication7=0xbb, 328 EStdKeyApplication8=0xbc, 329 EStdKeyApplication9=0xbd, 330 EStdKeyApplicationA=0xbe, 331 EStdKeyApplicationB=0xbf, 332 EStdKeyApplicationC=0xc0, 333 EStdKeyApplicationD=0xc1, 334 EStdKeyApplicationE=0xc2, 335 EStdKeyApplicationF=0xc3, 336 EStdKeyYes=0xc4, 337 EStdKeyNo=0xc5, 338 EStdKeyIncBrightness=0xc6, 339 EStdKeyDecBrightness=0xc7, 340 EStdKeyCaseOpen=0xc8, 341 EStdKeyCaseClose=0xc9 342 */ 343 344 } 345 346 347 348 static SDL_keysym *TranslateKey(int scancode, SDL_keysym *keysym) 349 { 350 char debug[256]; 351 //SDL_TRACE1("SDL: TranslateKey, scancode=%d", scancode); //!! 352 353 /* Set the keysym information */ 354 355 keysym->scancode = scancode; 356 357 if ((scancode >= MAX_SCANCODE) && 358 ((scancode - ENonCharacterKeyBase + 0x0081) >= MAX_SCANCODE)) { 359 SDL_SetError("Too big scancode"); 360 keysym->scancode = SDLK_UNKNOWN; 361 keysym->mod = KMOD_NONE; 362 return keysym; 363 } 364 365 keysym->mod = SDL_GetModState(); //!!Is this right?? 366 367 /* Handle function keys: F1, F2, F3 ... */ 368 if (keysym->mod & KMOD_META) { 369 if (scancode >= 'A' && scancode < ('A' + 24)) { /* first 32 alphapet keys */ 370 switch(scancode) { 371 case 'Q': scancode = EStdKeyF1; break; 372 case 'W': scancode = EStdKeyF2; break; 373 case 'E': scancode = EStdKeyF3; break; 374 case 'R': scancode = EStdKeyF4; break; 375 case 'T': scancode = EStdKeyF5; break; 376 case 'Y': scancode = EStdKeyF6; break; 377 case 'U': scancode = EStdKeyF7; break; 378 case 'I': scancode = EStdKeyF8; break; 379 case 'A': scancode = EStdKeyF9; break; 380 case 'S': scancode = EStdKeyF10; break; 381 case 'D': scancode = EStdKeyF11; break; 382 case 'F': scancode = EStdKeyF12; break; 383 } 384 keysym->sym = keymap[scancode]; 385 } 386 } 387 388 if (scancode >= ENonCharacterKeyBase) { 389 // Non character keys 390 keysym->sym = keymap[scancode - 391 ENonCharacterKeyBase + 0x0081]; // !!hard coded 392 } else { 393 keysym->sym = keymap[scancode]; 394 } 395 396 397 /* If UNICODE is on, get the UNICODE value for the key */ 398 keysym->unicode = 0; 399 400 #if 0 // !!TODO:unicode 401 402 if ( SDL_TranslateUNICODE ) 403 { 404 /* Populate the unicode field with the ASCII value */ 405 keysym->unicode = scancode; 406 } 407 #endif 408 409 //!! 410 //sprintf(debug, "SDL: TranslateKey: keysym->scancode=%d, keysym->sym=%d, keysym->mod=%d", 411 // keysym->scancode, keysym->sym, keysym->mod); 412 //SDL_TRACE(debug); //!! 413 414 return(keysym); 415 } 416 417 }; /* extern "C" */ 418 419 420