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 int ProfileWatcher::GetProfile()
99 m_repository
->Get(KProEngActiveProfile
, value
);
103 void ProfileWatcher::DoCancel()
105 m_repository
->NotifyCancel(KProEngActiveProfile
);
108 void ProfileWatcher::RunL()
111 if(m_repository
->Get(KProEngActiveProfile
, value
) == KErrNone
)
113 m_observer
.ProfileChanged(value
);
115 m_repository
->NotifyRequest(KProEngActiveProfile
, iStatus
);
120 class CSdlAppServ
: public CActive
123 CSdlAppServ() : CActive(CActive::EPriorityIdle
)
125 CActiveScheduler::Add(this);
128 ~CSdlAppServ() { Cancel(); }
131 TRequestStatus
* status
= &iStatus
;
132 User::RequestComplete(status
, KErrNone
);
139 TRequestStatus
* status
= &iStatus
;
140 User::RequestComplete(status
, KErrCancel
);
144 bool EpocSdlEnv::IsDsaAvailable()
146 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
147 return gEpocEnv
->iDsa
!= NULL
&& gEpocEnv
->iDsa
->IsDsaAvailable();
150 int EpocSdlEnv::AllocSurface(const TSize
& aSize
, TDisplayMode aMode
)
152 return gEpocEnv
->iDsa
->AllocSurface(aSize
, aMode
);
155 void EpocSdlEnv::UnlockHwSurface()
157 gEpocEnv
->iDsa
->UnlockHwSurface();
160 TUint8
* EpocSdlEnv::LockHwSurface()
162 return gEpocEnv
->iDsa
->LockSurface();
165 void EpocSdlEnv::UpdateSwSurface()
167 gEpocEnv
->iDsa
->UpdateSwSurface();
170 bool EpocSdlEnv::AddUpdateRect(TUint8
* aAddress
, const TRect
& aUpdateRect
, const TRect
& aRect
)
172 return gEpocEnv
->iDsa
->AddUpdateRect(aAddress
, aUpdateRect
, aRect
);
175 TDisplayMode
EpocSdlEnv::DisplayMode()
177 return gEpocEnv
->iDsa
== NULL
? ENone
: gEpocEnv
->iDsa
->DisplayMode();
180 int EpocSdlEnv::SetPalette(int aFirstcolor
, int aColorCount
, TUint32
* aPalette
)
182 return gEpocEnv
->iDsa
->SetPalette(aFirstcolor
, aColorCount
, aPalette
);
185 int EpocSdlEnv::AppendCleanupItem(const TSdlCleanupItem
& aItem
)
187 TRAPD(err
, gEpocEnv
->iCleanupItems
->AppendL(aItem
));
191 void EpocSdlEnv::RemoveCleanupItem(void* aItem
)
193 for(int i
= 0; i
< gEpocEnv
->iCleanupItems
->Count(); i
++)
195 if(gEpocEnv
->iCleanupItems
->At(i
).iItem
== aItem
)
196 gEpocEnv
->iCleanupItems
->Delete(i
);
200 void EpocSdlEnv::CleanupItems()
202 const TThreadId id
= RThread().Id();
203 int last
= gEpocEnv
->iCleanupItems
->Count() - 1;
206 for(i
= last
; i
>= 0 ; i
--)
208 TSdlCleanupItem
& item
= gEpocEnv
->iCleanupItems
->At(i
);
209 if(item
.iThread
== id
)
211 item
.iThread
= TThreadId(0);
212 item
.iOperation(item
.iItem
);
216 last
= gEpocEnv
->iCleanupItems
->Count() - 1;
218 for(i
= last
; i
>= 0 ; i
--)
220 TSdlCleanupItem
& item
= gEpocEnv
->iCleanupItems
->At(i
);
221 if(item
.iThread
== TThreadId(0))
223 gEpocEnv
->iCleanupItems
->Delete(i
);
228 void EpocSdlEnv::FreeSurface()
230 gEpocEnv
->iAppSrv
->Request();
232 if(gEpocEnv
->iDsa
!= NULL
)
234 gEpocEnv
->iDsa
->Stop();
235 gEpocEnv
->iDsa
->Free();
239 void EpocSdlEnvData::Free()
245 void EpocSdlEnvData::Delete()
256 gEpocEnv
->iCleanupItems
= new CArrayFixFlat
<TSdlCleanupItem
>(8);
258 char** argv
= new char*[1];
259 argv
[0] = new char[8];
260 strcpy(argv
[0], "app.exe");
262 int ret
= SDL_main( 1, argv
);
272 TRAPD(err
, err
= MainL());
274 // Free resources and return
275 EpocSdlEnv::CleanupItems();
277 gEpocEnv
->iCleanupItems
->Reset();
278 delete gEpocEnv
->iCleanupItems
;
279 gEpocEnv
->iCleanupItems
= NULL
;
281 gEpocEnv
->Free(); //free up in thread resources
287 : m_orientationWait( false )
288 , m_soundPauseReason( SPR_NONE
)
289 , m_profileWatcher( new ProfileWatcher(*this) )
291 if(m_profileWatcher
->GetProfile() == 1)
293 m_soundPauseReason
|= SPR_SILENTPROFILE
;
296 __ASSERT_ALWAYS(gEpocEnv
== NULL
, PANIC(KErrAlreadyExists
));
297 gEpocEnv
= new EpocSdlEnvData
;
298 Mem::FillZ(gEpocEnv
, sizeof(EpocSdlEnvData
));
300 m_eventQueue
= new CEventQueue();
302 gEpocEnv
->iAppSrv
= new CSdlAppServ();
309 delete m_profileWatcher
;
322 void CSDL::SetContainerWindowL(RWindow
& aWindow
, RWsSession
& aSession
, CWsScreenDevice
& aDevice
)
324 if(gEpocEnv
->iDsa
== NULL
)
325 gEpocEnv
->iDsa
= CDsa::CreateL(aSession
);
326 gEpocEnv
->iDsa
->ConstructL(aWindow
, aDevice
);
329 int EpocSdlEnv::ApplyGlesDsa()
332 TRAPD(err
, dsa
= gEpocEnv
->iDsa
->CreateGlesDsaL());
333 gEpocEnv
->iDsa
= dsa
;
337 RWindow
* EpocSdlEnv::Window()
339 return gEpocEnv
->iDsa
->Window();
342 void CSDL::CallMainL()
344 ASSERT(gEpocEnv
!= NULL
);
346 // for handling volume up/down keys
347 CRemConInterfaceSelector
*iSelector
= CRemConInterfaceSelector::NewL();
348 CRemConCoreApiTarget::NewL( *iSelector
, *this );
349 iSelector
->OpenTargetL();
351 // when priority is not lowered screen updates much more frequently, which
352 // may be undesired, for example in case of openttd's generating world dialog
353 RThread().SetPriority(EPriorityLess
);
357 void CSDL::AppendWsEvent(const TWsEvent
& aEvent
)
359 m_eventQueue
->Append(aEvent
);
364 if(m_orientationWait
)
366 EpocSdlEnv::AllocSurface(m_size
, m_mode
);
367 m_orientationWait
= false;
371 TSize size
= gEpocEnv
->iDsa
->Window()->Size();
372 SDL_PrivateResize(size
.iWidth
, size
.iHeight
);
376 void CSDL::SetOrientation(CAknAppUi::TAppUiOrientation orientation
, const TSize
& aSize
, TDisplayMode aMode
)
378 m_orientationWait
= true;
382 TRAPD(err
, static_cast<CAknAppUi
*>(CEikonEnv::Static()->EikAppUi())->SetOrientationL(orientation
));
385 void CSDL::SetFocus(bool focused
)
389 m_soundPauseReason
&= ~SPR_FOCUSLOST
;
393 m_soundPauseReason
|= SPR_FOCUSLOST
;
397 void CSDL::MrccatoCommand(TRemConCoreApiOperationId aOperationId
, TRemConCoreApiButtonAction aButtonAct
)
399 if(aButtonAct
!= ERemConCoreApiButtonClick
)
403 event
.SetType(EEventKey
);
408 case ERemConCoreApiVolumeDown
:
409 event
.Key()->iScanCode
= EStdKeyDecVolume
;
410 event
.SetType(EEventKeyDown
);
411 AppendWsEvent(event
);
412 event
.SetType(EEventKeyUp
);
413 AppendWsEvent(event
);
416 case ERemConCoreApiVolumeUp
:
417 event
.Key()->iScanCode
= EStdKeyIncVolume
;
418 event
.SetType(EEventKeyDown
);
419 AppendWsEvent(event
);
420 event
.SetType(EEventKeyUp
);
421 AppendWsEvent(event
);
429 void CSDL::ProfileChanged(int profile
)
431 // Check for silent profile
434 m_soundPauseReason
|= SPR_SILENTPROFILE
;
438 m_soundPauseReason
&= ~SPR_SILENTPROFILE
;