2 #include "SDL_events_c.h"
5 #include "sdlepocapi.h"
13 #include "SDL_epocevents_c.h"
14 #include "SDL_keysym.h"
16 #include "SDL_loadso.h"
17 #include <remconcoreapitargetobserver.h>
18 #include <remconinterfaceselector.h>
19 #include <remconcoreapitarget.h>
31 CEventQueue
* iEventQueue
;
34 CArrayFix
<TSdlCleanupItem
>* iCleanupItems
;
36 bool iWaitingForOrientationChange
;
42 EpocSdlEnvData
* gEpocEnv
;
44 static void RunSingleThread()
46 if(RThread().RequestCount() > 0)
49 if(CActiveScheduler::RunIfReady(err
, CActive::EPriorityIdle
))
51 CActiveScheduler::Current()->WaitForAnyRequest();
56 int Panic(int aErr
, int aLine
)
59 b
.Format(_L("Main at %d"), aLine
);
65 bool CEventQueue::HasData()
68 return !m_queue
.empty();
71 const TWsEvent
CEventQueue::Shift()
73 const TWsEvent event
= m_queue
.front();
79 TSdlCleanupItem::TSdlCleanupItem(TSdlCleanupOperation aOperation
, void* aItem
) :
80 iOperation(aOperation
), iItem(aItem
), iThread(RThread().Id())
83 class CSdlAppServ
: public CActive
86 CSdlAppServ() : CActive(CActive::EPriorityIdle
)
88 CActiveScheduler::Add(this);
91 ~CSdlAppServ() { Cancel(); }
94 TRequestStatus
* status
= &iStatus
;
95 User::RequestComplete(status
, KErrNone
);
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
));
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;
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()
214 void EpocSdlEnvData::Delete()
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
);
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
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;
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()
288 TRAPD(err
, dsa
= gEpocEnv
->iDsa
->CreateGlesDsaL());
289 gEpocEnv
->iDsa
= dsa
;
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
);
332 void CSDL::AppendWsEvent(const TWsEvent
& aEvent
)
334 EpocSdlEnv::EventQueue().Append(aEvent
);
339 if(gEpocEnv
->iWaitingForOrientationChange
)
341 EpocSdlEnv::AllocSurface(gEpocEnv
->iSize
, gEpocEnv
->iMode
);
342 gEpocEnv
->iWaitingForOrientationChange
= false;
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
)
357 event
.SetType(EEventKey
);
362 case ERemConCoreApiVolumeDown
:
363 event
.Key()->iScanCode
= EStdKeyDecVolume
;
364 event
.SetType(EEventKeyDown
);
365 AppendWsEvent(event
);
366 event
.SetType(EEventKeyUp
);
367 AppendWsEvent(event
);
370 case ERemConCoreApiVolumeUp
:
371 event
.Key()->iScanCode
= EStdKeyIncVolume
;
372 event
.SetType(EEventKeyDown
);
373 AppendWsEvent(event
);
374 event
.SetType(EEventKeyUp
);
375 AppendWsEvent(event
);