| 1 | /*******************************************************************\r |
| 2 | *\r |
| 3 | * File: App.cpp\r |
| 4 | *\r |
| 5 | * Author: Peter van Sebille (peter@yipton.net)\r |
| 6 | *\r |
| 7 | * Modified/adapted for picodriveN by notaz, 2006\r |
| 8 | *\r |
| 9 | * (c) Copyright 2006, notaz\r |
| 10 | * (c) Copyright 2002, Peter van Sebille\r |
| 11 | * All Rights Reserved\r |
| 12 | *\r |
| 13 | *******************************************************************/\r |
| 14 | \r |
| 15 | #include "app.h"\r |
| 16 | // #include "picodriven.mbg" // bitmap identifiers\r |
| 17 | #include "picodriven.rsg"\r |
| 18 | #include <eikenv.h>\r |
| 19 | #include <qbtselectdlg.h>\r |
| 20 | //#include <gulutil.h>\r |
| 21 | //#include <bautils.h>\r |
| 22 | #include <eikmenub.h> // CEikMenuBar\r |
| 23 | #include <apgtask.h> // TApaSystemEvent\r |
| 24 | \r |
| 25 | #include "Dialogs.h"\r |
| 26 | \r |
| 27 | \r |
| 28 | CApaDocument* CPicolApplication::CreateDocumentL()\r |
| 29 | {\r |
| 30 | return new (ELeave) CPicolDocument(*this);\r |
| 31 | }\r |
| 32 | \r |
| 33 | \r |
| 34 | CPicolDocument::CPicolDocument(CEikApplication& aApp)\r |
| 35 | : CEikDocument(aApp)\r |
| 36 | {\r |
| 37 | }\r |
| 38 | \r |
| 39 | CPicolDocument::~CPicolDocument()\r |
| 40 | {\r |
| 41 | }\r |
| 42 | \r |
| 43 | CEikAppUi* CPicolDocument::CreateAppUiL()\r |
| 44 | {\r |
| 45 | return new(ELeave) CPicolAppUi;\r |
| 46 | }\r |
| 47 | \r |
| 48 | \r |
| 49 | ////////////////////////////////////////////////////////////////\r |
| 50 | //\r |
| 51 | // class CPicolAppUi\r |
| 52 | //\r |
| 53 | ////////////////////////////////////////////////////////////////\r |
| 54 | \r |
| 55 | CPicolAppUi::CPicolAppUi()\r |
| 56 | : iCurrentLConfig(iCurrentConfig)\r |
| 57 | {\r |
| 58 | // set default config\r |
| 59 | Mem::FillZ(&iCurrentConfig, sizeof(iCurrentConfig));\r |
| 60 | iCurrentConfig.iFlags = 1; // use_sram\r |
| 61 | iCurrentConfig.iFrameskip = TPicoConfig::PFSkipAuto;\r |
| 62 | iCurrentConfig.iScreenRotation = TPicoConfig::PRot90;\r |
| 63 | }\r |
| 64 | \r |
| 65 | CPicolAppUi::~CPicolAppUi()\r |
| 66 | {\r |
| 67 | delete iAppView;\r |
| 68 | DeregisterView(*iFOView);\r |
| 69 | delete iFOView;\r |
| 70 | DeregisterView(*iFCView);\r |
| 71 | delete iFCView;\r |
| 72 | }\r |
| 73 | \r |
| 74 | void CPicolAppUi::ConstructL()\r |
| 75 | {\r |
| 76 | BaseConstructL();\r |
| 77 | \r |
| 78 | // load config\r |
| 79 | iCurrentLConfig.Load();\r |
| 80 | \r |
| 81 | iAppView=new(ELeave) CEPicolAppView;\r |
| 82 | iAppView->ConstructL(ClientRect());\r |
| 83 | \r |
| 84 | iFOView=new(ELeave) CPicolFOView(*iAppView);\r |
| 85 | RegisterViewL(*iFOView); \r |
| 86 | iFCView=new(ELeave) CPicolFCView(*iAppView);\r |
| 87 | RegisterViewL(*iFCView);\r |
| 88 | }\r |
| 89 | \r |
| 90 | \r |
| 91 | void CPicolAppUi::HandleCommandL(TInt aCommand)\r |
| 92 | {\r |
| 93 | TInt oldFrameskip = iCurrentConfig.iFrameskip;\r |
| 94 | TInt res;\r |
| 95 | \r |
| 96 | // give time for config dialog destruction\r |
| 97 | if(iAfterConfigDialog) {\r |
| 98 | iAfterConfigDialog = EFalse;\r |
| 99 | TTime now; now.UniversalTime();\r |
| 100 | if(now.MicroSecondsFrom(iConfigDialogClosed).Int64().Low() < 2500*1000)\r |
| 101 | User::After(2500*1000-now.MicroSecondsFrom(iConfigDialogClosed).Int64().Low());\r |
| 102 | }\r |
| 103 | \r |
| 104 | switch (aCommand)\r |
| 105 | {\r |
| 106 | case EEikCmdPicoLoadState:\r |
| 107 | if(iGameRunner) {\r |
| 108 | CEikonEnv::Static()->BusyMsgL(_L("Loading State"));\r |
| 109 | res = ss.SendReceive(PicoMsgLoadState, 0);\r |
| 110 | CEikonEnv::Static()->BusyMsgCancel();\r |
| 111 | // emu doesn't start to run if load fails, so we can display this\r |
| 112 | if(res) CEikonEnv::Static()->InfoMsg(_L("Load Failed"));\r |
| 113 | }\r |
| 114 | break;\r |
| 115 | \r |
| 116 | case EEikCmdPicoSaveState:\r |
| 117 | if(iGameRunner) {\r |
| 118 | CEikonEnv::Static()->BusyMsgL(_L("Saving State"));\r |
| 119 | res = ss.SendReceive(PicoMsgSaveState, 0);\r |
| 120 | CEikonEnv::Static()->BusyMsgCancel();\r |
| 121 | if(res) CEikonEnv::Static()->InfoMsg(_L("Save Failed"));\r |
| 122 | }\r |
| 123 | break;\r |
| 124 | \r |
| 125 | case EEikCmdPicoLoadROM:\r |
| 126 | DisplayOpenROMDialogL();\r |
| 127 | break;\r |
| 128 | \r |
| 129 | case EEikCmdPicoResume:\r |
| 130 | ss.Send(PicoMsgResume, 0);\r |
| 131 | iEmuRunning = ETrue;\r |
| 132 | break;\r |
| 133 | \r |
| 134 | case EEikCmdPicoReset: \r |
| 135 | ss.Send(PicoMsgReset, 0);\r |
| 136 | iEmuRunning = ETrue;\r |
| 137 | break;\r |
| 138 | \r |
| 139 | case EEikCmdPicoKeys:\r |
| 140 | if(!iGameRunner) RunGameL();\r |
| 141 | ss.Send(PicoMsgKeys, 0);\r |
| 142 | iEmuRunning = ETrue;\r |
| 143 | break;\r |
| 144 | \r |
| 145 | case EEikCmdPicoSettings:\r |
| 146 | DisplayConfigDialogL();\r |
| 147 | break;\r |
| 148 | \r |
| 149 | case EEikCmdHelpAbout: // EEikCmdPicoAbout:\r |
| 150 | DisplayAboutDialogL();\r |
| 151 | break;\r |
| 152 | \r |
| 153 | // standard identifier must be used here, TApaTask::EndTask() and probably others send it\r |
| 154 | case EEikCmdExit: // EEikCmdPicoExit:\r |
| 155 | if(iGameRunner) {\r |
| 156 | iQuitting = ETrue;\r |
| 157 | iExitForcer = CExitForcer::NewL(*this, 2000);\r |
| 158 | ss.Send(PicoMsgQuit, 0);\r |
| 159 | } else {\r |
| 160 | iCurrentLConfig.Save();\r |
| 161 | DEBUGPRINT(_L("[app] Exit (menu)"));\r |
| 162 | Exit();\r |
| 163 | }\r |
| 164 | break;\r |
| 165 | \r |
| 166 | // frameskips\r |
| 167 | case EEikCmdPicoFrameskipAuto:\r |
| 168 | iCurrentConfig.iFrameskip = TPicoConfig::PFSkipAuto;\r |
| 169 | break;\r |
| 170 | \r |
| 171 | case EEikCmdPicoFrameskip0:\r |
| 172 | iCurrentConfig.iFrameskip = TPicoConfig::PFSkip0;\r |
| 173 | break;\r |
| 174 | \r |
| 175 | case EEikCmdPicoFrameskip1:\r |
| 176 | iCurrentConfig.iFrameskip = 1;\r |
| 177 | break;\r |
| 178 | \r |
| 179 | case EEikCmdPicoFrameskip2:\r |
| 180 | iCurrentConfig.iFrameskip = 2;\r |
| 181 | break;\r |
| 182 | \r |
| 183 | case EEikCmdPicoFrameskip4:\r |
| 184 | iCurrentConfig.iFrameskip = 4;\r |
| 185 | break;\r |
| 186 | \r |
| 187 | case EEikCmdPicoFrameskip8:\r |
| 188 | iCurrentConfig.iFrameskip = 8;\r |
| 189 | break;\r |
| 190 | \r |
| 191 | case EEikCmdPicoDebugKillEmu:\r |
| 192 | if(iGameRunner) {\r |
| 193 | iExitForcer = CExitForcer::NewL(*this, 4000);\r |
| 194 | ss.Send(PicoMsgQuit, 0);\r |
| 195 | }\r |
| 196 | break;\r |
| 197 | \r |
| 198 | case EEikCmdPicoDebugInfo:\r |
| 199 | if(iGameRunner)\r |
| 200 | DisplayDebugDialogL();\r |
| 201 | break;\r |
| 202 | }\r |
| 203 | \r |
| 204 | // send config update if needed\r |
| 205 | if(iCurrentConfig.iFrameskip != oldFrameskip)\r |
| 206 | SendConfig();\r |
| 207 | }\r |
| 208 | \r |
| 209 | \r |
| 210 | void CPicolAppUi::HandleSystemEventL(const TWsEvent& aEvent)\r |
| 211 | {\r |
| 212 | TApaSystemEvent event;\r |
| 213 | event = *(TApaSystemEvent*)aEvent.EventData();\r |
| 214 | \r |
| 215 | if(event == EApaSystemEventBroughtToForeground) // application brought to foreground\r |
| 216 | {\r |
| 217 | DEBUGPRINT(_L("[app] EApaSystemEventBroughtToForeground, iEmuRunning=%i"), iEmuRunning);\r |
| 218 | // we might have missed flip open event (when moved to background),\r |
| 219 | // so make sure we have correct view active\r |
| 220 | if(iCoeEnv->ScreenDevice()->CurrentScreenMode() == EScreenModeFlipOpen) {\r |
| 221 | ActivateViewL(TVwsViewId(KUidPicolApp, KUidPicolFOView));\r |
| 222 | return;\r |
| 223 | }\r |
| 224 | }\r |
| 225 | if(event == EApaSystemEventShutdown)\r |
| 226 | {\r |
| 227 | DEBUGPRINT(_L("[app] EApaSystemEventShutdown"));\r |
| 228 | }\r |
| 229 | \r |
| 230 | CEikAppUi::HandleSystemEventL(aEvent);\r |
| 231 | }\r |
| 232 | \r |
| 233 | \r |
| 234 | // called just before the menu is shown\r |
| 235 | void CPicolAppUi::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)\r |
| 236 | {\r |
| 237 | if(aResourceId == R_APP_EMU_MENU) {\r |
| 238 | TBool dimmed = !iGameRunner || !iROMLoaded;\r |
| 239 | aMenuPane->SetItemDimmed(EEikCmdPicoLoadState, dimmed);\r |
| 240 | aMenuPane->SetItemDimmed(EEikCmdPicoSaveState, dimmed);\r |
| 241 | aMenuPane->SetItemDimmed(EEikCmdPicoResume, dimmed);\r |
| 242 | aMenuPane->SetItemDimmed(EEikCmdPicoReset, dimmed);\r |
| 243 | } else if(aResourceId == R_APP_FRAMESKIP_MENU) {\r |
| 244 | TInt itemToCheck = EEikCmdPicoFrameskipAuto;\r |
| 245 | switch(iCurrentConfig.iFrameskip) {\r |
| 246 | case 0: itemToCheck = EEikCmdPicoFrameskip0; break;\r |
| 247 | case 1: itemToCheck = EEikCmdPicoFrameskip1; break;\r |
| 248 | case 2: itemToCheck = EEikCmdPicoFrameskip2; break;\r |
| 249 | case 4: itemToCheck = EEikCmdPicoFrameskip4; break;\r |
| 250 | case 8: itemToCheck = EEikCmdPicoFrameskip8; break;\r |
| 251 | }\r |
| 252 | aMenuPane->SetItemButtonState(itemToCheck, EEikMenuItemSymbolOn);\r |
| 253 | }\r |
| 254 | }\r |
| 255 | \r |
| 256 | \r |
| 257 | void CPicolAppUi::DisplayAboutDialogL()\r |
| 258 | {\r |
| 259 | CEikDialog* dialog = new(ELeave) CAboutDialog;\r |
| 260 | TInt iButtonRes = dialog->ExecuteLD(R_DIALOG_ABOUT);\r |
| 261 | if(iButtonRes == EEikBidYes) {\r |
| 262 | CCreditsDialog *creditsDialog = new (ELeave) CCreditsDialog();\r |
| 263 | creditsDialog->iMessageResourceID = R_TBUF_CREDITS;\r |
| 264 | creditsDialog->ExecuteLD(R_DIALOG_CREDITS);\r |
| 265 | }\r |
| 266 | }\r |
| 267 | \r |
| 268 | \r |
| 269 | void CPicolAppUi::DisplayOpenROMDialogL()\r |
| 270 | {\r |
| 271 | \r |
| 272 | TFileName file(iCurrentLConfig.iLastROMFile);\r |
| 273 | CEikDialog* dialog = new(ELeave) CEikFileOpenDialog(&file);\r |
| 274 | //((CEikFileOpenDialog *)dialog)->SetRequiredExtension(&ext);\r |
| 275 | \r |
| 276 | if(dialog->ExecuteLD(R_EIK_DIALOG_FILE_OPEN) == EEikBidOk) {\r |
| 277 | CEikonEnv::Static()->BusyMsgL(_L("Loading ROM"));\r |
| 278 | \r |
| 279 | // start emu process if it is not running\r |
| 280 | if(!iGameRunner) RunGameL();\r |
| 281 | iROMLoaded = EFalse;\r |
| 282 | \r |
| 283 | TBuf8<KMaxFileName> file8;\r |
| 284 | file8.Copy(file);\r |
| 285 | TAny *p[KMaxMessageArguments];\r |
| 286 | p[0]= (TAny*)(&file8);\r |
| 287 | TInt res = ss.SendReceive(PicoMsgLoadROM, &p[0]);\r |
| 288 | \r |
| 289 | CEikonEnv::Static()->BusyMsgCancel();\r |
| 290 | \r |
| 291 | if(res == 1)\r |
| 292 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to open file."));\r |
| 293 | else if(res == 2)\r |
| 294 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to allocate memory."));\r |
| 295 | else if(res == 3)\r |
| 296 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("The file you selected is not a game ROM."));\r |
| 297 | else if(res == 4)\r |
| 298 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("No game ROMs found in zipfile."));\r |
| 299 | else if(res == 5)\r |
| 300 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed while unzipping ROM."));\r |
| 301 | else if(res < 0)\r |
| 302 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to send request to emu process."));\r |
| 303 | else {\r |
| 304 | iROMLoaded = ETrue;\r |
| 305 | iEmuRunning = ETrue;\r |
| 306 | }\r |
| 307 | \r |
| 308 | // sound errors which leave ROM loaded\r |
| 309 | if(res == 6)\r |
| 310 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to allocate sound buffer, disabled sound."));\r |
| 311 | else if(res == 7)\r |
| 312 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to start soundsystem, disabled sound."));\r |
| 313 | if(res == 6 || res == 7) iCurrentConfig.iFlags &= ~4;\r |
| 314 | \r |
| 315 | iCurrentLConfig.iLastROMFile.Copy(file);\r |
| 316 | }\r |
| 317 | }\r |
| 318 | \r |
| 319 | \r |
| 320 | void CPicolAppUi::DisplayConfigDialogL()\r |
| 321 | {\r |
| 322 | CPicoConfigDialog* configDialog = new(ELeave)CPicoConfigDialog(iCurrentConfig, iCurrentLConfig);\r |
| 323 | configDialog->ExecuteLD(R_PICO_CONFIG);\r |
| 324 | \r |
| 325 | if(iGameRunner)\r |
| 326 | SendConfig();\r |
| 327 | \r |
| 328 | iCurrentLConfig.Save();\r |
| 329 | \r |
| 330 | // configDialog seems to be actually destroyed later after returning,\r |
| 331 | // and this usually happens just after resuming game and causes emu slowdowns :/\r |
| 332 | iAfterConfigDialog = ETrue;\r |
| 333 | iConfigDialogClosed.UniversalTime();\r |
| 334 | }\r |
| 335 | \r |
| 336 | \r |
| 337 | void CPicolAppUi::DisplayDebugDialogL()\r |
| 338 | {\r |
| 339 | // first get our debug info\r |
| 340 | char dtxt[1024];\r |
| 341 | \r |
| 342 | TAny *p[KMaxMessageArguments];\r |
| 343 | TPtr8 descr((TUint8*) dtxt, sizeof(dtxt));\r |
| 344 | p[0]= (TAny*)(&descr);\r |
| 345 | ss.SendReceive(PicoMsgRetrieveDebugStr, &p[0]);\r |
| 346 | \r |
| 347 | CEikDialog* dialog = new(ELeave) CDebugDialog(dtxt);\r |
| 348 | dialog->ExecuteLD(R_DIALOG_DEBUG);\r |
| 349 | }\r |
| 350 | \r |
| 351 | \r |
| 352 | void CPicolAppUi::SendConfig()\r |
| 353 | {\r |
| 354 | // send config\r |
| 355 | if(iGameRunner) {\r |
| 356 | TAny *p[KMaxMessageArguments];\r |
| 357 | TPtrC8 descr((TUint8*) &iCurrentConfig, sizeof(iCurrentConfig));\r |
| 358 | p[0]= (TAny*)(&descr);\r |
| 359 | ss.Send(PicoMsgConfigChange, &p[0]);\r |
| 360 | }\r |
| 361 | }\r |
| 362 | \r |
| 363 | \r |
| 364 | // get config from emu proc\r |
| 365 | void CPicolAppUi::RetrieveConfig()\r |
| 366 | {\r |
| 367 | // ask to configure keys and receive new config\r |
| 368 | TAny *p[KMaxMessageArguments];\r |
| 369 | TPtr8 descr((TUint8*) &iCurrentConfig, sizeof(iCurrentConfig));\r |
| 370 | p[0]= (TAny*)(&descr);\r |
| 371 | ss.SendReceive(PicoMsgRetrieveConfig, &p[0]);\r |
| 372 | \r |
| 373 | iCurrentLConfig.Save();\r |
| 374 | }\r |
| 375 | \r |
| 376 | \r |
| 377 | void CPicolAppUi::NotifyEmuDeath()\r |
| 378 | {\r |
| 379 | StopGame();\r |
| 380 | if(iQuitting) {\r |
| 381 | DEBUGPRINT(_L("[app] Exit (NotifyEmuDeath)"));\r |
| 382 | iCurrentLConfig.Save();\r |
| 383 | RProcess me;\r |
| 384 | me.Terminate(0);\r |
| 385 | }\r |
| 386 | }\r |
| 387 | \r |
| 388 | \r |
| 389 | void CPicolAppUi::NotifyForcedExit()\r |
| 390 | {\r |
| 391 | DEBUGPRINT(_L("[app] Exit (NotifyForcedExit)"));\r |
| 392 | StopGame();\r |
| 393 | RProcess me;\r |
| 394 | me.Terminate(0);\r |
| 395 | }\r |
| 396 | \r |
| 397 | \r |
| 398 | TBool CPicolAppUi::EmuRunning() const\r |
| 399 | {\r |
| 400 | return iEmuRunning;\r |
| 401 | }\r |
| 402 | \r |
| 403 | \r |
| 404 | void CPicolAppUi::StopGame()\r |
| 405 | {\r |
| 406 | // in case we have busyMsg and process crashes\r |
| 407 | CEikonEnv::Static()->BusyMsgCancel();\r |
| 408 | \r |
| 409 | ss.Close();\r |
| 410 | if(iGameRunner) delete iGameRunner;\r |
| 411 | iGameRunner = NULL;\r |
| 412 | if(iExitForcer) delete iExitForcer;\r |
| 413 | iExitForcer = NULL;\r |
| 414 | if(iThreadWatcher1) delete iThreadWatcher1;\r |
| 415 | iThreadWatcher1 = NULL;\r |
| 416 | iROMLoaded = EFalse;\r |
| 417 | iEmuRunning = EFalse;\r |
| 418 | }\r |
| 419 | \r |
| 420 | \r |
| 421 | void CPicolAppUi::RunGameL()\r |
| 422 | {\r |
| 423 | TInt res = KErrNone;\r |
| 424 | \r |
| 425 | // do one connection attemt to emu and ask it to quit if we succeed\r |
| 426 | res = ss.Connect();\r |
| 427 | if(res == KErrNone) {\r |
| 428 | ss.Send(PicoMsgQuit, 0);\r |
| 429 | ss.Close();\r |
| 430 | }\r |
| 431 | \r |
| 432 | iGameRunner = CGameRunner::NewL(*this);\r |
| 433 | \r |
| 434 | // Connect to the server\r |
| 435 | // we don't want to do complex asynchronous stuff here, so we just\r |
| 436 | // wait and do several connection attempts\r |
| 437 | User::After(200000);\r |
| 438 | for(TInt attempt=0; attempt < 10; attempt++) {\r |
| 439 | res = ss.Connect();\r |
| 440 | if(res == KErrNone) break;\r |
| 441 | User::After(200000);\r |
| 442 | }\r |
| 443 | \r |
| 444 | if(res != KErrNone) {\r |
| 445 | CEikonEnv::Static()->BusyMsgCancel();\r |
| 446 | CEikonEnv::Static()->InfoWinL(_L("Error"), _L("Failed to communicate with the emulation process."));\r |
| 447 | StopGame();\r |
| 448 | RProcess me;\r |
| 449 | me.Terminate(2);\r |
| 450 | }\r |
| 451 | \r |
| 452 | // now we are successfully connected, that means emu process' helper-communication thread is running.\r |
| 453 | // we have to keep an eye on it too, because if it crashes, symbian OS leaves it's process\r |
| 454 | // alive, but it becomes useless without it's communication thread so we have to detect it's death.\r |
| 455 | iThreadWatcher1 = CThreadWatcher::NewL(*this, KServerName);\r |
| 456 | \r |
| 457 | // send initial config\r |
| 458 | SendConfig();\r |
| 459 | }\r |
| 460 | \r |
| 461 | \r |
| 462 | /*\r |
| 463 | void CPicolAppUi::HandleScreenDeviceChangedL()\r |
| 464 | {\r |
| 465 | // does not receive when emu is in foreground\r |
| 466 | if(iCoeEnv->ScreenDevice()->CurrentScreenMode() == 0) { // flip open\r |
| 467 | // regain focus\r |
| 468 | //iCoeEnv->BringOwnerToFront();\r |
| 469 | \r |
| 470 | }\r |
| 471 | // ss.Send(PicoMsgFlipChange, 0);\r |
| 472 | }\r |
| 473 | */\r |
| 474 | \r |
| 475 | void CPicolAppUi::HandleApplicationSpecificEventL(TInt aType, const TWsEvent& aEvent)\r |
| 476 | {\r |
| 477 | DEBUGPRINT(_L("[app] event from server: %i"), aEvent.Type());\r |
| 478 | \r |
| 479 | switch (aEvent.Type())\r |
| 480 | {\r |
| 481 | case EEventKeyCfgDone:\r |
| 482 | RetrieveConfig();\r |
| 483 | break;\r |
| 484 | \r |
| 485 | case EEventGamePaused:\r |
| 486 | iEmuRunning = EFalse;\r |
| 487 | break;\r |
| 488 | }\r |
| 489 | }\r |
| 490 | \r |
| 491 | ////////////////////////////////////////////////////////////////\r |
| 492 | //\r |
| 493 | // class CEPicolAppView\r |
| 494 | //\r |
| 495 | ////////////////////////////////////////////////////////////////\r |
| 496 | \r |
| 497 | void CEPicolAppView::ConstructL(const TRect& aRect)\r |
| 498 | {\r |
| 499 | CreateWindowL();\r |
| 500 | SetRect(aRect);\r |
| 501 | ActivateL();\r |
| 502 | \r |
| 503 | /*\r |
| 504 | * Load background image\r |
| 505 | */\r |
| 506 | /*\r |
| 507 | TBuf<1> name = _L("*");\r |
| 508 | TRAPD(err, iBgImage = CEikonEnv::Static()->CreateBitmapL(name, EMbmEdoomDoom));\r |
| 509 | if (iBgImage)\r |
| 510 | {\r |
| 511 | iImagePosition.iX = (aRect.Size().iWidth - iBgImage->SizeInPixels().iWidth) / 2;\r |
| 512 | iImagePosition.iY = (aRect.Size().iHeight - iBgImage->SizeInPixels().iHeight) / 2;\r |
| 513 | }\r |
| 514 | */\r |
| 515 | }\r |
| 516 | \r |
| 517 | CEPicolAppView::~CEPicolAppView()\r |
| 518 | {\r |
| 519 | //if (iBgImage) delete iBgImage;\r |
| 520 | }\r |
| 521 | \r |
| 522 | \r |
| 523 | void CEPicolAppView::Draw(const TRect& aRect) const\r |
| 524 | {\r |
| 525 | CWindowGc& gc = SystemGc();\r |
| 526 | \r |
| 527 | //if (iBgImage)\r |
| 528 | //{\r |
| 529 | // gc.DrawBitmap(iImagePosition, iBgImage);\r |
| 530 | // DrawUtils::ClearBetweenRects(gc, Rect(), TRect(iImagePosition, iBgImage->SizeInPixels()));\r |
| 531 | //}\r |
| 532 | //else\r |
| 533 | gc.Clear();//aRect);\r |
| 534 | }\r |
| 535 | \r |
| 536 | \r |
| 537 | ////////////////////////////////////////////////////////////////\r |
| 538 | //\r |
| 539 | // class CPicolViewBase\r |
| 540 | //\r |
| 541 | ////////////////////////////////////////////////////////////////\r |
| 542 | \r |
| 543 | void CPicolViewBase::ViewActivatedL(const TVwsViewId& /*aPrevViewId*/, TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/)\r |
| 544 | {\r |
| 545 | TPixelsAndRotation sizeAndRotation;\r |
| 546 | CEikonEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation(sizeAndRotation);\r |
| 547 | CEikonEnv::Static()->ScreenDevice()->SetScreenSizeAndRotation(sizeAndRotation);\r |
| 548 | //iAppViewCtl.MakeVisible(ETrue);\r |
| 549 | }\r |
| 550 | \r |
| 551 | void CPicolViewBase::ViewDeactivated()\r |
| 552 | {\r |
| 553 | //iAppViewCtl.MakeVisible(EFalse);\r |
| 554 | }\r |
| 555 | \r |
| 556 | \r |
| 557 | ////////////////////////////////////////////////////////////////\r |
| 558 | //\r |
| 559 | // class CPicolFOView\r |
| 560 | //\r |
| 561 | ////////////////////////////////////////////////////////////////\r |
| 562 | \r |
| 563 | TVwsViewId CPicolFOView::ViewId() const\r |
| 564 | {\r |
| 565 | return TVwsViewId(KUidPicolApp, KUidPicolFOView);\r |
| 566 | }\r |
| 567 | \r |
| 568 | TVwsViewIdAndMessage CPicolFOView::ViewScreenDeviceChangedL()\r |
| 569 | {\r |
| 570 | // only handle change to FC mode when emu process is running\r |
| 571 | if(static_cast<CPicolAppUi*>(CEikonEnv::Static()->AppUi())->EmuRunning())\r |
| 572 | return TVwsViewIdAndMessage(TVwsViewId(KUidPicolApp, KUidPicolFCView));\r |
| 573 | else return MCoeView::ViewScreenDeviceChangedL();\r |
| 574 | }\r |
| 575 | \r |
| 576 | TBool CPicolFOView::ViewScreenModeCompatible(TInt aScreenMode)\r |
| 577 | {\r |
| 578 | return (aScreenMode == EScreenModeFlipOpen);\r |
| 579 | }\r |
| 580 | \r |
| 581 | void CPicolFOView::ViewActivatedL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage)\r |
| 582 | {\r |
| 583 | DEBUGPRINT(_L("[app] FO"));\r |
| 584 | CPicolViewBase::ViewActivatedL(aPrevViewId, aCustomMessageId, aCustomMessage);\r |
| 585 | CEikonEnv::Static()->AppUiFactory()->MenuBar()->MakeVisible(ETrue);\r |
| 586 | \r |
| 587 | iAppViewCtl.SetRect(static_cast<CEikAppUi*>(CEikonEnv::Static()->AppUi())->ClientRect());\r |
| 588 | }\r |
| 589 | \r |
| 590 | \r |
| 591 | ////////////////////////////////////////////////////////////////\r |
| 592 | //\r |
| 593 | // class CPicolFCView\r |
| 594 | //\r |
| 595 | ////////////////////////////////////////////////////////////////\r |
| 596 | \r |
| 597 | TVwsViewId CPicolFCView::ViewId() const\r |
| 598 | {\r |
| 599 | return TVwsViewId(KUidPicolApp, KUidPicolFCView);\r |
| 600 | }\r |
| 601 | \r |
| 602 | TVwsViewIdAndMessage CPicolFCView::ViewScreenDeviceChangedL()\r |
| 603 | {\r |
| 604 | return TVwsViewIdAndMessage(TVwsViewId(KUidPicolApp, KUidPicolFOView));\r |
| 605 | }\r |
| 606 | \r |
| 607 | TBool CPicolFCView::ViewScreenModeCompatible(TInt aScreenMode)\r |
| 608 | {\r |
| 609 | return (aScreenMode == EScreenModeFlipClosed);\r |
| 610 | }\r |
| 611 | \r |
| 612 | void CPicolFCView::ViewActivatedL(const TVwsViewId& aPrevViewId, TUid aCustomMessageId, const TDesC8& aCustomMessage)\r |
| 613 | {\r |
| 614 | DEBUGPRINT(_L("[app] FC"));\r |
| 615 | CPicolViewBase::ViewActivatedL(aPrevViewId, aCustomMessageId, aCustomMessage);\r |
| 616 | CEikonEnv::Static()->AppUiFactory()->MenuBar()->MakeVisible(EFalse);\r |
| 617 | //iAppViewCtl.ChangeLayout(ETrue);\r |
| 618 | iAppViewCtl.SetRect(CEikonEnv::Static()->ScreenDevice()->SizeInPixels());\r |
| 619 | }\r |
| 620 | \r |
| 621 | \r |
| 622 | ////////////////////////////////////////////////////////////////\r |
| 623 | //\r |
| 624 | // framework\r |
| 625 | //\r |
| 626 | ////////////////////////////////////////////////////////////////\r |
| 627 | \r |
| 628 | GLDEF_C TInt E32Dll(TDllReason)\r |
| 629 | {\r |
| 630 | return KErrNone;\r |
| 631 | }\r |
| 632 | \r |
| 633 | \r |
| 634 | EXPORT_C CApaApplication* NewApplication()\r |
| 635 | {\r |
| 636 | return new CPicolApplication;\r |
| 637 | }\r |
| 638 | \r |
| 639 | \r |
| 640 | TUid CPicolApplication::AppDllUid() const\r |
| 641 | {\r |
| 642 | return KUidPicolApp;\r |
| 643 | }\r |
| 644 | \r |