Remove TMainFunc.
[SDL.s60v3.git] / src / main / symbian / SDL_main.cpp
blobe5fe82d51e3f6d628e36e8b4458bc0d48593a596
1 extern "C" {
2 #include "SDL_events_c.h"
4 #include "epoc_sdl.h"
5 #include "sdlepocapi.h"
6 #include <e32base.h>
7 #include <estlib.h>
8 #include <stdio.h>
9 #include <badesca.h>
10 #include <w32std.h>
11 #include <aknappui.h>
12 #include <aknapp.h>
13 #include "SDL_epocevents_c.h"
14 #include "SDL_keysym.h"
15 #include "dsa.h"
16 #include "SDL_loadso.h"
17 #include <remconcoreapitargetobserver.h>
18 #include <remconinterfaceselector.h>
19 #include <remconcoreapitarget.h>
21 class CCurrentAppUi;
22 class CEikonEnv;
23 class CSdlAppServ;
24 class CEventQueue;
26 class EpocSdlEnvData
28 public:
29 void Free();
30 void Delete();
31 CEventQueue* iEventQueue;
32 CDsa* iDsa;
33 CSdlAppServ* iAppSrv;
34 CArrayFix<TSdlCleanupItem>* iCleanupItems;
35 CSDL* iSdl;
36 bool iWaitingForOrientationChange;
38 TSize iSize;
39 TDisplayMode iMode;
42 EpocSdlEnvData* gEpocEnv;
44 static void RunSingleThread()
46 if(RThread().RequestCount() > 0)
48 int err;
49 if(CActiveScheduler::RunIfReady(err, CActive::EPriorityIdle))
51 CActiveScheduler::Current()->WaitForAnyRequest();
56 int Panic(int aErr, int aLine)
58 TBuf<64> b;
59 b.Format(_L("Main at %d"), aLine);
60 User::Panic(b, aErr);
61 return 0;
65 bool CEventQueue::HasData()
67 RunSingleThread();
68 return !m_queue.empty();
71 const TWsEvent CEventQueue::Shift()
73 const TWsEvent event = m_queue.front();
74 m_queue.pop();
75 return event;
79 TSdlCleanupItem::TSdlCleanupItem(TSdlCleanupOperation aOperation, void* aItem) :
80 iOperation(aOperation), iItem(aItem), iThread(RThread().Id())
83 class CSdlAppServ : public CActive
85 public:
86 CSdlAppServ() : CActive(CActive::EPriorityIdle)
88 CActiveScheduler::Add(this);
89 SetActive();
91 ~CSdlAppServ() { Cancel(); }
92 void Request()
94 TRequestStatus* status = &iStatus;
95 User::RequestComplete(status, KErrNone);
98 private:
99 void RunL() {}
100 void DoCancel()
102 TRequestStatus* status = &iStatus;
103 User::RequestComplete(status, KErrCancel);
107 CEventQueue& EpocSdlEnv::EventQueue()
109 __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
110 return *gEpocEnv->iEventQueue;
113 TBool EpocSdlEnv::IsDsaAvailable()
115 __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
116 return gEpocEnv->iDsa != NULL && gEpocEnv->iDsa->IsDsaAvailable();
119 int EpocSdlEnv::AllocSurface(const TSize& aSize, TDisplayMode aMode)
121 return gEpocEnv->iDsa->AllocSurface(aSize, aMode);
124 void EpocSdlEnv::UnlockHwSurface()
126 gEpocEnv->iDsa->UnlockHwSurface();
129 TUint8* EpocSdlEnv::LockHwSurface()
131 return gEpocEnv->iDsa->LockHwSurface();
134 void EpocSdlEnv::UpdateSwSurface()
136 gEpocEnv->iDsa->UpdateSwSurface();
139 TBool EpocSdlEnv::AddUpdateRect(TUint8* aAddress, const TRect& aUpdateRect, const TRect& aRect)
141 return gEpocEnv->iDsa->AddUpdateRect(aAddress, aUpdateRect, aRect);
144 TDisplayMode EpocSdlEnv::DisplayMode()
146 return gEpocEnv->iDsa == NULL ? ENone : gEpocEnv->iDsa->DisplayMode();
149 int EpocSdlEnv::SetPalette(int aFirstcolor, int aColorCount, TUint32* aPalette)
151 return gEpocEnv->iDsa->SetPalette(aFirstcolor, aColorCount, aPalette);
154 int EpocSdlEnv::AppendCleanupItem(const TSdlCleanupItem& aItem)
156 TRAPD(err, gEpocEnv->iCleanupItems->AppendL(aItem));
157 return err;
160 void EpocSdlEnv::RemoveCleanupItem(void* aItem)
162 for(int i = 0; i < gEpocEnv->iCleanupItems->Count(); i++)
164 if(gEpocEnv->iCleanupItems->At(i).iItem == aItem)
165 gEpocEnv->iCleanupItems->Delete(i);
169 void EpocSdlEnv::CleanupItems()
171 const TThreadId id = RThread().Id();
172 int last = gEpocEnv->iCleanupItems->Count() - 1;
173 int i;
175 for(i = last; i >= 0 ; i--)
177 TSdlCleanupItem& item = gEpocEnv->iCleanupItems->At(i);
178 if(item.iThread == id)
180 item.iThread = TThreadId(0);
181 item.iOperation(item.iItem);
185 last = gEpocEnv->iCleanupItems->Count() - 1;
187 for(i = last; i >= 0 ; i--)
189 TSdlCleanupItem& item = gEpocEnv->iCleanupItems->At(i);
190 if(item.iThread == TThreadId(0))
192 gEpocEnv->iCleanupItems->Delete(i);
197 void EpocSdlEnv::FreeSurface()
199 gEpocEnv->iAppSrv->Request();
201 if(gEpocEnv->iDsa != NULL)
203 gEpocEnv->iDsa->Stop();
204 gEpocEnv->iDsa->Free();
208 void EpocSdlEnvData::Free()
210 if(iDsa != NULL)
211 iDsa->Free();
214 void EpocSdlEnvData::Delete()
216 delete iEventQueue;
218 if(iDsa != NULL)
219 iDsa->Free();
221 delete iDsa;
222 delete iAppSrv;
225 static int MainL()
227 gEpocEnv->iCleanupItems = new CArrayFixFlat<TSdlCleanupItem>(8);
229 char** argv = new char*[1];
230 argv[0] = new char[8];
231 strcpy(argv[0], "app.exe");
233 int ret = SDL_main( 1, argv );
235 delete[] argv[0];
236 delete[] argv;
238 return ret;
241 static int DoMain()
243 TRAPD(err, err = MainL());
245 // Free resources and return
246 EpocSdlEnv::CleanupItems();
248 gEpocEnv->iCleanupItems->Reset();
249 delete gEpocEnv->iCleanupItems;
250 gEpocEnv->iCleanupItems = NULL;
252 gEpocEnv->Free(); //free up in thread resources
254 return err;
257 CSDL::CSDL()
259 __ASSERT_ALWAYS(gEpocEnv == NULL, PANIC(KErrAlreadyExists));
260 gEpocEnv = new EpocSdlEnvData;
261 Mem::FillZ(gEpocEnv, sizeof(EpocSdlEnvData));
263 gEpocEnv->iEventQueue = new CEventQueue();
264 gEpocEnv->iAppSrv = new CSdlAppServ();
266 gEpocEnv->iSdl = this;
269 CSDL::~CSDL()
271 gEpocEnv->Free();
272 gEpocEnv->Delete();
274 delete gEpocEnv;
275 gEpocEnv = NULL;
278 void CSDL::SetContainerWindowL(RWindow& aWindow, RWsSession& aSession, CWsScreenDevice& aDevice)
280 if(gEpocEnv->iDsa == NULL)
281 gEpocEnv->iDsa = CDsa::CreateL(aSession);
282 gEpocEnv->iDsa->ConstructL(aWindow, aDevice);
285 int EpocSdlEnv::ApplyGlesDsa()
287 CDsa* dsa = NULL;
288 TRAPD(err, dsa = gEpocEnv->iDsa->CreateGlesDsaL());
289 gEpocEnv->iDsa = dsa;
290 return err;
293 RWindow* EpocSdlEnv::Window()
295 return gEpocEnv->iDsa->Window();
298 void EpocSdlEnv::UpdateWholeScreen(bool val)
300 gEpocEnv->iDsa->m_updateWholeScreen = val;
303 bool EpocSdlEnv::GetUpdateWholeScreen()
305 return gEpocEnv->iDsa->m_updateWholeScreen;
308 void EpocSdlEnv::SetOrientation(CAknAppUi::TAppUiOrientation orientation, const TSize& aSize, TDisplayMode aMode)
310 gEpocEnv->iWaitingForOrientationChange = true;
311 gEpocEnv->iSize = aSize;
312 gEpocEnv->iMode = aMode;
314 TRAPD(err, static_cast<CAknAppUi*>(CEikonEnv::Static()->EikAppUi())->SetOrientationL(orientation));
317 void CSDL::CallMainL()
319 ASSERT(gEpocEnv != NULL);
321 // for handling volume up/down keys
322 CRemConInterfaceSelector *iSelector = CRemConInterfaceSelector::NewL();
323 CRemConCoreApiTarget::NewL( *iSelector, *this );
324 iSelector->OpenTargetL();
326 // when priority is not lowered screen updates much more frequently, which
327 // may be undesired, for example in case of openttd's generating world dialog
328 RThread().SetPriority(EPriorityLess);
329 DoMain();
332 void CSDL::AppendWsEvent(const TWsEvent& aEvent)
334 EpocSdlEnv::EventQueue().Append(aEvent);
337 void CSDL::Resize()
339 if(gEpocEnv->iWaitingForOrientationChange)
341 EpocSdlEnv::AllocSurface(gEpocEnv->iSize, gEpocEnv->iMode);
342 gEpocEnv->iWaitingForOrientationChange = false;
344 else
346 TSize size = gEpocEnv->iDsa->Window()->Size();
347 SDL_PrivateResize(size.iWidth, size.iHeight);
351 void CSDL::MrccatoCommand(TRemConCoreApiOperationId aOperationId, TRemConCoreApiButtonAction aButtonAct)
353 if(aButtonAct != ERemConCoreApiButtonClick)
354 return;
356 TWsEvent event;
357 event.SetType(EEventKey);
358 event.SetTimeNow();
360 switch(aOperationId)
362 case ERemConCoreApiVolumeDown:
363 event.Key()->iScanCode = EStdKeyDecVolume;
364 event.SetType(EEventKeyDown);
365 AppendWsEvent(event);
366 event.SetType(EEventKeyUp);
367 AppendWsEvent(event);
368 break;
370 case ERemConCoreApiVolumeUp:
371 event.Key()->iScanCode = EStdKeyIncVolume;
372 event.SetType(EEventKeyDown);
373 AppendWsEvent(event);
374 event.SetType(EEventKeyUp);
375 AppendWsEvent(event);
376 break;
378 default:
379 break;