diff src/main/symbian/EKA2/sdlexe.cpp @ 3975:e85e65aec22f SDL-1.2

Added S60 port.
author Ryan C. Gordon <icculus@icculus.org>
date Sun, 24 Jun 2007 18:26:35 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/symbian/EKA2/sdlexe.cpp	Sun Jun 24 18:26:35 2007 +0000
@@ -0,0 +1,809 @@
+//  INCLUDES
+#include <aknapp.h>
+#include <aknappui.h>
+#include <eikdoc.h>
+#include <sdlepocapi.h>
+#include <bautils.h>
+#include <eikstart.h>
+#include <badesca.h>
+#include <bautils.h>
+#include <apgcli.h>
+#include <sdlmain.h>
+#include <eikedwin.h>
+#include <eiklabel.h>
+#include <sdlexe.rsg>
+#include <aknglobalmsgquery.h>
+#include <apgwgnam.h> 
+
+
+
+//  FORWARD DECLARATIONS
+class CApaDocument;
+
+
+//const TUid KSDLUID = { 0xF01F605E };
+
+LOCAL_C void MakeCCmdLineL(const TDesC8& aParam, CDesC8Array& aArray)
+    { 
+    
+    const TChar dq('\"');
+
+    TLex8 lex(aParam);
+    TBool in = EFalse;
+
+    lex.SkipSpaceAndMark();
+
+    while(!lex.Eos())
+        {
+        TPtrC8 ptr;
+        if(in)
+            {
+            const TPtrC8 rem = lex.RemainderFromMark();
+            const TInt pos = rem.Locate(dq);
+            if(pos > 0)
+                {
+                lex.Inc(pos);
+                ptr.Set(lex.MarkedToken());
+                lex.SkipAndMark(1);
+                }
+            else
+                {
+                ptr.Set(rem);
+                }
+            in = EFalse;
+            }
+        else
+            {
+            ptr.Set(lex.NextToken());
+            const TInt pos = ptr.Locate(dq);
+            if(pos == 0)
+                {
+                lex.UnGetToMark();
+                lex.SkipAndMark(1);
+                in = ETrue;
+                continue; // back to in brace
+                }
+            else
+                lex.SkipSpaceAndMark();
+            }
+        
+        aArray.AppendL(ptr);
+
+        }
+    }  
+    
+NONSHARABLE_CLASS(TVirtualCursor) : public MOverlay
+	{
+	public:
+		TVirtualCursor();
+		void Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha);
+		void Move(TInt aX, TInt aY);
+		void MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const;
+		void Toggle();
+		TBool IsOn() const;
+	private:
+    	void Draw(CBitmapContext& aGc, const TRect& aTargetRect, const TSize& aSize);
+	private:
+		TRect iRect;
+		TPoint iInc;
+		TPoint iPos;
+		TBool iIsOn;
+		CFbsBitmap* iCBmp;
+		CFbsBitmap* iAlpha;
+	};
+	
+	
+TVirtualCursor::TVirtualCursor() :  iInc(0, 0), iIsOn(EFalse), iCBmp(NULL)
+	{	
+	}
+	
+const TInt KMaxMove = 10;	
+
+void TVirtualCursor::Move(TInt aX, TInt aY)
+	{
+	if(aX > 0 && iInc.iX > 0)
+			++iInc.iX;
+	else if(aX < 0 && iInc.iX < 0)
+			--iInc.iX;
+	else
+		iInc.iX = aX;
+
+	if(aY > 0 && iInc.iY > 0)
+			++iInc.iY;
+	else if(aY < 0 && iInc.iY < 0)
+			--iInc.iY;
+	else
+			iInc.iY = aY;
+	
+	iInc.iX = Min(KMaxMove, iInc.iX); 
+	
+	iInc.iX = Max(-KMaxMove, iInc.iX);
+	
+	iInc.iY = Min(KMaxMove, iInc.iY);
+	
+	iInc.iY =Max(-KMaxMove, iInc.iY);
+	
+	const TPoint pos = iPos + iInc;
+	if(iRect.Contains(pos))
+		{
+		iPos = pos;
+		}
+	else
+		{
+		iInc = TPoint(0, 0);	
+		}
+	}
+	
+	
+void TVirtualCursor::Toggle()
+	{
+	iIsOn = !iIsOn;
+	}
+	
+	
+TBool TVirtualCursor::IsOn() const
+	{
+	return iIsOn;
+	}
+	
+void TVirtualCursor::Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha)
+	{
+	iRect = aRect;
+	iCBmp = aBmp;
+	iAlpha = aAlpha;
+	}
+	
+		
+void TVirtualCursor::MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const
+	{
+ 	aEvent.SetType(EEventPointer),
+	aEvent.SetTimeNow();
+	TPointerEvent& pointer = *aEvent.Pointer();	
+	pointer.iType = TPointerEvent::EButton1Down;
+	pointer.iPosition = iPos;
+	pointer.iParentPosition = aBasePos;
+	}
+	
+	
+void TVirtualCursor::Draw(CBitmapContext& aGc, const TRect& /*aTargetRect*/, const TSize& /*aSize*/)
+	{
+	if(iIsOn && iCBmp != NULL)
+		{
+		const TRect rect(TPoint(0, 0), iCBmp->SizeInPixels());
+		aGc.AlphaBlendBitmaps(iPos, iCBmp, rect, iAlpha, TPoint(0, 0));
+		}
+	
+	}	
+
+NONSHARABLE_CLASS(TSdlClass)
+	{
+	public:
+		TSdlClass();
+		void SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags);
+		TInt SdlFlags() const;
+		const TMainFunc& Main() const;
+		void SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL);
+		TInt AppFlags() const; 
+		void AppFlags(TInt aFlags); 
+	private:
+		TMainFunc iFunc;
+		TInt iSdlFlags;
+		TInt iExeFlags;
+		MSDLMainObs* iObs;
+	};
+	
+	
+void TSdlClass::AppFlags(TInt aFlags)
+	{
+	iExeFlags |= aFlags;
+	}
+	
+void TSdlClass::SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL)
+	{
+	if(iObs != NULL)
+		iObs->SDLMainEvent(aEvent, aParam, aSDL);
+	}
+	
+TInt TSdlClass::AppFlags() const
+	{
+	return iExeFlags;
+	}
+	
+void TSdlClass::SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags)
+	{	
+	iFunc = aFunc;
+	iSdlFlags = aFlags;
+	iExeFlags = aExeFlags;
+	iObs = aObs;
+	}
+	
+const TMainFunc& TSdlClass::Main() const
+	{
+	return iFunc;
+	}
+	
+ 
+ TInt TSdlClass::SdlFlags() const
+ 	{
+ 	return iSdlFlags;
+ 	}
+ 	
+
+ 	
+TSdlClass::TSdlClass()
+	{
+	Mem::FillZ(this, sizeof(this));
+	}
+ 
+TSdlClass gSDLClass;    
+    
+	     
+////////////////////////////////////////////////////////////////    
+
+NONSHARABLE_CLASS(CSDLApplication) : public CAknApplication
+    {
+    public:
+    	CSDLApplication();
+    private:
+        CApaDocument* CreateDocumentL(); 
+        TFileName ResourceFileName() const;
+        TUid AppDllUid() const; 
+      		void FindMeL();
+     		TUid iUid;
+    };
+    
+NONSHARABLE_CLASS(CSDLDocument)  : public CEikDocument
+    {
+    public:
+        CSDLDocument(CEikApplication& aApp);
+     private:
+     	CEikAppUi* CreateAppUiL();
+     
+     };
+     
+ ////////////////////////////////////////////////////////////////////
+ 
+     
+NONSHARABLE_CLASS(MExitWait)
+ 	{
+ 	public:
+ 		virtual void DoExit(TInt aErr) = 0;
+ 	};   
+ 
+///////////////////////////////////////////////////////////////////////// 
+ 	
+NONSHARABLE_CLASS(CExitWait) : public CActive
+ 	{
+ 	public:
+ 		CExitWait(MExitWait& aWait);
+ 		~CExitWait();
+ 	private:
+ 		void RunL();
+ 		void DoCancel();
+ 	private:
+ 		MExitWait& iWait;
+ 		TRequestStatus* iStatusPtr;
+ 	};
+ 	
+//////////////////////////////////////////////////////////////////////// 
+
+ 	
+NONSHARABLE_CLASS(CSDLWin) : public CCoeControl
+	{
+	public:
+		void ConstructL(const TRect& aRect);
+		RWindow& GetWindow() const;
+		void SetNoDraw();
+	private:
+		void Draw(const TRect& aRect) const;
+	private:
+		TBool iNoDraw;
+	}; 	
+	
+
+////////////////////////////////////////////////////////////////////////////	
+     
+NONSHARABLE_CLASS(CSDLAppUi) : public CAknAppUi, public MExitWait, MSDLObserver
+	{
+	public:
+		~CSDLAppUi();
+   	private: // New functions
+ 		void ConstructL(); 
+   	void HandleCommandL(TInt aCommand);
+ 		void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination);
+ 		void HandleResourceChangeL(TInt aType);
+        
+   		void DoExit(TInt aErr);
+   	
+   		TInt SdlEvent(TInt aEvent, TInt aParam);
+    	TInt SdlThreadEvent(TInt aEvent, TInt aParam);
+    
+    	void StartL();
+    	static TBool StartL(TAny* aThis);
+    	
+    	TBool ParamEditorL(TDes& aCheat);
+    	
+    	TBool ProcessCommandParametersL(CApaCommandLine &aCommandLine);
+    	
+    	void PrepareToExit();
+    	void HandleConsoleWindowL();
+    	void HandleConsoleWindow();
+    	void HandleForegroundEventL(TBool aForeground);
+    	
+    	static TBool IdleRequestL(TAny* aThis);
+    	
+    	TBool HandleKeyL(const TWsEvent& aEvent);
+    
+    	
+	private:
+		CExitWait* iWait;
+		CSDLWin* iSDLWin;
+		CSDL* iSdl;
+		CIdle* iStarter;
+		TBool iExitRequest;
+		CDesC8Array* iParams;
+		TInt iResOffset;
+		CIdle* iIdle;
+		TInt iStdOut;
+		TVirtualCursor iCursor;
+		CFbsBitmap*	iCBmp;
+		CFbsBitmap*	iAlpha;
+	//	TTime iLastPress;
+	//	CSDL::TOrientationMode iOrientation;
+	};
+	
+////////////////////////////////////////////////////////////////////////////////////////7
+
+CApaDocument* CSDLApplication::CreateDocumentL()
+	{
+	return new (ELeave) CSDLDocument(*this);
+	}
+	
+TUid CSDLApplication::AppDllUid() const
+	{
+	return iUid;
+	}
+	
+	
+CSDLApplication::CSDLApplication()
+	{
+	TRAPD(err, FindMeL());
+	ASSERT(err == KErrNone);
+	}	
+	
+void CSDLApplication::FindMeL()
+	{
+	RApaLsSession apa;
+	User::LeaveIfError(apa.Connect());
+	CleanupClosePushL(apa);
+	User::LeaveIfError(apa.GetAllApps());
+	TFileName name = RProcess().FileName();
+	TApaAppInfo info;
+	while(apa.GetNextApp(info) == KErrNone)
+		{
+		if(info.iFullName.CompareF(name) == 0)
+			{
+			iUid = info.iUid;
+			break;
+			}
+		}
+	CleanupStack::PopAndDestroy();
+	}
+	
+TFileName CSDLApplication::ResourceFileName() const
+	{
+	return KNullDesC();
+	}
+	
+///////////////////////////////////////////////////////////////////////////////////////////
+
+CExitWait::CExitWait(MExitWait& aWait) : CActive(CActive::EPriorityStandard), iWait(aWait)
+	{
+	CActiveScheduler::Add(this);
+	SetActive();
+	iStatusPtr = &iStatus;
+	}
+	
+CExitWait::~CExitWait()
+	{
+	Cancel();
+	}
+ 
+void CExitWait::RunL()
+	{
+	if(iStatusPtr != NULL )
+		iWait.DoExit(iStatus.Int());
+	}
+	
+void CExitWait::DoCancel()
+	{
+	if(iStatusPtr != NULL )
+		User::RequestComplete(iStatusPtr , KErrCancel);
+	}
+	
+
+//////////////////////////////////////////////////////////////////////////////////////////////
+
+CSDLDocument::CSDLDocument(CEikApplication& aApp) : CEikDocument(aApp)
+	{}
+    
+CEikAppUi* CSDLDocument::CreateAppUiL()
+	{
+	return new (ELeave) CSDLAppUi;
+	}
+	
+///////////////////////////////////////////////////////////////////////////	
+	
+void CSDLWin:: ConstructL(const TRect& aRect)	
+	{
+	CreateWindowL();
+	SetRect(aRect);
+	ActivateL();
+	}
+	
+	
+RWindow& CSDLWin::GetWindow() const
+	{
+	return Window();
+	}
+	
+
+void CSDLWin::Draw(const TRect& /*aRect*/) const
+	{
+	if(!iNoDraw)
+		{
+		CWindowGc& gc = SystemGc();
+		gc.SetPenStyle(CGraphicsContext::ESolidPen);
+		gc.SetPenColor(KRgbGray);
+		gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
+		gc.SetBrushColor(0xaaaaaa);
+		gc.DrawRect(Rect());
+		}
+	}	
+	
+void CSDLWin::SetNoDraw()
+	{
+	iNoDraw = ETrue;
+	}
+
+/////////////////////////////////////////////////////////////////////////			
+	
+CSDLAppUi::~CSDLAppUi()
+	{
+	if(iIdle)
+		iIdle->Cancel();
+	delete iIdle;
+	if(iStarter != NULL)
+		iStarter->Cancel();
+	delete iStarter;
+	delete iWait;
+	delete iSdl;
+	delete iSDLWin;
+	delete iParams;
+	delete iCBmp;
+	delete iAlpha;
+	}
+	
+		
+void CSDLAppUi::ConstructL()
+ 	{
+ 	BaseConstructL(ENoAppResourceFile | ENoScreenFurniture);
+ 	
+ 	
+ 	RLibrary lib;
+ 	User::LeaveIfError(lib.Load(_L("sdlexe.dll")));
+ 	TFileName name = lib.FileName();
+ 	lib.Close();
+ 	name.Replace(3, name.Length() - 3, _L("resource\\apps\\sdlexe.rsc"));
+ 	BaflUtils::NearestLanguageFile(iEikonEnv->FsSession(), name);
+ 	iResOffset = iCoeEnv->AddResourceFileL(name);
+ 	
+ 	name.Replace(name.Length() - 3, 3, _L("mbm"));
+	
+	TEntry e;
+	const TInt err = iEikonEnv->FsSession().Entry(name, e);
+	
+	iCBmp = iEikonEnv->CreateBitmapL(name, 0);
+	iAlpha = iEikonEnv->CreateBitmapL(name, 1);	
+ 	
+ 	iIdle = CIdle::NewL(CActive::EPriorityIdle);
+ 	
+ 	iSDLWin = new (ELeave) CSDLWin;
+ 	iSDLWin->ConstructL(ApplicationRect());
+ 	
+ 	iSdl = CSDL::NewL(gSDLClass.SdlFlags());
+ 	
+ 	gSDLClass.SendEvent(MSDLMainObs::ESDLCreated, 0, iSdl);
+ 	
+ 	iSdl->SetObserver(this);
+ 	iSdl->DisableKeyBlocking(*this);
+ 	iSdl->SetContainerWindowL(
+ 					iSDLWin->GetWindow(), 
+        			iEikonEnv->WsSession(),
+        			*iEikonEnv->ScreenDevice());
+    iSdl->AppendOverlay(iCursor, 0);
+    
+    iCursor.Set(TRect(TPoint(0, 0), iSDLWin->Size()), iCBmp, iAlpha);
+        			
+    iStarter = CIdle::NewL(CActive::EPriorityLow);   
+    iStarter->Start(TCallBack(StartL, this));
+    
+    
+ 	}
+ 	
+
+
+TBool CSDLAppUi::StartL(TAny* aThis)
+	{
+	static_cast<CSDLAppUi*>(aThis)->StartL();
+	return EFalse;
+	}
+	
+	
+void CSDLAppUi::PrepareToExit()
+	{
+	CAknAppUiBase::PrepareToExit(); //aknappu::PrepareToExit crashes
+	iCoeEnv->DeleteResourceFile(iResOffset);
+	}
+	
+TBool CSDLAppUi::ProcessCommandParametersL(CApaCommandLine &aCommandLine)
+	{
+	const TPtrC8 cmdLine = aCommandLine.TailEnd();
+	iParams = new (ELeave) CDesC8ArrayFlat(8);
+	MakeCCmdLineL(cmdLine, *iParams);
+	return EFalse;
+	}
+ 	
+ 
+ TBool CSDLAppUi::ParamEditorL(TDes& aCheat)
+	{
+	CAknTextQueryDialog* query = CAknTextQueryDialog::NewL(aCheat);
+	CleanupStack::PushL(query);
+	query->SetPromptL(_L("Enter parameters"));
+	CleanupStack::Pop();
+	return query->ExecuteLD(R_PARAMEDITOR);
+	}
+ 	
+ void CSDLAppUi::StartL()	
+ 	{ 		
+ 	if(gSDLClass.AppFlags() & SDLEnv::EParamQuery)
+ 		{
+ 		TBuf8<256> cmd;
+ 		RFile file;
+ 		TInt err = file.Open(iEikonEnv->FsSession(), _L("sdl_param.txt"),EFileRead);
+ 		if(err == KErrNone)
+ 			{
+ 			file.Read(cmd);
+ 			file.Close();	
+ 			MakeCCmdLineL(cmd, *iParams);
+ 			}
+ 		if(err != KErrNone || gSDLClass.AppFlags() & (SDLEnv::EParamQueryDialog ^ SDLEnv::EParamQuery))
+ 			{
+ 			TBuf<256> buffer;
+ 			if(ParamEditorL(buffer))
+ 				{
+ 				cmd.Copy(buffer);
+ 				MakeCCmdLineL(cmd, *iParams);
+ 				}	
+ 			}
+ 		}
+ 	iWait = new (ELeave) CExitWait(*this);
+ 	iSdl->CallMainL(gSDLClass.Main(), &iWait->iStatus, iParams, CSDL::ENoParamFlags, 0xA000);
+ 	}
+ 	
+void CSDLAppUi::HandleCommandL(TInt aCommand)
+	{
+	switch(aCommand)
+		{
+		case EAknSoftkeyBack:
+ 		case EAknSoftkeyExit:
+		case EAknCmdExit:
+		case EEikCmdExit:
+			gSDLClass.AppFlags(SDLEnv::EAllowConsoleView); 
+		    if(iWait == NULL || !iWait->IsActive() || iSdl == NULL)
+		    	{
+		    	Exit();
+		    	}	
+			  else if(!iExitRequest)
+			  	{
+			  	iExitRequest = ETrue; //trick how SDL can be closed!
+			  	iSdl->Suspend();
+			  	} 
+			break;
+		}
+	}
+	
+
+	
+TBool CSDLAppUi::HandleKeyL(const TWsEvent& aEvent)
+	{
+	const TInt type = aEvent.Type();
+	if(!(type == EEventKey || type == EEventKeyUp || type == EEventKeyDown))
+ 			{
+ 			return ETrue;
+ 			}
+ 	const TKeyEvent& key = *aEvent.Key();
+	if((key.iScanCode == EStdKeyYes) && (gSDLClass.AppFlags() & SDLEnv::EVirtualMouse))
+ 		{
+ 		if(type == EEventKeyUp)
+ 			{
+ 			iCursor.Toggle();
+ 			iSdl->RedrawRequest();	
+ 			}
+ 		return EFalse;
+		}
+	if(iCursor.IsOn())
+		{
+		switch(key.iScanCode)
+			{
+			case EStdKeyUpArrow:
+				iCursor.Move(0, -1);
+				break;
+			case EStdKeyDownArrow:
+				iCursor.Move(0, 1);
+				break;
+			case EStdKeyLeftArrow:
+				iCursor.Move(-1, 0);
+				break;
+			case EStdKeyRightArrow:
+				iCursor.Move(1, 0);
+				break; 
+			case EStdKeyDevice3:
+				if(type == EEventKeyUp)
+					{
+					TWsEvent event;
+					iCursor.MakeEvent(event, iSDLWin->Position());
+					iSdl->AppendWsEvent(event);
+					}
+				return EFalse;
+			default:
+				return ETrue;
+			}
+		iSdl->RedrawRequest();	
+		return EFalse;
+		}
+	return ETrue;
+	}
+ 		
+ void CSDLAppUi::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination)
+ 	{
+ 	if(iSdl && iWait && HandleKeyL(aEvent))
+ 		iSdl->AppendWsEvent(aEvent);
+ 	CAknAppUi::HandleWsEventL(aEvent, aDestination);
+ 	}
+ 	
+ void CSDLAppUi::HandleResourceChangeL(TInt aType)
+ 	{
+    CAknAppUi::HandleResourceChangeL(aType);
+    if(aType == KEikDynamicLayoutVariantSwitch)
+        {  	
+        iSDLWin->SetRect(ApplicationRect());
+      	iSdl->SetContainerWindowL(
+      				iSDLWin->GetWindow(),
+        			iEikonEnv->WsSession(),
+        			*iEikonEnv->ScreenDevice());
+        }
+ 	}
+ 	
+ 	
+void CSDLAppUi::DoExit(TInt/*Err*/)
+   	{
+   	iExitRequest = ETrue;
+   	Exit();
+   	}
+
+    
+ TInt CSDLAppUi::SdlThreadEvent(TInt aEvent, TInt /*aParam*/)    
+	{
+	switch(aEvent)
+		{
+		case MSDLObserver::EEventResume:
+			break;
+		case MSDLObserver::EEventSuspend:
+			if(iExitRequest)
+				return MSDLObserver::ESuspendNoSuspend;
+			break;
+		case MSDLObserver::EEventWindowReserved:
+			break;
+		case MSDLObserver::EEventWindowNotAvailable:
+			break;
+		case MSDLObserver::EEventScreenSizeChanged:
+            break;
+		}
+	return MSDLObserver::EParameterNone;	
+	}
+	    
+TInt CSDLAppUi::SdlEvent(TInt aEvent, TInt /*aParam*/)    
+	{
+	switch(aEvent)
+		{
+		case MSDLObserver::EEventResume:
+			break;
+		case MSDLObserver::EEventSuspend:
+			if(iExitRequest)
+				return MSDLObserver::ESuspendNoSuspend;
+			break;
+		case MSDLObserver::EEventWindowReserved:
+			break;
+		case MSDLObserver::EEventWindowNotAvailable:
+			{
+			TRAP_IGNORE(HandleConsoleWindowL());
+			}
+			break;
+		case MSDLObserver::EEventScreenSizeChanged:
+     		break;
+		case MSDLObserver::EEventKeyMapInit:
+			break;
+		case MSDLObserver::EEventMainExit:
+			if(iStdOut != 0)
+				{
+				gSDLClass.AppFlags(SDLEnv::EAllowConsoleView); 
+				iEikonEnv->WsSession().SetWindowGroupOrdinalPosition(iStdOut, 0);
+				}
+			break;
+		}
+	return MSDLObserver::EParameterNone;
+	}
+	
+void CSDLAppUi::HandleForegroundEventL(TBool aForeground)
+	{
+	CAknAppUi::HandleForegroundEventL(aForeground);	
+	if(!aForeground)
+		HandleConsoleWindow();
+	}
+	
+void CSDLAppUi::HandleConsoleWindow()
+	{
+	if(!iIdle->IsActive())
+		iIdle->Start(TCallBack(IdleRequestL, this));
+	}
+	
+TBool CSDLAppUi::IdleRequestL(TAny* aThis)
+	{
+	static_cast<CSDLAppUi*>(aThis)->HandleConsoleWindowL();
+	return EFalse;
+	}
+
+void CSDLAppUi::HandleConsoleWindowL()
+	{
+	if(gSDLClass.AppFlags() & SDLEnv::EAllowConsoleView)
+		{
+		return;
+		}
+	RWsSession& ses = iEikonEnv->WsSession();
+	const TInt focus = ses.GetFocusWindowGroup();
+	CApaWindowGroupName* name = CApaWindowGroupName::NewLC(ses, focus);
+	const TPtrC caption = name->Caption();
+	if(0 == caption.CompareF(_L("STDOUT")))
+		{
+		iStdOut = focus;
+		ses.SetWindowGroupOrdinalPosition(iEikonEnv->RootWin().Identifier(), 0);
+		}
+	CleanupStack::PopAndDestroy(); //name
+	}
+	
+	
+////////////////////////////////////////////////////////////////////////
+
+
+CApaApplication* NewApplication()
+    {
+    return new CSDLApplication();
+    }
+
+	
+EXPORT_C TInt SDLEnv::SetMain(const TMainFunc& aFunc, TInt aSdlFlags, MSDLMainObs* aObs, TInt aSdlExeFlags)
+	{
+	gSDLClass.SetMain(aFunc, aSdlFlags, aObs, aSdlExeFlags);
+  	return EikStart::RunApplication(NewApplication);
+	}	
+	
+//////////////////////////////////////////////////////////////////////
+
+TInt SDLUiPrint(const TDesC8& /*aInfo*/)
+    {
+    return KErrNotFound;
+    }    
+
+
+