renderers (interlace and stuff)
[picodrive.git] / platform / uiq2 / launcher / App.cpp
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