Replace CExitWait with Ticker.
[SDL.s60v3.git] / src / main / symbian / sdlexe.cpp
blobe5ca58ccbd990963772cdd98f12338c970c0544f
1 #include <aknapp.h>
2 #include <aknappui.h>
3 #include <eikdoc.h>
4 #include <sdlepocapi.h>
5 #include <bautils.h>
6 #include <eikstart.h>
7 #include <badesca.h>
8 #include <bautils.h>
9 #include <apgcli.h>
10 #include <eikedwin.h>
11 #include <eiklabel.h>
12 #include <aknglobalmsgquery.h>
13 #include <apgwgnam.h>
15 class CApaDocument;
17 class Ticker : public CActive
19 public:
20 Ticker() : CActive(CActive::EPriorityIdle)
22 CActiveScheduler::Add(this);
23 SetActive();
25 ~Ticker() { Cancel(); }
27 private:
28 void RunL() {}
29 void DoCancel() {}
32 ////////////////////////////////////////////////////////////////////////
34 class CSDLWin : public CCoeControl
36 public:
37 CSDLWin( const TRect& aRect );
38 RWindow& GetWindow() const { return Window(); }
40 private:
41 void Draw(const TRect& aRect) const;
44 CSDLWin::CSDLWin( const TRect& aRect )
46 CreateWindowL();
47 SetRect(aRect);
48 ActivateL();
51 void CSDLWin::Draw(const TRect& /*aRect*/) const
55 ////////////////////////////////////////////////////////////////////////////
57 class CSDLAppUi : public CAknAppUi
59 public:
60 ~CSDLAppUi();
62 private:
63 void ConstructL();
64 void HandleCommandL(int aCommand);
65 void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination);
66 void HandleResourceChangeL(int aType);
68 void StartL();
69 static TBool StartL(void* aThis);
71 void HandleForegroundEventL(TBool aForeground);
73 Ticker* iTicker;
74 CSDLWin* iSDLWin;
75 CSDL* iSdl;
76 CIdle* iStarter;
79 CSDLAppUi::~CSDLAppUi()
81 if(iStarter)
82 iStarter->Cancel();
83 delete iStarter;
84 delete iTicker;
85 delete iSdl;
86 delete iSDLWin;
89 void CSDLAppUi::ConstructL()
91 BaseConstructL(ENoAppResourceFile|EAknEnableSkin);
93 iSDLWin = new CSDLWin(ApplicationRect());
95 iSdl = CSDL::NewL();
97 SetKeyBlockMode(ENoKeyBlock);
99 iSdl->SetContainerWindowL(iSDLWin->GetWindow(), iEikonEnv->WsSession(), *iEikonEnv->ScreenDevice());
101 iStarter = CIdle::NewL(CActive::EPriorityLow);
102 iStarter->Start(TCallBack(StartL, this));
105 TBool CSDLAppUi::StartL(void* aThis)
107 static_cast<CSDLAppUi*>(aThis)->StartL();
108 return EFalse;
111 void CSDLAppUi::StartL()
113 iTicker = new Ticker;
114 iSdl->CallMainL();
115 Exit();
118 void CSDLAppUi::HandleCommandL(int aCommand)
120 switch(aCommand)
122 case EAknSoftkeyBack:
123 case EAknSoftkeyExit:
124 case EAknCmdExit:
125 case EEikCmdExit:
126 if(iSdl == NULL)
128 Exit();
130 else
132 TWsEvent event;
133 event.SetType(EEventSwitchOff), event.SetTimeNow();
134 iSdl->AppendWsEvent(event);
136 break;
138 default:
139 break;
143 void CSDLAppUi::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination)
145 if(iSdl)
147 if(aEvent.Type() == KAknUidValueEndKeyCloseEvent)
149 TWsEvent event;
150 event.SetType(EEventSwitchOff), event.SetTimeNow();
151 iSdl->AppendWsEvent(event);
152 return;
154 else
156 iSdl->AppendWsEvent(aEvent);
160 CAknAppUi::HandleWsEventL(aEvent, aDestination);
163 void CSDLAppUi::HandleResourceChangeL(int aType)
165 CAknAppUi::HandleResourceChangeL(aType);
166 if(aType == KEikDynamicLayoutVariantSwitch)
168 iSDLWin->SetRect(ApplicationRect());
169 iSdl->SetContainerWindowL(iSDLWin->GetWindow(), iEikonEnv->WsSession(), *iEikonEnv->ScreenDevice());
170 iSdl->Resize();
174 void CSDLAppUi::HandleForegroundEventL(TBool aForeground)
176 CAknAppUi::HandleForegroundEventL(aForeground);
179 ////////////////////////////////////////////////////////////////////////////
181 class CSDLDocument : public CEikDocument
183 public:
184 CSDLDocument(CEikApplication& aApp) : CEikDocument(aApp) {}
186 private:
187 CEikAppUi* CreateAppUiL() { return new CSDLAppUi; }
190 ////////////////////////////////////////////////////////////////////////
192 class CSDLApplication : public CAknApplication
194 public:
195 CSDLApplication();
197 private:
198 CApaDocument* CreateDocumentL() { return new CSDLDocument(*this); }
199 TUid AppDllUid() const { return iUid; }
201 TUid iUid;
204 CSDLApplication::CSDLApplication()
206 RApaLsSession apa;
207 User::LeaveIfError(apa.Connect());
208 CleanupClosePushL(apa);
209 User::LeaveIfError(apa.GetAllApps());
210 TFileName name = RProcess().FileName();
211 TApaAppInfo info;
212 while(apa.GetNextApp(info) == KErrNone)
214 if(info.iFullName.CompareF(name) == 0)
216 iUid = info.iUid;
217 break;
220 CleanupStack::PopAndDestroy();
223 ////////////////////////////////////////////////////////////////////////
225 CApaApplication* NewApplication()
227 return new CSDLApplication();
230 int E32Main()
232 return EikStart::RunApplication(NewApplication);