symbian-qemu-0.9.1-12/libsdl-trunk/src/main/symbian/EKA2/sdlexe.cpp
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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