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>
20 #include "ProfileWatcher.h"
36 CArrayFix
<TSdlCleanupItem
>* iCleanupItems
;
39 EpocSdlEnvData
* gEpocEnv
;
41 static void RunSingleThread()
43 if(RThread().RequestCount() > 0)
46 if(CActiveScheduler::RunIfReady(err
, CActive::EPriorityIdle
))
48 CActiveScheduler::Current()->WaitForAnyRequest();
53 int Panic(int aErr
, int aLine
)
56 b
.Format(_L("Main at %d"), aLine
);
61 bool CEventQueue::HasData()
64 return !m_queue
.empty();
67 const TWsEvent
CEventQueue::Shift()
69 const TWsEvent event
= m_queue
.front();
75 TSdlCleanupItem::TSdlCleanupItem(TSdlCleanupOperation aOperation
, void* aItem
) :
76 iOperation(aOperation
), iItem(aItem
), iThread(RThread().Id())
80 ProfileWatcher::ProfileWatcher(MProfileWatcher
& observer
)
81 : CActive(EPriorityLow
)
82 , m_repository(CRepository::NewL(KCRUidProfileEngine
))
83 , m_observer(observer
)
85 CActiveScheduler::Add(this);
86 m_repository
->NotifyRequest(KProEngActiveProfile
, iStatus
);
90 ProfileWatcher::~ProfileWatcher()
96 void ProfileWatcher::DoCancel()
98 m_repository
->NotifyCancel(KProEngActiveProfile
);
101 void ProfileWatcher::RunL()
104 if(m_repository
->Get(KProEngActiveProfile
, value
) == KErrNone
)
106 m_observer
.ProfileChanged(value
);
108 m_repository
->NotifyRequest(KProEngActiveProfile
, iStatus
);
113 class CSdlAppServ
: public CActive
116 CSdlAppServ() : CActive(CActive::EPriorityIdle
)
118 CActiveScheduler::Add(this);
121 ~CSdlAppServ() { Cancel(); }
124 TRequestStatus
* status
= &iStatus
;
125 User::RequestComplete(status
, KErrNone
);
132 TRequestStatus
* status
= &iStatus
;
133 User::RequestComplete(status
, KErrCancel
);
137 bool EpocSdlEnv::IsDsaAvailable()
139 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
140 return gEpocEnv
->iDsa
!= NULL
&& gEpocEnv
->iDsa
->IsDsaAvailable();
143 int EpocSdlEnv::AllocSurface(const TSize
& aSize
, TDisplayMode aMode
)
145 return gEpocEnv
->iDsa
->AllocSurface(aSize
, aMode
);
148 void EpocSdlEnv::UnlockHwSurface()
150 gEpocEnv
->iDsa
->UnlockHwSurface();
153 TUint8
* EpocSdlEnv::LockHwSurface()
155 return gEpocEnv
->iDsa
->LockHwSurface();
158 void EpocSdlEnv::UpdateSwSurface()
160 gEpocEnv
->iDsa
->UpdateSwSurface();
163 bool EpocSdlEnv::AddUpdateRect(TUint8
* aAddress
, const TRect
& aUpdateRect
, const TRect
& aRect
)
165 return gEpocEnv
->iDsa
->AddUpdateRect(aAddress
, aUpdateRect
, aRect
);
168 TDisplayMode
EpocSdlEnv::DisplayMode()
170 return gEpocEnv
->iDsa
== NULL
? ENone
: gEpocEnv
->iDsa
->DisplayMode();
173 int EpocSdlEnv::SetPalette(int aFirstcolor
, int aColorCount
, TUint32
* aPalette
)
175 return gEpocEnv
->iDsa
->SetPalette(aFirstcolor
, aColorCount
, aPalette
);
178 int EpocSdlEnv::AppendCleanupItem(const TSdlCleanupItem
& aItem
)
180 TRAPD(err
, gEpocEnv
->iCleanupItems
->AppendL(aItem
));
184 void EpocSdlEnv::RemoveCleanupItem(void* aItem
)
186 for(int i
= 0; i
< gEpocEnv
->iCleanupItems
->Count(); i
++)
188 if(gEpocEnv
->iCleanupItems
->At(i
).iItem
== aItem
)
189 gEpocEnv
->iCleanupItems
->Delete(i
);
193 void EpocSdlEnv::CleanupItems()
195 const TThreadId id
= RThread().Id();
196 int last
= gEpocEnv
->iCleanupItems
->Count() - 1;
199 for(i
= last
; i
>= 0 ; i
--)
201 TSdlCleanupItem
& item
= gEpocEnv
->iCleanupItems
->At(i
);
202 if(item
.iThread
== id
)
204 item
.iThread
= TThreadId(0);
205 item
.iOperation(item
.iItem
);
209 last
= gEpocEnv
->iCleanupItems
->Count() - 1;
211 for(i
= last
; i
>= 0 ; i
--)
213 TSdlCleanupItem
& item
= gEpocEnv
->iCleanupItems
->At(i
);
214 if(item
.iThread
== TThreadId(0))
216 gEpocEnv
->iCleanupItems
->Delete(i
);
221 void EpocSdlEnv::FreeSurface()
223 gEpocEnv
->iAppSrv
->Request();
225 if(gEpocEnv
->iDsa
!= NULL
)
227 gEpocEnv
->iDsa
->Stop();
228 gEpocEnv
->iDsa
->Free();
232 void EpocSdlEnvData::Free()
238 void EpocSdlEnvData::Delete()
249 gEpocEnv
->iCleanupItems
= new CArrayFixFlat
<TSdlCleanupItem
>(8);
251 char** argv
= new char*[1];
252 argv
[0] = new char[8];
253 strcpy(argv
[0], "app.exe");
255 int ret
= SDL_main( 1, argv
);
265 TRAPD(err
, err
= MainL());
267 // Free resources and return
268 EpocSdlEnv::CleanupItems();
270 gEpocEnv
->iCleanupItems
->Reset();
271 delete gEpocEnv
->iCleanupItems
;
272 gEpocEnv
->iCleanupItems
= NULL
;
274 gEpocEnv
->Free(); //free up in thread resources
280 : m_orientationWait( false )
281 , m_soundPauseReason( SPR_NONE
)
282 , m_profileWatcher( new ProfileWatcher(*this) )
284 __ASSERT_ALWAYS(gEpocEnv
== NULL
, PANIC(KErrAlreadyExists
));
285 gEpocEnv
= new EpocSdlEnvData
;
286 Mem::FillZ(gEpocEnv
, sizeof(EpocSdlEnvData
));
288 m_eventQueue
= new CEventQueue();
290 gEpocEnv
->iAppSrv
= new CSdlAppServ();
297 delete m_profileWatcher
;
310 void CSDL::SetContainerWindowL(RWindow
& aWindow
, RWsSession
& aSession
, CWsScreenDevice
& aDevice
)
312 if(gEpocEnv
->iDsa
== NULL
)
313 gEpocEnv
->iDsa
= CDsa::CreateL(aSession
);
314 gEpocEnv
->iDsa
->ConstructL(aWindow
, aDevice
);
317 int EpocSdlEnv::ApplyGlesDsa()
320 TRAPD(err
, dsa
= gEpocEnv
->iDsa
->CreateGlesDsaL());
321 gEpocEnv
->iDsa
= dsa
;
325 RWindow
* EpocSdlEnv::Window()
327 return gEpocEnv
->iDsa
->Window();
330 void CSDL::CallMainL()
332 ASSERT(gEpocEnv
!= NULL
);
334 // for handling volume up/down keys
335 CRemConInterfaceSelector
*iSelector
= CRemConInterfaceSelector::NewL();
336 CRemConCoreApiTarget::NewL( *iSelector
, *this );
337 iSelector
->OpenTargetL();
339 // when priority is not lowered screen updates much more frequently, which
340 // may be undesired, for example in case of openttd's generating world dialog
341 RThread().SetPriority(EPriorityLess
);
345 void CSDL::AppendWsEvent(const TWsEvent
& aEvent
)
347 m_eventQueue
->Append(aEvent
);
352 if(m_orientationWait
)
354 EpocSdlEnv::AllocSurface(m_size
, m_mode
);
355 m_orientationWait
= false;
359 TSize size
= gEpocEnv
->iDsa
->Window()->Size();
360 SDL_PrivateResize(size
.iWidth
, size
.iHeight
);
364 void CSDL::SetOrientation(CAknAppUi::TAppUiOrientation orientation
, const TSize
& aSize
, TDisplayMode aMode
)
366 m_orientationWait
= true;
370 TRAPD(err
, static_cast<CAknAppUi
*>(CEikonEnv::Static()->EikAppUi())->SetOrientationL(orientation
));
373 void CSDL::SetFocus(bool focused
)
377 m_soundPauseReason
&= ~SPR_FOCUSLOST
;
381 m_soundPauseReason
|= SPR_FOCUSLOST
;
385 void CSDL::MrccatoCommand(TRemConCoreApiOperationId aOperationId
, TRemConCoreApiButtonAction aButtonAct
)
387 if(aButtonAct
!= ERemConCoreApiButtonClick
)
391 event
.SetType(EEventKey
);
396 case ERemConCoreApiVolumeDown
:
397 event
.Key()->iScanCode
= EStdKeyDecVolume
;
398 event
.SetType(EEventKeyDown
);
399 AppendWsEvent(event
);
400 event
.SetType(EEventKeyUp
);
401 AppendWsEvent(event
);
404 case ERemConCoreApiVolumeUp
:
405 event
.Key()->iScanCode
= EStdKeyIncVolume
;
406 event
.SetType(EEventKeyDown
);
407 AppendWsEvent(event
);
408 event
.SetType(EEventKeyUp
);
409 AppendWsEvent(event
);
417 void CSDL::ProfileChanged(int profile
)
419 // Check for silent profile
422 m_soundPauseReason
|= SPR_SILENTPROFILE
;
426 m_soundPauseReason
&= ~SPR_SILENTPROFILE
;