1 #include "epoc_sdl.h" 2 3 #include <stdio.h> 4 #undef NULL 5 extern "C" { 6 //#define DEBUG_TRACE_ENABLED 7 #include "SDL_error.h" 8 #include "SDL_video.h" 9 #include "SDL_keysym.h" 10 #include "SDL_keyboard.h" 11 #include "SDL_events_c.h" 12 #include "SDL_timer.h" 13 } /* extern "C" */ 14 15 #include "SDL_epocvideo.h" 16 #include "SDL_epocevents_c.h" 17 18 #include "sdlepocapi.h" 19 20 #include <eikenv.h> 21 22 #include<bautils.h> 23 24 25 extern "C" 26 { 27 static SDL_keysym *TranslateKey(_THIS, int scancode, SDL_keysym *keysym); 28 } 29 30 //extern "C" { 31 /* The translation tables from a console scancode to a SDL keysym */ 32 static SDLKey keymap[MAX_SCANCODE]; 33 static SDL_keysym *TranslateKey(_THIS, int scancode, SDL_keysym *keysym); 34 void DisableKeyBlocking(_THIS); 35 //} /* extern "C" */ 36 37 SDLKey* KeyMap() 38 { 39 return keymap; 40 } 41 42 TBool isCursorVisible = EFalse; 43 44 void ResetKeyMap() 45 { 46 int i; 47 48 /* Initialize the key translation table */ 49 for ( i=0; i<SDL_TABLESIZE(keymap); ++i ) 50 keymap[i] = SDLK_UNKNOWN; 51 52 53 /* Numbers */ 54 for ( i = 0; i<32; ++i ){ 55 keymap[' ' + i] = (SDLKey)(SDLK_SPACE+i); 56 } 57 /* e.g. Alphabet keys */ 58 for ( i = 0; i<32; ++i ){ 59 keymap['A' + i] = (SDLKey)(SDLK_a+i); 60 } 61 62 keymap[EStdKeyBackspace] = SDLK_BACKSPACE; 63 keymap[EStdKeyTab] = SDLK_TAB; 64 keymap[EStdKeyEnter] = SDLK_RETURN; 65 keymap[EStdKeyEscape] = SDLK_ESCAPE; 66 keymap[EStdKeySpace] = SDLK_SPACE; 67 keymap[EStdKeyPause] = SDLK_PAUSE; 68 keymap[EStdKeyHome] = SDLK_HOME; 69 keymap[EStdKeyEnd] = SDLK_END; 70 keymap[EStdKeyPageUp] = SDLK_PAGEUP; 71 keymap[EStdKeyPageDown] = SDLK_PAGEDOWN; 72 keymap[EStdKeyDelete] = SDLK_DELETE; 73 keymap[EStdKeyUpArrow] = SDLK_UP; 74 keymap[EStdKeyDownArrow] = SDLK_DOWN; 75 keymap[EStdKeyLeftArrow] = SDLK_LEFT; 76 keymap[EStdKeyRightArrow] = SDLK_RIGHT; 77 keymap[EStdKeyCapsLock] = SDLK_CAPSLOCK; 78 keymap[EStdKeyLeftShift] = SDLK_LSHIFT; 79 keymap[EStdKeyRightShift] = SDLK_RSHIFT; 80 keymap[EStdKeyLeftAlt] = SDLK_LALT; 81 keymap[EStdKeyRightAlt] = SDLK_RALT; 82 keymap[EStdKeyLeftCtrl] = SDLK_LCTRL; 83 keymap[EStdKeyRightCtrl] = SDLK_RCTRL; 84 keymap[EStdKeyLeftFunc] = SDLK_LMETA; 85 keymap[EStdKeyRightFunc] = SDLK_RMETA; 86 keymap[EStdKeyInsert] = SDLK_INSERT; 87 keymap[EStdKeyComma] = SDLK_COMMA; 88 keymap[EStdKeyFullStop] = SDLK_PERIOD; 89 keymap[EStdKeyForwardSlash] = SDLK_SLASH; 90 keymap[EStdKeyBackSlash] = SDLK_BACKSLASH; 91 keymap[EStdKeySemiColon] = SDLK_SEMICOLON; 92 keymap[EStdKeySingleQuote] = SDLK_QUOTE; 93 keymap[EStdKeyHash] = SDLK_HASH; 94 keymap[EStdKeySquareBracketLeft] = SDLK_LEFTBRACKET; 95 keymap[EStdKeySquareBracketRight] = SDLK_RIGHTBRACKET; 96 keymap[EStdKeyMinus] = SDLK_MINUS; 97 keymap[EStdKeyEquals] = SDLK_EQUALS; 98 99 keymap[EStdKeyF1] = SDLK_F1; 100 keymap[EStdKeyF2] = SDLK_F2; 101 keymap[EStdKeyF3] = SDLK_F3; 102 keymap[EStdKeyF4] = SDLK_F4; 103 keymap[EStdKeyF5] = SDLK_F5; 104 keymap[EStdKeyF6] = SDLK_F6; 105 keymap[EStdKeyF7] = SDLK_F7; 106 keymap[EStdKeyF8] = SDLK_F8; 107 108 keymap[EStdKeyF9] = SDLK_F9; 109 keymap[EStdKeyF10] = SDLK_F10; 110 keymap[EStdKeyF11] = SDLK_F11; 111 keymap[EStdKeyF12] = SDLK_F12; 112 113 114 keymap[EStdKeyXXX] = SDLK_RETURN; /* "fire" key */ 115 116 keymap[EStdKeyDevice3] = SDLK_RETURN; /* "fire" key */ 117 keymap[EStdKeyNkpAsterisk] = SDLK_ASTERISK; 118 keymap[EStdKeyYes] = SDLK_HOME; /* "call" key */ 119 keymap[EStdKeyNo] = SDLK_END; /* "end call" key */ 120 keymap[EStdKeyDevice0] = SDLK_SPACE; /* right menu key */ 121 keymap[EStdKeyDevice1] = SDLK_ESCAPE; /* left menu key */ 122 keymap[EStdKeyDevice2] = SDLK_POWER; /* power key */ 123 124 keymap[EStdKeyMenu] = SDLK_MENU; // menu key 125 keymap[EStdKeyDevice6] = SDLK_LEFT; // Rocker (joystick) left 126 keymap[EStdKeyDevice7] = SDLK_RIGHT; // Rocker (joystick) right 127 keymap[EStdKeyDevice8] = SDLK_UP; // Rocker (joystick) up 128 keymap[EStdKeyDevice9] = SDLK_DOWN; // Rocker (joystick) down 129 keymap[EStdKeyLeftFunc] = SDLK_LALT; //chr? 130 keymap[EStdKeyRightFunc] = SDLK_RALT; 131 keymap[EStdKeyDeviceA] = SDLK_RETURN; /* "fire" key */ 132 133 134 135 136 137 /////////////////////////////////////////////////////////// 138 /* 139 RFs fs; 140 if(KErrNone == fs.Connect()) 141 { 142 RArray<TInt> array; 143 TRAPD(err, ReadL(fs, array)); 144 if(err == KErrNone && array.Count() > 0) 145 { 146 147 SDLKey temp[MAX_SCANCODE]; 148 Mem::Copy(temp, keymap, MAX_SCANCODE * sizeof(SDLKey)); 149 150 for(TInt k = 0; k < array.Count(); k+= 2) 151 { 152 const TInt oldval = array[k]; 153 const TInt newval = array[k + 1]; 154 if(oldval >= 0 && oldval < MAX_SCANCODE && newval >= 0 && newval < MAX_SCANCODE) 155 { 156 keymap[oldval] = temp[newval]; 157 } 158 } 159 } 160 array.Close(); 161 } 162 163 fs.Close();*/ 164 /////////////////////////////////////////////////////////// 165 166 167 keymap[EStdKeyNumLock] = SDLK_NUMLOCK; 168 keymap[EStdKeyScrollLock] = SDLK_SCROLLOCK; 169 170 keymap[EStdKeyNkpForwardSlash] = SDLK_KP_DIVIDE; 171 keymap[EStdKeyNkpAsterisk] = SDLK_KP_MULTIPLY; 172 keymap[EStdKeyNkpMinus] = SDLK_KP_MINUS; 173 keymap[EStdKeyNkpPlus] = SDLK_KP_PLUS; 174 keymap[EStdKeyNkpEnter] = SDLK_KP_ENTER; 175 keymap[EStdKeyNkp1] = SDLK_KP1; 176 keymap[EStdKeyNkp2] = SDLK_KP2; 177 keymap[EStdKeyNkp3] = SDLK_KP3; 178 keymap[EStdKeyNkp4] = SDLK_KP4; 179 keymap[EStdKeyNkp5] = SDLK_KP5; 180 keymap[EStdKeyNkp6] = SDLK_KP6; 181 keymap[EStdKeyNkp7] = SDLK_KP7; 182 keymap[EStdKeyNkp8] = SDLK_KP8; 183 keymap[EStdKeyNkp9] = SDLK_KP9; 184 keymap[EStdKeyNkp0] = SDLK_KP0; 185 keymap[EStdKeyNkpFullStop] = SDLK_KP_PERIOD; 186 /* 187 keymap[EStdKeyMenu] = SDLK_MENU; should be, but not yet 188 keymap[EStdKeyBacklightOn] = 189 keymap[EStdKeyBacklightOff] = 190 keymap[EStdKeyBacklightToggle] = 191 keymap[EStdKeyIncContrast] = 192 keymap[EStdKeyDecContrast] = 193 keymap[EStdKeySliderDown] = 194 keymap[EStdKeySliderUp] = 195 keymap[EStdKeyDictaphonePlay] = 196 keymap[EStdKeyDictaphoneStop] = 197 keymap[EStdKeyDictaphoneRecord] = 198 keymap[EStdKeyHelp] = 199 keymap[EStdKeyOff] = 200 keymap[EStdKeyDial] = 201 keymap[EStdKeyIncVolume] = 202 keymap[EStdKeyDecVolume] = 203 keymap[EStdKeyDevice0] = 204 keymap[EStdKeyDevice1] = 205 keymap[EStdKeyDevice2] = 206 keymap[EStdKeyDevice3] = 207 keymap[EStdKeyDevice4] = 208 keymap[EStdKeyDevice5] = 209 keymap[EStdKeyDevice6] = 210 keymap[EStdKeyDevice7] = 211 keymap[EStdKeyDevice8] = 212 keymap[EStdKeyDevice9] = 213 keymap[EStdKeyDeviceA] = 214 keymap[EStdKeyDeviceB] = 215 keymap[EStdKeyDeviceC] = 216 keymap[EStdKeyDeviceD] = 217 keymap[EStdKeyDeviceE] = 218 keymap[EStdKeyDeviceF] = 219 keymap[EStdKeyApplication0] = 220 keymap[EStdKeyApplication1] = 221 keymap[EStdKeyApplication2] = 222 keymap[EStdKeyApplication3] = 223 keymap[EStdKeyApplication4] = 224 keymap[EStdKeyApplication5] = 225 keymap[EStdKeyApplication6] = 226 keymap[EStdKeyApplication7] = 227 keymap[EStdKeyApplication8] = 228 keymap[EStdKeyApplication9] = 229 keymap[EStdKeyApplicationA] = 230 keymap[EStdKeyApplicationB] = 231 keymap[EStdKeyApplicationC] = 232 keymap[EStdKeyApplicationD] = 233 keymap[EStdKeyApplicationE] = 234 keymap[EStdKeyApplicationF] = 235 keymap[EStdKeyYes] = 236 keymap[EStdKeyNo] = 237 keymap[EStdKeyIncBrightness] = 238 keymap[EStdKeyDecBrightness] = 239 keymap[EStdKeyCaseOpen] = 240 keymap[EStdKeyCaseClose] = */ 241 242 243 244 } 245 246 247 int EPOC_HandleWsEvent(_THIS, const TWsEvent& aWsEvent) 248 { 249 int posted = 0; 250 SDL_keysym keysym; 251 252 // SDL_TRACE1("hws %d", aWsEvent.Type()); 253 254 switch (aWsEvent.Type()) 255 { 256 case EEventPointer: /* Mouse pointer events */ 257 { 258 /* const TPointerCursorMode mode = EpocSdlEnv::PointerMode(); 259 260 261 if(mode == EPointerCursorNone) 262 { 263 return 0; //TODO: Find out why events are get despite of cursor should be off 264 } 265 */ 266 const TPointerEvent* pointerEvent = aWsEvent.Pointer(); 267 const TPoint mousePos = EpocSdlEnv::WindowCoordinates(pointerEvent->iPosition); 268 269 /*!! TODO Pointer do not yet work properly 270 //SDL_TRACE1("SDL: EPOC_HandleWsEvent, pointerEvent->iType=%d", pointerEvent->iType); //!! 271 272 if (Private->EPOC_ShrinkedHeight) { 273 mousePos.iY <<= 1; // Scale y coordinate to shrinked screen height 274 } 275 if (Private->EPOC_ShrinkedWidth) { 276 mousePos.iX <<= 1; // Scale x coordinate to shrinked screen width 277 } 278 */ 279 280 posted += SDL_PrivateMouseMotion(0, 0, mousePos.iX, mousePos.iY); /* Absolute position on screen */ 281 282 switch (pointerEvent->iType) 283 { 284 case TPointerEvent::EButton1Down: 285 posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT, 0, 0); 286 break; 287 case TPointerEvent::EButton1Up: 288 posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0); 289 break; 290 case TPointerEvent::EButton2Down: 291 posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_RIGHT, 0, 0); 292 break; 293 case TPointerEvent::EButton2Up: 294 posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_RIGHT, 0, 0); 295 break; 296 case TPointerEvent::EButton3Down: 297 posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_MIDDLE, 0, 0); 298 break; 299 case TPointerEvent::EButton3Up: 300 posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_MIDDLE, 0, 0); 301 break; 302 } // switch 303 break; 304 } 305 306 case EEventKeyDown: /* Key events */ 307 { 308 #ifdef SYMBIAN_CRYSTAL 309 // special case: 9300/9500 rocker down, simulate left mouse button 310 if (aWsEvent.Key()->iScanCode == EStdKeyDeviceA) 311 { 312 const TPointerCursorMode mode = Private->EPOC_WsSession.PointerCursorMode(); 313 if(mode != EPointerCursorNone) 314 posted += SDL_PrivateMouseButton(SDL_PRESSED, SDL_BUTTON_LEFT, 0, 0); 315 } 316 #endif 317 (void*)TranslateKey(_this, aWsEvent.Key()->iScanCode, &keysym); 318 319 #ifndef DISABLE_JOYSTICK 320 /* Special handling */ 321 switch((int)keysym.sym) { 322 case SDLK_CAPSLOCK: 323 if (!isCursorVisible) { 324 /* Enable virtual cursor */ 325 HAL::Set(HAL::EMouseState, HAL::EMouseState_Visible); 326 } 327 else { 328 /* Disable virtual cursor */ 329 HAL::Set(HAL::EMouseState, HAL::EMouseState_Invisible); 330 } 331 isCursorVisible = !isCursorVisible; 332 break; 333 } 334 #endif 335 posted += SDL_PrivateKeyboard(SDL_PRESSED, &keysym); 336 break; 337 } 338 339 case EEventKeyUp: /* Key events */ 340 { 341 #ifdef SYMBIAN_CRYSTAL 342 // special case: 9300/9500 rocker up, simulate left mouse button 343 if (aWsEvent.Key()->iScanCode == EStdKeyDeviceA) 344 { 345 posted += SDL_PrivateMouseButton(SDL_RELEASED, SDL_BUTTON_LEFT, 0, 0); 346 } 347 #endif 348 posted += SDL_PrivateKeyboard(SDL_RELEASED, TranslateKey(_this, aWsEvent.Key()->iScanCode, &keysym)); 349 break; 350 } 351 352 case EEventFocusGained: /* SDL window got focus */ 353 { 354 Private->iIsWindowFocused = ETrue; 355 posted += SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS); 356 /* Draw window background and screen buffer */ 357 DisableKeyBlocking(_this); //Markus: guess why:-) 358 359 //RedrawWindowL(_this); 360 break; 361 } 362 363 case EEventFocusLost: /* SDL window lost focus */ 364 { 365 366 Private->iIsWindowFocused = EFalse; 367 368 posted += SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS); 369 370 371 break; 372 } 373 374 case EEventModifiersChanged: 375 { 376 TModifiersChangedEvent* modEvent = aWsEvent.ModifiersChanged(); 377 TUint modstate = KMOD_NONE; 378 if (modEvent->iModifiers == EModifierLeftShift) 379 modstate |= KMOD_LSHIFT; 380 if (modEvent->iModifiers == EModifierRightShift) 381 modstate |= KMOD_RSHIFT; 382 if (modEvent->iModifiers == EModifierLeftCtrl) 383 modstate |= KMOD_LCTRL; 384 if (modEvent->iModifiers == EModifierRightCtrl) 385 modstate |= KMOD_RCTRL; 386 if (modEvent->iModifiers == EModifierLeftAlt) 387 modstate |= KMOD_LALT; 388 if (modEvent->iModifiers == EModifierRightAlt) 389 modstate |= KMOD_RALT; 390 if (modEvent->iModifiers == EModifierLeftFunc) 391 modstate |= KMOD_LMETA; 392 if (modEvent->iModifiers == EModifierRightFunc) 393 modstate |= KMOD_RMETA; 394 if (modEvent->iModifiers == EModifierCapsLock) 395 modstate |= KMOD_CAPS; 396 SDL_SetModState(STATIC_CAST(SDLMod,(modstate | KMOD_LSHIFT))); 397 break; 398 } 399 case EEventScreenDeviceChanged: 400 { 401 EpocSdlEnv::WaitDeviceChange(); 402 } 403 break; 404 default: 405 break; 406 } 407 408 return posted; 409 } 410 411 extern "C" { 412 413 void EPOC_PumpEvents(_THIS) 414 { 415 MEventQueue& events = EpocSdlEnv::EventQueue(); 416 while(events.HasData()) 417 { 418 events.Lock(); 419 420 //there have to be a copy, so we can release 421 //lock immediately. HandleWsEvent may cause 422 //deadlock otherwise. 423 424 const TWsEvent event = events.Shift(); 425 events.Unlock(); 426 // const TWsEvent& event = events.Top(); 427 EPOC_HandleWsEvent(_this, event); 428 // events.Shift(); 429 } 430 } 431 432 433 434 void EPOC_InitOSKeymap(_THIS) 435 { 436 ResetKeyMap(); 437 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventKeyMapInit ,0); 438 } 439 440 static SDL_keysym *TranslateKey(_THIS, int scancode, SDL_keysym *keysym) 441 { 442 // char debug[256]; 443 //SDL_TRACE1("SDL: TranslateKey, scancode=%d", scancode); //!! 444 445 /* Set the keysym information */ 446 447 keysym->scancode = scancode; 448 449 if ((scancode >= MAX_SCANCODE) && 450 ((scancode - ENonCharacterKeyBase + 0x0081) >= MAX_SCANCODE)) { 451 SDL_SetError("Too big scancode"); 452 keysym->scancode = SDLK_UNKNOWN; 453 keysym->mod = KMOD_NONE; 454 return keysym; 455 } 456 457 keysym->mod = SDL_GetModState(); 458 459 /* Handle function keys: F1, F2, F3 ... */ 460 if (keysym->mod & KMOD_META) { 461 if (scancode >= 'A' && scancode < ('A' + 24)) { /* first 32 alphabet keys */ 462 switch(scancode) { 463 case 'Q': scancode = EStdKeyF1; break; 464 case 'W': scancode = EStdKeyF2; break; 465 case 'E': scancode = EStdKeyF3; break; 466 case 'R': scancode = EStdKeyF4; break; 467 case 'T': scancode = EStdKeyF5; break; 468 case 'Y': scancode = EStdKeyF6; break; 469 case 'U': scancode = EStdKeyF7; break; 470 case 'I': scancode = EStdKeyF8; break; 471 case 'A': scancode = EStdKeyF9; break; 472 case 'S': scancode = EStdKeyF10; break; 473 case 'D': scancode = EStdKeyF11; break; 474 case 'F': scancode = EStdKeyF12; break; 475 } 476 keysym->sym = keymap[scancode]; 477 } 478 } 479 480 if (scancode >= ENonCharacterKeyBase) { 481 // Non character keys 482 keysym->sym = keymap[scancode - 483 ENonCharacterKeyBase + 0x0081]; // !!hard coded 484 } else { 485 keysym->sym = keymap[scancode]; 486 } 487 488 /* Remap the arrow keys if the device is rotated */ 489 /* 490 if (Private->EPOC_ScreenOrientation == CFbsBitGc::EGraphicsOrientationRotated270) { 491 switch(keysym->sym) { 492 case SDLK_UP: keysym->sym = SDLK_LEFT; break; 493 case SDLK_DOWN: keysym->sym = SDLK_RIGHT; break; 494 case SDLK_LEFT: keysym->sym = SDLK_DOWN; break; 495 case SDLK_RIGHT:keysym->sym = SDLK_UP; break; 496 } 497 } 498 */ 499 /* If UNICODE is on, get the UNICODE value for the key */ 500 keysym->unicode = 0; 501 502 #if 0 // !!TODO:unicode 503 504 if ( SDL_TranslateUNICODE ) 505 { 506 /* Populate the unicode field with the ASCII value */ 507 keysym->unicode = scancode; 508 } 509 #endif 510 511 //!! 512 //sprintf(debug, "SDL: TranslateKey: keysym->scancode=%d, keysym->sym=%d, keysym->mod=%d", 513 // keysym->scancode, keysym->sym, keysym->mod); 514 //SDL_TRACE(debug); //!! 515 516 return(keysym); 517 } 518 519 } /* extern "C" */ 520 521 522