Home | History | Annotate | Download | only in EKA2
      1 //  INCLUDES
      2 #include <aknapp.h>
      3 #include <aknappui.h>
      4 #include <eikdoc.h>
      5 #include <sdlepocapi.h>
      6 #include <bautils.h>
      7 #include <eikstart.h>
      8 #include <badesca.h>
      9 #include <bautils.h>
     10 #include <apgcli.h>
     11 #include <sdlmain.h>
     12 #include <eikedwin.h>
     13 #include <eiklabel.h>
     14 #include <sdlexe.rsg>
     15 #include <aknglobalmsgquery.h>
     16 #include <apgwgnam.h>
     17 
     18 
     19 
     20 //  FORWARD DECLARATIONS
     21 class CApaDocument;
     22 
     23 
     24 //const TUid KSDLUID = { 0xF01F605E };
     25 
     26 LOCAL_C void MakeCCmdLineL(const TDesC8& aParam, CDesC8Array& aArray)
     27     {
     28 
     29     const TChar dq('\"');
     30 
     31     TLex8 lex(aParam);
     32     TBool in = EFalse;
     33 
     34     lex.SkipSpaceAndMark();
     35 
     36     while(!lex.Eos())
     37         {
     38         TPtrC8 ptr;
     39         if(in)
     40             {
     41             const TPtrC8 rem = lex.RemainderFromMark();
     42             const TInt pos = rem.Locate(dq);
     43             if(pos > 0)
     44                 {
     45                 lex.Inc(pos);
     46                 ptr.Set(lex.MarkedToken());
     47                 lex.SkipAndMark(1);
     48                 }
     49             else
     50                 {
     51                 ptr.Set(rem);
     52                 }
     53             in = EFalse;
     54             }
     55         else
     56             {
     57             ptr.Set(lex.NextToken());
     58             const TInt pos = ptr.Locate(dq);
     59             if(pos == 0)
     60                 {
     61                 lex.UnGetToMark();
     62                 lex.SkipAndMark(1);
     63                 in = ETrue;
     64                 continue; // back to in brace
     65                 }
     66             else
     67                 lex.SkipSpaceAndMark();
     68             }
     69 
     70         aArray.AppendL(ptr);
     71 
     72         }
     73     }
     74 
     75 NONSHARABLE_CLASS(TVirtualCursor) : public MOverlay
     76 	{
     77 	public:
     78 		TVirtualCursor();
     79 		void Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha);
     80 		void Move(TInt aX, TInt aY);
     81 		void MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const;
     82 		void Toggle();
     83 		TBool IsOn() const;
     84 	private:
     85     	void Draw(CBitmapContext& aGc, const TRect& aTargetRect, const TSize& aSize);
     86 	private:
     87 		TRect iRect;
     88 		TPoint iInc;
     89 		TPoint iPos;
     90 		TBool iIsOn;
     91 		CFbsBitmap* iCBmp;
     92 		CFbsBitmap* iAlpha;
     93 	};
     94 
     95 
     96 TVirtualCursor::TVirtualCursor() :  iInc(0, 0), iIsOn(EFalse), iCBmp(NULL)
     97 	{
     98 	}
     99 
    100 const TInt KMaxMove = 10;
    101 
    102 void TVirtualCursor::Move(TInt aX, TInt aY)
    103 	{
    104 	if(aX > 0 && iInc.iX > 0)
    105 			++iInc.iX;
    106 	else if(aX < 0 && iInc.iX < 0)
    107 			--iInc.iX;
    108 	else
    109 		iInc.iX = aX;
    110 
    111 	if(aY > 0 && iInc.iY > 0)
    112 			++iInc.iY;
    113 	else if(aY < 0 && iInc.iY < 0)
    114 			--iInc.iY;
    115 	else
    116 			iInc.iY = aY;
    117 
    118 	iInc.iX = Min(KMaxMove, iInc.iX);
    119 
    120 	iInc.iX = Max(-KMaxMove, iInc.iX);
    121 
    122 	iInc.iY = Min(KMaxMove, iInc.iY);
    123 
    124 	iInc.iY =Max(-KMaxMove, iInc.iY);
    125 
    126 	const TPoint pos = iPos + iInc;
    127 	if(iRect.Contains(pos))
    128 		{
    129 		iPos = pos;
    130 		}
    131 	else
    132 		{
    133 		iInc = TPoint(0, 0);
    134 		}
    135 	}
    136 
    137 
    138 void TVirtualCursor::Toggle()
    139 	{
    140 	iIsOn = !iIsOn;
    141 	}
    142 
    143 
    144 TBool TVirtualCursor::IsOn() const
    145 	{
    146 	return iIsOn;
    147 	}
    148 
    149 void TVirtualCursor::Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha)
    150 	{
    151 	iRect = aRect;
    152 	iCBmp = aBmp;
    153 	iAlpha = aAlpha;
    154 	}
    155 
    156 
    157 void TVirtualCursor::MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const
    158 	{
    159  	aEvent.SetType(EEventPointer),
    160 	aEvent.SetTimeNow();
    161 	TPointerEvent& pointer = *aEvent.Pointer();
    162 	pointer.iType = TPointerEvent::EButton1Down;
    163 	pointer.iPosition = iPos;
    164 	pointer.iParentPosition = aBasePos;
    165 	}
    166 
    167 
    168 void TVirtualCursor::Draw(CBitmapContext& aGc, const TRect& /*aTargetRect*/, const TSize& /*aSize*/)
    169 	{
    170 	if(iIsOn && iCBmp != NULL)
    171 		{
    172 		const TRect rect(TPoint(0, 0), iCBmp->SizeInPixels());
    173 		aGc.AlphaBlendBitmaps(iPos, iCBmp, rect, iAlpha, TPoint(0, 0));
    174 		}
    175 
    176 	}
    177 
    178 NONSHARABLE_CLASS(TSdlClass)
    179 	{
    180 	public:
    181 		TSdlClass();
    182 		void SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags);
    183 		TInt SdlFlags() const;
    184 		const TMainFunc& Main() const;
    185 		void SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL);
    186 		TInt AppFlags() const;
    187 		void AppFlags(TInt aFlags);
    188 	private:
    189 		TMainFunc iFunc;
    190 		TInt iSdlFlags;
    191 		TInt iExeFlags;
    192 		MSDLMainObs* iObs;
    193 	};
    194 
    195 
    196 void TSdlClass::AppFlags(TInt aFlags)
    197 	{
    198 	iExeFlags |= aFlags;
    199 	}
    200 
    201 void TSdlClass::SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL)
    202 	{
    203 	if(iObs != NULL)
    204 		iObs->SDLMainEvent(aEvent, aParam, aSDL);
    205 	}
    206 
    207 TInt TSdlClass::AppFlags() const
    208 	{
    209 	return iExeFlags;
    210 	}
    211 
    212 void TSdlClass::SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags)
    213 	{
    214 	iFunc = aFunc;
    215 	iSdlFlags = aFlags;
    216 	iExeFlags = aExeFlags;
    217 	iObs = aObs;
    218 	}
    219 
    220 const TMainFunc& TSdlClass::Main() const
    221 	{
    222 	return iFunc;
    223 	}
    224 
    225 
    226  TInt TSdlClass::SdlFlags() const
    227  	{
    228  	return iSdlFlags;
    229  	}
    230 
    231 
    232 
    233 TSdlClass::TSdlClass()
    234 	{
    235 	Mem::FillZ(this, sizeof(this));
    236 	}
    237 
    238 TSdlClass gSDLClass;
    239 
    240 
    241 ////////////////////////////////////////////////////////////////
    242 
    243 NONSHARABLE_CLASS(CSDLApplication) : public CAknApplication
    244     {
    245     public:
    246     	CSDLApplication();
    247     private:
    248         CApaDocument* CreateDocumentL();
    249         TFileName ResourceFileName() const;
    250         TUid AppDllUid() const;
    251       		void FindMeL();
    252      		TUid iUid;
    253     };
    254 
    255 NONSHARABLE_CLASS(CSDLDocument)  : public CEikDocument
    256     {
    257     public:
    258         CSDLDocument(CEikApplication& aApp);
    259      private:
    260      	CEikAppUi* CreateAppUiL();
    261 
    262      };
    263 
    264  ////////////////////////////////////////////////////////////////////
    265 
    266 
    267 NONSHARABLE_CLASS(MExitWait)
    268  	{
    269  	public:
    270  		virtual void DoExit(TInt aErr) = 0;
    271  	};
    272 
    273 /////////////////////////////////////////////////////////////////////////
    274 
    275 NONSHARABLE_CLASS(CExitWait) : public CActive
    276  	{
    277  	public:
    278  		CExitWait(MExitWait& aWait);
    279  		~CExitWait();
    280  	private:
    281  		void RunL();
    282  		void DoCancel();
    283  	private:
    284  		MExitWait& iWait;
    285  		TRequestStatus* iStatusPtr;
    286  	};
    287 
    288 ////////////////////////////////////////////////////////////////////////
    289 
    290 
    291 NONSHARABLE_CLASS(CSDLWin) : public CCoeControl
    292 	{
    293 	public:
    294 		void ConstructL(const TRect& aRect);
    295 		RWindow& GetWindow() const;
    296 		void SetNoDraw();
    297 	private:
    298 		void Draw(const TRect& aRect) const;
    299 	private:
    300 		TBool iNoDraw;
    301 	};
    302 
    303 
    304 ////////////////////////////////////////////////////////////////////////////
    305 
    306 NONSHARABLE_CLASS(CSDLAppUi) : public CAknAppUi, public MExitWait, MSDLObserver
    307 	{
    308 	public:
    309 		~CSDLAppUi();
    310    	private: // New functions
    311  		void ConstructL();
    312    	void HandleCommandL(TInt aCommand);
    313  		void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination);
    314  		void HandleResourceChangeL(TInt aType);
    315 
    316    		void DoExit(TInt aErr);
    317 
    318    		TInt SdlEvent(TInt aEvent, TInt aParam);
    319     	TInt SdlThreadEvent(TInt aEvent, TInt aParam);
    320 
    321     	void StartL();
    322     	static TBool StartL(TAny* aThis);
    323 
    324     	TBool ParamEditorL(TDes& aCheat);
    325 
    326     	TBool ProcessCommandParametersL(CApaCommandLine &aCommandLine);
    327 
    328     	void PrepareToExit();
    329     	void HandleConsoleWindowL();
    330     	void HandleConsoleWindow();
    331     	void HandleForegroundEventL(TBool aForeground);
    332 
    333     	static TBool IdleRequestL(TAny* aThis);
    334 
    335     	TBool HandleKeyL(const TWsEvent& aEvent);
    336 
    337 
    338 	private:
    339 		CExitWait* iWait;
    340 		CSDLWin* iSDLWin;
    341 		CSDL* iSdl;
    342 		CIdle* iStarter;
    343 		TBool iExitRequest;
    344 		CDesC8Array* iParams;
    345 		TInt iResOffset;
    346 		CIdle* iIdle;
    347 		TInt iStdOut;
    348 		TVirtualCursor iCursor;
    349 		CFbsBitmap*	iCBmp;
    350 		CFbsBitmap*	iAlpha;
    351 	//	TTime iLastPress;
    352 	//	CSDL::TOrientationMode iOrientation;
    353 	};
    354 
    355 ////////////////////////////////////////////////////////////////////////////////////////7
    356 
    357 CApaDocument* CSDLApplication::CreateDocumentL()
    358 	{
    359 	return new (ELeave) CSDLDocument(*this);
    360 	}
    361 
    362 TUid CSDLApplication::AppDllUid() const
    363 	{
    364 	return iUid;
    365 	}
    366 
    367 
    368 CSDLApplication::CSDLApplication()
    369 	{
    370 	TRAPD(err, FindMeL());
    371 	ASSERT(err == KErrNone);
    372 	}
    373 
    374 void CSDLApplication::FindMeL()
    375 	{
    376 	RApaLsSession apa;
    377 	User::LeaveIfError(apa.Connect());
    378 	CleanupClosePushL(apa);
    379 	User::LeaveIfError(apa.GetAllApps());
    380 	TFileName name = RProcess().FileName();
    381 	TApaAppInfo info;
    382 	while(apa.GetNextApp(info) == KErrNone)
    383 		{
    384 		if(info.iFullName.CompareF(name) == 0)
    385 			{
    386 			iUid = info.iUid;
    387 			break;
    388 			}
    389 		}
    390 	CleanupStack::PopAndDestroy();
    391 	}
    392 
    393 TFileName CSDLApplication::ResourceFileName() const
    394 	{
    395 	return KNullDesC();
    396 	}
    397 
    398 ///////////////////////////////////////////////////////////////////////////////////////////
    399 
    400 CExitWait::CExitWait(MExitWait& aWait) : CActive(CActive::EPriorityStandard), iWait(aWait)
    401 	{
    402 	CActiveScheduler::Add(this);
    403 	SetActive();
    404 	iStatusPtr = &iStatus;
    405 	}
    406 
    407 CExitWait::~CExitWait()
    408 	{
    409 	Cancel();
    410 	}
    411 
    412 void CExitWait::RunL()
    413 	{
    414 	if(iStatusPtr != NULL )
    415 		iWait.DoExit(iStatus.Int());
    416 	}
    417 
    418 void CExitWait::DoCancel()
    419 	{
    420 	if(iStatusPtr != NULL )
    421 		User::RequestComplete(iStatusPtr , KErrCancel);
    422 	}
    423 
    424 
    425 //////////////////////////////////////////////////////////////////////////////////////////////
    426 
    427 CSDLDocument::CSDLDocument(CEikApplication& aApp) : CEikDocument(aApp)
    428 	{}
    429 
    430 CEikAppUi* CSDLDocument::CreateAppUiL()
    431 	{
    432 	return new (ELeave) CSDLAppUi;
    433 	}
    434 
    435 ///////////////////////////////////////////////////////////////////////////
    436 
    437 void CSDLWin:: ConstructL(const TRect& aRect)
    438 	{
    439 	CreateWindowL();
    440 	SetRect(aRect);
    441 	ActivateL();
    442 	}
    443 
    444 
    445 RWindow& CSDLWin::GetWindow() const
    446 	{
    447 	return Window();
    448 	}
    449 
    450 
    451 void CSDLWin::Draw(const TRect& /*aRect*/) const
    452 	{
    453 	if(!iNoDraw)
    454 		{
    455 		CWindowGc& gc = SystemGc();
    456 		gc.SetPenStyle(CGraphicsContext::ESolidPen);
    457 		gc.SetPenColor(KRgbGray);
    458 		gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
    459 		gc.SetBrushColor(0xaaaaaa);
    460 		gc.DrawRect(Rect());
    461 		}
    462 	}
    463 
    464 void CSDLWin::SetNoDraw()
    465 	{
    466 	iNoDraw = ETrue;
    467 	}
    468 
    469 /////////////////////////////////////////////////////////////////////////
    470 
    471 CSDLAppUi::~CSDLAppUi()
    472 	{
    473 	if(iIdle)
    474 		iIdle->Cancel();
    475 	delete iIdle;
    476 	if(iStarter != NULL)
    477 		iStarter->Cancel();
    478 	delete iStarter;
    479 	delete iWait;
    480 	delete iSdl;
    481 	delete iSDLWin;
    482 	delete iParams;
    483 	delete iCBmp;
    484 	delete iAlpha;
    485 	}
    486 
    487 
    488 void CSDLAppUi::ConstructL()
    489  	{
    490  	BaseConstructL(ENoAppResourceFile | ENoScreenFurniture);
    491 
    492 
    493  	RLibrary lib;
    494  	User::LeaveIfError(lib.Load(_L("sdlexe.dll")));
    495  	TFileName name = lib.FileName();
    496  	lib.Close();
    497  	name.Replace(3, name.Length() - 3, _L("resource\\apps\\sdlexe.rsc"));
    498  	BaflUtils::NearestLanguageFile(iEikonEnv->FsSession(), name);
    499  	iResOffset = iCoeEnv->AddResourceFileL(name);
    500 
    501  	name.Replace(name.Length() - 3, 3, _L("mbm"));
    502 
    503 	TEntry e;
    504 	const TInt err = iEikonEnv->FsSession().Entry(name, e);
    505 
    506 	iCBmp = iEikonEnv->CreateBitmapL(name, 0);
    507 	iAlpha = iEikonEnv->CreateBitmapL(name, 1);
    508 
    509  	iIdle = CIdle::NewL(CActive::EPriorityIdle);
    510 
    511  	iSDLWin = new (ELeave) CSDLWin;
    512  	iSDLWin->ConstructL(ApplicationRect());
    513 
    514  	iSdl = CSDL::NewL(gSDLClass.SdlFlags());
    515 
    516  	gSDLClass.SendEvent(MSDLMainObs::ESDLCreated, 0, iSdl);
    517 
    518  	iSdl->SetObserver(this);
    519  	iSdl->DisableKeyBlocking(*this);
    520  	iSdl->SetContainerWindowL(
    521  					iSDLWin->GetWindow(),
    522         			iEikonEnv->WsSession(),
    523         			*iEikonEnv->ScreenDevice());
    524     iSdl->AppendOverlay(iCursor, 0);
    525 
    526     iCursor.Set(TRect(TPoint(0, 0), iSDLWin->Size()), iCBmp, iAlpha);
    527 
    528     iStarter = CIdle::NewL(CActive::EPriorityLow);
    529     iStarter->Start(TCallBack(StartL, this));
    530 
    531 
    532  	}
    533 
    534 
    535 
    536 TBool CSDLAppUi::StartL(TAny* aThis)
    537 	{
    538 	static_cast<CSDLAppUi*>(aThis)->StartL();
    539 	return EFalse;
    540 	}
    541 
    542 
    543 void CSDLAppUi::PrepareToExit()
    544 	{
    545 	CAknAppUiBase::PrepareToExit(); //aknappu::PrepareToExit crashes
    546 	iCoeEnv->DeleteResourceFile(iResOffset);
    547 	}
    548 
    549 TBool CSDLAppUi::ProcessCommandParametersL(CApaCommandLine &aCommandLine)
    550 	{
    551 	const TPtrC8 cmdLine = aCommandLine.TailEnd();
    552 	iParams = new (ELeave) CDesC8ArrayFlat(8);
    553 	MakeCCmdLineL(cmdLine, *iParams);
    554 	return EFalse;
    555 	}
    556 
    557 
    558  TBool CSDLAppUi::ParamEditorL(TDes& aCheat)
    559 	{
    560 	CAknTextQueryDialog* query = CAknTextQueryDialog::NewL(aCheat);
    561 	CleanupStack::PushL(query);
    562 	query->SetPromptL(_L("Enter parameters"));
    563 	CleanupStack::Pop();
    564 	return query->ExecuteLD(R_PARAMEDITOR);
    565 	}
    566 
    567  void CSDLAppUi::StartL()
    568  	{
    569  	if(gSDLClass.AppFlags() & SDLEnv::EParamQuery)
    570  		{
    571  		TBuf8<256> cmd;
    572  		RFile file;
    573  		TInt err = file.Open(iEikonEnv->FsSession(), _L("sdl_param.txt"),EFileRead);
    574  		if(err == KErrNone)
    575  			{
    576  			file.Read(cmd);
    577  			file.Close();
    578  			MakeCCmdLineL(cmd, *iParams);
    579  			}
    580  		if(err != KErrNone || gSDLClass.AppFlags() & (SDLEnv::EParamQueryDialog ^ SDLEnv::EParamQuery))
    581  			{
    582  			TBuf<256> buffer;
    583  			if(ParamEditorL(buffer))
    584  				{
    585  				cmd.Copy(buffer);
    586  				MakeCCmdLineL(cmd, *iParams);
    587  				}
    588  			}
    589  		}
    590  	iWait = new (ELeave) CExitWait(*this);
    591  	iSdl->CallMainL(gSDLClass.Main(), &iWait->iStatus, iParams, CSDL::ENoParamFlags, 0xA000);
    592  	}
    593 
    594 void CSDLAppUi::HandleCommandL(TInt aCommand)
    595 	{
    596 	switch(aCommand)
    597 		{
    598 		case EAknSoftkeyBack:
    599  		case EAknSoftkeyExit:
    600 		case EAknCmdExit:
    601 		case EEikCmdExit:
    602 			gSDLClass.AppFlags(SDLEnv::EAllowConsoleView);
    603 		    if(iWait == NULL || !iWait->IsActive() || iSdl == NULL)
    604 		    	{
    605 		    	Exit();
    606 		    	}
    607 			  else if(!iExitRequest)
    608 			  	{
    609 			  	iExitRequest = ETrue; //trick how SDL can be closed!
    610 			  	iSdl->Suspend();
    611 			  	}
    612 			break;
    613 		}
    614 	}
    615 
    616 
    617 
    618 TBool CSDLAppUi::HandleKeyL(const TWsEvent& aEvent)
    619 	{
    620 	const TInt type = aEvent.Type();
    621 	if(!(type == EEventKey || type == EEventKeyUp || type == EEventKeyDown))
    622  			{
    623  			return ETrue;
    624  			}
    625  	const TKeyEvent& key = *aEvent.Key();
    626 	if((key.iScanCode == EStdKeyYes) && (gSDLClass.AppFlags() & SDLEnv::EVirtualMouse))
    627  		{
    628  		if(type == EEventKeyUp)
    629  			{
    630  			iCursor.Toggle();
    631  			iSdl->RedrawRequest();
    632  			}
    633  		return EFalse;
    634 		}
    635 	if(iCursor.IsOn())
    636 		{
    637 		switch(key.iScanCode)
    638 			{
    639 			case EStdKeyUpArrow:
    640 				iCursor.Move(0, -1);
    641 				break;
    642 			case EStdKeyDownArrow:
    643 				iCursor.Move(0, 1);
    644 				break;
    645 			case EStdKeyLeftArrow:
    646 				iCursor.Move(-1, 0);
    647 				break;
    648 			case EStdKeyRightArrow:
    649 				iCursor.Move(1, 0);
    650 				break;
    651 			case EStdKeyDevice3:
    652 				if(type == EEventKeyUp)
    653 					{
    654 					TWsEvent event;
    655 					iCursor.MakeEvent(event, iSDLWin->Position());
    656 					iSdl->AppendWsEvent(event);
    657 					}
    658 				return EFalse;
    659 			default:
    660 				return ETrue;
    661 			}
    662 		iSdl->RedrawRequest();
    663 		return EFalse;
    664 		}
    665 	return ETrue;
    666 	}
    667 
    668  void CSDLAppUi::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination)
    669  	{
    670  	if(iSdl && iWait && HandleKeyL(aEvent))
    671  		iSdl->AppendWsEvent(aEvent);
    672  	CAknAppUi::HandleWsEventL(aEvent, aDestination);
    673  	}
    674 
    675  void CSDLAppUi::HandleResourceChangeL(TInt aType)
    676  	{
    677     CAknAppUi::HandleResourceChangeL(aType);
    678     if(aType == KEikDynamicLayoutVariantSwitch)
    679         {
    680         iSDLWin->SetRect(ApplicationRect());
    681       	iSdl->SetContainerWindowL(
    682       				iSDLWin->GetWindow(),
    683         			iEikonEnv->WsSession(),
    684         			*iEikonEnv->ScreenDevice());
    685         }
    686  	}
    687 
    688 
    689 void CSDLAppUi::DoExit(TInt/*Err*/)
    690    	{
    691    	iExitRequest = ETrue;
    692    	Exit();
    693    	}
    694 
    695 
    696  TInt CSDLAppUi::SdlThreadEvent(TInt aEvent, TInt /*aParam*/)
    697 	{
    698 	switch(aEvent)
    699 		{
    700 		case MSDLObserver::EEventResume:
    701 			break;
    702 		case MSDLObserver::EEventSuspend:
    703 			if(iExitRequest)
    704 				return MSDLObserver::ESuspendNoSuspend;
    705 			break;
    706 		case MSDLObserver::EEventWindowReserved:
    707 			break;
    708 		case MSDLObserver::EEventWindowNotAvailable:
    709 			break;
    710 		case MSDLObserver::EEventScreenSizeChanged:
    711             break;
    712 		}
    713 	return MSDLObserver::EParameterNone;
    714 	}
    715 
    716 TInt CSDLAppUi::SdlEvent(TInt aEvent, TInt /*aParam*/)
    717 	{
    718 	switch(aEvent)
    719 		{
    720 		case MSDLObserver::EEventResume:
    721 			break;
    722 		case MSDLObserver::EEventSuspend:
    723 			if(iExitRequest)
    724 				return MSDLObserver::ESuspendNoSuspend;
    725 			break;
    726 		case MSDLObserver::EEventWindowReserved:
    727 			break;
    728 		case MSDLObserver::EEventWindowNotAvailable:
    729 			{
    730 			TRAP_IGNORE(HandleConsoleWindowL());
    731 			}
    732 			break;
    733 		case MSDLObserver::EEventScreenSizeChanged:
    734      		break;
    735 		case MSDLObserver::EEventKeyMapInit:
    736 			break;
    737 		case MSDLObserver::EEventMainExit:
    738 			if(iStdOut != 0)
    739 				{
    740 				gSDLClass.AppFlags(SDLEnv::EAllowConsoleView);
    741 				iEikonEnv->WsSession().SetWindowGroupOrdinalPosition(iStdOut, 0);
    742 				}
    743 			break;
    744 		}
    745 	return MSDLObserver::EParameterNone;
    746 	}
    747 
    748 void CSDLAppUi::HandleForegroundEventL(TBool aForeground)
    749 	{
    750 	CAknAppUi::HandleForegroundEventL(aForeground);
    751 	if(!aForeground)
    752 		HandleConsoleWindow();
    753 	}
    754 
    755 void CSDLAppUi::HandleConsoleWindow()
    756 	{
    757 	if(!iIdle->IsActive())
    758 		iIdle->Start(TCallBack(IdleRequestL, this));
    759 	}
    760 
    761 TBool CSDLAppUi::IdleRequestL(TAny* aThis)
    762 	{
    763 	static_cast<CSDLAppUi*>(aThis)->HandleConsoleWindowL();
    764 	return EFalse;
    765 	}
    766 
    767 void CSDLAppUi::HandleConsoleWindowL()
    768 	{
    769 	if(gSDLClass.AppFlags() & SDLEnv::EAllowConsoleView)
    770 		{
    771 		return;
    772 		}
    773 	RWsSession& ses = iEikonEnv->WsSession();
    774 	const TInt focus = ses.GetFocusWindowGroup();
    775 	CApaWindowGroupName* name = CApaWindowGroupName::NewLC(ses, focus);
    776 	const TPtrC caption = name->Caption();
    777 	if(0 == caption.CompareF(_L("STDOUT")))
    778 		{
    779 		iStdOut = focus;
    780 		ses.SetWindowGroupOrdinalPosition(iEikonEnv->RootWin().Identifier(), 0);
    781 		}
    782 	CleanupStack::PopAndDestroy(); //name
    783 	}
    784 
    785 
    786 ////////////////////////////////////////////////////////////////////////
    787 
    788 
    789 CApaApplication* NewApplication()
    790     {
    791     return new CSDLApplication();
    792     }
    793 
    794 
    795 EXPORT_C TInt SDLEnv::SetMain(const TMainFunc& aFunc, TInt aSdlFlags, MSDLMainObs* aObs, TInt aSdlExeFlags)
    796 	{
    797 	gSDLClass.SetMain(aFunc, aSdlFlags, aObs, aSdlExeFlags);
    798   	return EikStart::RunApplication(NewApplication);
    799 	}
    800 
    801 //////////////////////////////////////////////////////////////////////
    802 
    803 TInt SDLUiPrint(const TDesC8& /*aInfo*/)
    804     {
    805     return KErrNotFound;
    806     }
    807 
    808 
    809 
    810