2 #include "SDL_events_c.h"
6 #include "sdlepocapi.h"
14 #include "SDL_epocevents_c.h"
15 #include "SDL_keysym.h"
17 #include "SDL_loadso.h"
19 extern SDLKey
* KeyMap();
20 extern void ResetKeyMap();
27 NONSHARABLE_CLASS(EpocSdlEnvData
)
32 CEventQueue
* iEventQueue
;
40 CArrayFix
<TSdlCleanupItem
>* iCleanupItems
;
42 TRequestStatus
* iCallerStatus
;
43 bool iWaitingForOrientationChange
;
49 EpocSdlEnvData
* gEpocEnv
;
51 NONSHARABLE_CLASS(EnvUtils
)
54 static inline TBool
IsOwnThreaded();
55 static TBool
Rendezvous(RThread
& aThread
, TRequestStatus
& aStatus
);
56 static void RunSingleThread();
59 inline TBool
EnvUtils::IsOwnThreaded()
61 return gEpocEnv
->iEpocEnvFlags
& CSDL::EOwnThread
;
64 void EnvUtils::RunSingleThread()
66 if(!EnvUtils::IsOwnThreaded())
68 int count
= RThread().RequestCount();
72 if(CActiveScheduler::RunIfReady(err
, CActive::EPriorityIdle
))
74 CActiveScheduler::Current()->WaitForAnyRequest();
80 int Panic(int aErr
, int aLine
)
83 b
.Format(_L("Main at %d"), aLine
);
89 class CEventQueue
: public CBase
, public MEventQueue
94 int Append(const TWsEvent
& aEvent
);
95 const TWsEvent
Shift();
101 std::queue
<TWsEvent
> m_queue
;
102 RCriticalSection iCS
;
105 void CEventQueue::ConstructL()
107 if(EnvUtils::IsOwnThreaded())
108 User::LeaveIfError(iCS
.CreateLocal());
111 CEventQueue::~CEventQueue()
116 int CEventQueue::Append(const TWsEvent
& aEvent
)
119 m_queue
.push(aEvent
);
125 TBool
CEventQueue::HasData()
127 EnvUtils::RunSingleThread();
128 return !m_queue
.empty();
131 void CEventQueue::Lock()
133 if(EnvUtils::IsOwnThreaded())
137 void CEventQueue::Unlock()
139 if(EnvUtils::IsOwnThreaded())
143 const TWsEvent
CEventQueue::Shift()
145 const TWsEvent event
= m_queue
.front();
151 TSdlCleanupItem::TSdlCleanupItem(TSdlCleanupOperation aOperation
, TAny
* aItem
) :
152 iOperation(aOperation
), iItem(aItem
), iThread(RThread().Id())
155 #define MAINFUNC(x) EXPORT_C TMainFunc::TMainFunc(mainfunc##x aFunc){Mem::FillZ(iMainFunc, sizeof(iMainFunc)); iMainFunc[x - 1] = (void*) aFunc;}
164 EXPORT_C
TMainFunc::TMainFunc()
166 Mem::FillZ(iMainFunc
, sizeof(iMainFunc
));
170 const void* TMainFunc::operator[](int aIndex
) const
172 return iMainFunc
[aIndex
];
176 NONSHARABLE_CLASS(CSdlAppServ
) : public CActive
181 EAppSrvNoop
= CDsa::ELastDsaRequest
,
184 EAppSrvWindowDisplayMode
,
185 EAppSrvWindowPointerCursorMode
,
193 int Request(int aService
);
194 int RequestValue(int aService
);
196 void PanicMain(int aReason
);
197 void PanicMain(const TDesC
& aInfo
, int aReason
);
198 void SetObserver(MSDLObserver
* aObserver
);
199 int ObserverEvent(int aEvent
, int aParam
);
200 void SetParam(int aParam
);
201 void HandleObserverValue(int aService
, int aReturnValue
, TBool aMainThread
);
202 MSDLObserver
* Observer();
207 const TThreadId iMainId
;
212 MSDLObserver
* iObserver
;
213 TRequestStatus
* iStatusPtr
;
216 CSdlAppServ::CSdlAppServ() : CActive(CActive::EPriorityHigh
), iMainId(RThread().Id()), iObserver( NULL
)
220 MSDLObserver
* CSdlAppServ::Observer()
225 void CSdlAppServ::SetObserver(MSDLObserver
* aObserver
)
227 iObserver
= aObserver
;
230 int CSdlAppServ::ObserverEvent(int aEvent
, int aParam
)
232 if(iObserver
!= NULL
)
234 if(RThread().Id() == gEpocEnv
->iId
&& EnvUtils::IsOwnThreaded())
236 return iObserver
->SdlThreadEvent(aEvent
, aParam
);
238 else if(RThread().Id() == iMainId
)
240 return iObserver
->SdlEvent(aEvent
, aParam
);
242 PANIC(KErrNotSupported
);
247 void CSdlAppServ::PanicMain(int aReason
)
249 iAppThread
.Panic(RThread().Name(), aReason
);
252 void CSdlAppServ::PanicMain(const TDesC
& aInfo
, int aReason
)
254 iAppThread
.Panic(aInfo
, aReason
);
257 void CSdlAppServ::ConstructL()
259 CActiveScheduler::Add(this);
260 if(EnvUtils::IsOwnThreaded())
261 User::LeaveIfError(iSema
.CreateLocal(1));
262 iStatus
= KRequestPending
;
263 iStatusPtr
= &iStatus
;
267 CSdlAppServ::~CSdlAppServ()
270 if(iSema
.Handle() != NULL
)
276 int CSdlAppServ::Request(int aService
)
278 if(EnvUtils::IsOwnThreaded())
280 if(RThread().Id() == iAppThread
.Id())
281 return KErrBadHandle
;
284 EnvUtils::RunSingleThread();
286 iAppThread
.RequestComplete(iStatusPtr
, KErrNone
);
290 int CSdlAppServ::RequestValue(int aService
)
293 Request(EAppSrvNoop
);
297 void CSdlAppServ::Init()
299 PANIC_IF_ERROR(iAppThread
.Open(iMainId
));
302 void CSdlAppServ::SetParam(int aParam
)
304 iReturnValue
= aParam
;
307 void CSdlAppServ::HandleObserverValue(int aService
, int aReturnValue
, TBool aMainThread
)
309 if(iObserver
!= NULL
&& aMainThread
)
313 case MSDLObserver::EEventScreenSizeChanged
:
314 if(aReturnValue
== MSDLObserver::EScreenSizeChangedDefaultPalette
)
315 EpocSdlEnv::LockPalette(EFalse
);
319 if(!aMainThread
&& aService
== MSDLObserver::EEventSuspend
)
321 if(iObserver
== NULL
|| (gEpocEnv
->iDsa
!= NULL
&& gEpocEnv
->iDsa
->Stopped() && aReturnValue
!= MSDLObserver::ESuspendNoSuspend
))
323 EpocSdlEnv::Suspend();
328 void CSdlAppServ::RunL()
330 if(iStatus
== KErrNone
)
334 case CSdlAppServ::EAppSrvWaitDsa
:
335 EpocSdlEnv::SetWaitDsa();
336 iReturnValue
= EpocSdlEnv::IsDsaAvailable();
339 case CSdlAppServ::EAppSrvStopThread
:
340 if(gEpocEnv
->iDsa
!= NULL
)
341 gEpocEnv
->iDsa
->SetSuspend();
344 case EAppSrvWindowPointerCursorMode
:
345 iReturnValue
= gEpocEnv
->iDsa
!= NULL
? gEpocEnv
->iDsa
->Session().PointerCursorMode() : KErrNotReady
;
348 case EAppSrvDsaStatus
:
349 if(gEpocEnv
->iDsa
!= NULL
)
350 gEpocEnv
->iDsa
->Stop();
351 iReturnValue
= KErrNone
;
357 case MSDLObserver::EEventResume
:
358 case MSDLObserver::EEventSuspend
:
359 case MSDLObserver::EEventScreenSizeChanged
:
360 case MSDLObserver::EEventWindowReserved
:
361 case MSDLObserver::EEventKeyMapInit
:
362 case MSDLObserver::EEventWindowNotAvailable
:
363 case MSDLObserver::EEventMainExit
:
364 iReturnValue
= ObserverEvent(iService
, iReturnValue
);
365 HandleObserverValue(iService
, iReturnValue
, ETrue
);
369 PANIC(KErrNotSupported
);
373 iStatus
= KRequestPending
;
374 iStatusPtr
= &iStatus
;
378 if(EnvUtils::IsOwnThreaded())
382 void CSdlAppServ::DoCancel()
384 if(EnvUtils::IsOwnThreaded())
386 TRequestStatus
* s
= &iStatus
;
387 iAppThread
.RequestComplete(s
, KErrCancel
);
390 MEventQueue
& EpocSdlEnv::EventQueue()
392 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
393 return *gEpocEnv
->iEventQueue
;
397 TBool
EpocSdlEnv::Flags(int aFlag
)
399 const int flag
= gEpocEnv
->iEpocEnvFlags
& aFlag
;
400 return flag
== aFlag
;
403 int EpocSdlEnv::Argc()
405 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
406 return gEpocEnv
->iArgc
;
409 char** EpocSdlEnv::Argv()
411 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
412 return gEpocEnv
->iArgv
;
415 TBool
EpocSdlEnv::IsDsaAvailable()
417 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
418 return gEpocEnv
->iDsa
!= NULL
&& gEpocEnv
->iDsa
->IsDsaAvailable();
421 void EpocSdlEnv::WaitDsaAvailable()
423 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventWindowNotAvailable
, 0);
424 gEpocEnv
->iAppSrv
->Request(CSdlAppServ::EAppSrvStopThread
);
425 if(EpocSdlEnv::Flags(CSDL::EEnableFocusStop
))
427 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventSuspend
, 0);
431 void EpocSdlEnv::Suspend()
433 if(gEpocEnv
->iDsa
!= NULL
&& (gEpocEnv
->iDsa
->Stopped() || EpocSdlEnv::Flags(CSDL::EEnableFocusStop
)))
435 gEpocEnv
->iDsa
->SetSuspend();
436 if(EnvUtils::IsOwnThreaded())
439 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventResume
, 0);
444 void EpocSdlEnv::SetWaitDsa()
446 if(!IsDsaAvailable())
448 if(EnvUtils::IsOwnThreaded())
451 th
.Open(gEpocEnv
->iId
);
455 if(gEpocEnv
->iDsa
!= NULL
)
456 gEpocEnv
->iDsa
->SetSuspend();
460 void EpocSdlEnv::Resume()
462 if(gEpocEnv
->iDsa
!= NULL
)
464 gEpocEnv
->iDsa
->Resume();
466 if(EnvUtils::IsOwnThreaded())
469 th
.Open(gEpocEnv
->iId
);
473 const int value
= gEpocEnv
->iAppSrv
->ObserverEvent(MSDLObserver::EEventResume
, 0);
474 gEpocEnv
->iAppSrv
->HandleObserverValue(MSDLObserver::EEventResume
, value
, ETrue
);
477 int EpocSdlEnv::AllocSurface(const TSize
& aSize
, TDisplayMode aMode
)
479 return gEpocEnv
->iDsa
->AllocSurface(aSize
, aMode
);
482 void EpocSdlEnv::UnlockHwSurface()
484 gEpocEnv
->iDsa
->UnlockHwSurface();
487 TUint8
* EpocSdlEnv::LockHwSurface()
489 return gEpocEnv
->iDsa
->LockHwSurface();
492 void EpocSdlEnv::UpdateSwSurface()
494 gEpocEnv
->iDsa
->UpdateSwSurface();
497 TBool
EpocSdlEnv::AddUpdateRect(TUint8
* aAddress
, const TRect
& aUpdateRect
, const TRect
& aRect
)
499 return gEpocEnv
->iDsa
->AddUpdateRect(aAddress
, aUpdateRect
, aRect
);
502 void EpocSdlEnv::Request(int aService
)
504 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
505 gEpocEnv
->iAppSrv
->Request(aService
);
508 TSize
EpocSdlEnv::WindowSize(const TSize
& aRequestedSize
)
510 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
511 return gEpocEnv
->iDsa
== NULL
? TSize(0, 0) : gEpocEnv
->iDsa
->WindowSize();
514 TSize
EpocSdlEnv::WindowSize()
516 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
517 return gEpocEnv
->iDsa
== NULL
? TSize(0, 0) : gEpocEnv
->iDsa
->WindowSize();
520 TDisplayMode
EpocSdlEnv::DisplayMode()
522 return gEpocEnv
->iDsa
== NULL
? ENone
: gEpocEnv
->iDsa
->DisplayMode();
525 TPointerCursorMode
EpocSdlEnv::PointerMode()
527 return static_cast<TPointerCursorMode
>(gEpocEnv
->iAppSrv
->RequestValue(CSdlAppServ::EAppSrvWindowPointerCursorMode
));
530 int EpocSdlEnv::SetPalette(int aFirstcolor
, int aColorCount
, TUint32
* aPalette
)
532 return gEpocEnv
->iDsa
->SetPalette(aFirstcolor
, aColorCount
, aPalette
);
535 void EpocSdlEnv::PanicMain(int aErr
)
537 gEpocEnv
->iAppSrv
->PanicMain(aErr
);
541 int EpocSdlEnv::AppendCleanupItem(const TSdlCleanupItem
& aItem
)
543 TRAPD(err
, gEpocEnv
->iCleanupItems
->AppendL(aItem
));
547 void EpocSdlEnv::RemoveCleanupItem(TAny
* aItem
)
549 for(int i
= 0; i
< gEpocEnv
->iCleanupItems
->Count(); i
++)
551 if(gEpocEnv
->iCleanupItems
->At(i
).iItem
== aItem
)
552 gEpocEnv
->iCleanupItems
->Delete(i
);
556 void EpocSdlEnv::CleanupItems()
558 const TThreadId id
= RThread().Id();
559 int last
= gEpocEnv
->iCleanupItems
->Count() - 1;
562 for(i
= last
; i
>= 0 ; i
--)
564 TSdlCleanupItem
& item
= gEpocEnv
->iCleanupItems
->At(i
);
565 if(item
.iThread
== id
)
567 item
.iThread
= TThreadId(0);
568 item
.iOperation(item
.iItem
);
572 last
= gEpocEnv
->iCleanupItems
->Count() - 1;
574 for(i
= last
; i
>= 0 ; i
--)
576 TSdlCleanupItem
& item
= gEpocEnv
->iCleanupItems
->At(i
);
577 if(item
.iThread
== TThreadId(0))
579 gEpocEnv
->iCleanupItems
->Delete(i
);
584 void EpocSdlEnv::FreeSurface()
586 Request(CSdlAppServ::EAppSrvDsaStatus
);
587 if(gEpocEnv
->iDsa
!= NULL
)
588 gEpocEnv
->iDsa
->Free();
591 void EpocSdlEnv::LockPalette(TBool aLock
)
593 gEpocEnv
->iDsa
->LockPalette(aLock
);
596 void EpocSdlEnv::ObserverEvent(int aService
, int aParam
)
598 const TBool sdlThread
= RThread().Id() == gEpocEnv
->iId
;
599 const int valuea
= gEpocEnv
->iAppSrv
->ObserverEvent(aService
, aParam
);
600 gEpocEnv
->iAppSrv
->HandleObserverValue(aService
, valuea
, !sdlThread
);
603 gEpocEnv
->iAppSrv
->SetParam(aParam
);
604 const int valuet
= gEpocEnv
->iAppSrv
->RequestValue(aService
);
605 gEpocEnv
->iAppSrv
->HandleObserverValue(aService
, valuet
, EFalse
);
609 TPoint
EpocSdlEnv::WindowCoordinates(const TPoint
& aPoint
)
611 return gEpocEnv
->iDsa
== NULL
? aPoint
: gEpocEnv
->iDsa
->WindowCoordinates(aPoint
);
614 void EpocSdlEnv::PanicMain(const TDesC
& aInfo
, int aErr
)
616 gEpocEnv
->iAppSrv
->PanicMain(aInfo
, aErr
);
619 //Dsa is a low priority ao, it has to wait if its pending event, but ws
620 //event has been prioritized before it
621 //this is not called from app thread!
622 void EpocSdlEnv::WaitDeviceChange()
625 gEpocEnv
->iAppSrv
->RequestValue(CSdlAppServ::EAppSrvWaitDsa
);
626 const TSize sz
= WindowSize();
627 const int param
= reinterpret_cast<int>(&sz
);
628 ObserverEvent(MSDLObserver::EEventScreenSizeChanged
, param
);
631 LOCAL_C TBool
CheckSdl()
635 if(sdl
.Open(gEpocEnv
->iId
) == KErrNone
)
637 if(sdl
.ExitType() == EExitPending
)
646 void EpocSdlEnvData::Free()
648 if(RThread().Id() == gEpocEnv
->iId
)
655 __ASSERT_ALWAYS(iArgv
== NULL
|| CheckSdl(), PANIC(KErrNotReady
));
658 void EpocSdlEnvData::Delete()
660 for(int i
= 0; i
<= iArgc
; i
++)
680 _LIT(KSDLMain
, "SDLMain");
684 gEpocEnv
->iCleanupItems
= new (ELeave
) CArrayFixFlat
<TSdlCleanupItem
>(8);
687 /* !! process exits here if there is "exit()" in main! */
689 for(int i
= 0; i
< 6; i
++)
691 void* f
= (void*) gEpocEnv
->iMain
[i
];
697 ret
= ((mainfunc1
)f
)();
705 ret
= ((mainfunc2
)f
)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv());
709 ((mainfunc2
)f
)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv());
713 ret
= ((mainfunc3
)f
)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv(), envp
);
717 ((mainfunc3
)f
)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv(), envp
);
726 LOCAL_C
int DoMain(TAny
* /*aParam*/)
728 TBool fbsconnected
= EFalse
;
729 CTrapCleanup
* cleanup
= NULL
;
731 if(EnvUtils::IsOwnThreaded())
733 cleanup
= CTrapCleanup::New();
735 if(RFbsSession::GetSession() == NULL
)
737 PANIC_IF_ERROR(RFbsSession::Connect());
738 fbsconnected
= ETrue
;
741 gEpocEnv
->iAppSrv
->Init();
745 if(EnvUtils::IsOwnThreaded())
747 //completes waiting rendesvous
748 RThread::Rendezvous(KErrNone
);
751 TRAPD(err
, err
= MainL());
753 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventMainExit
, err
);
755 // Free resources and return
756 EpocSdlEnv::CleanupItems();
758 gEpocEnv
->iCleanupItems
->Reset();
759 delete gEpocEnv
->iCleanupItems
;
760 gEpocEnv
->iCleanupItems
= NULL
;
762 gEpocEnv
->Free(); //free up in thread resources
765 RFbsSession::Disconnect();
769 if(gEpocEnv
->iCallerStatus
!= NULL
)
771 User::RequestComplete(gEpocEnv
->iCallerStatus
, err
);
776 return err
== KErrNone
? ret
: err
;
780 EXPORT_C
CSDL::~CSDL()
789 EXPORT_C CSDL
* CSDL::NewL(int aFlags
)
791 __ASSERT_ALWAYS(gEpocEnv
== NULL
, PANIC(KErrAlreadyExists
));
792 gEpocEnv
= new EpocSdlEnvData
;
793 Mem::FillZ(gEpocEnv
, sizeof(EpocSdlEnvData
));
795 gEpocEnv
->iEpocEnvFlags
= aFlags
;
796 gEpocEnv
->iEventQueue
= new (ELeave
) CEventQueue();
797 gEpocEnv
->iAppSrv
= new (ELeave
) CSdlAppServ();
799 CSDL
* sdl
= new (ELeave
) CSDL();
801 gEpocEnv
->iSdl
= sdl
;
806 EXPORT_C
void CSDL::SetContainerWindowL(RWindow
& aWindow
, RWsSession
& aSession
, CWsScreenDevice
& aDevice
)
808 if(gEpocEnv
->iDsa
== NULL
)
809 gEpocEnv
->iDsa
= CDsa::CreateL(aSession
);
810 gEpocEnv
->iDsa
->ConstructL(aWindow
, aDevice
);
813 int EpocSdlEnv::ApplyGlesDsa()
816 TRAPD(err
, dsa
= gEpocEnv
->iDsa
->CreateGlesDsaL());
817 gEpocEnv
->iDsa
= dsa
;
821 RWindow
* EpocSdlEnv::Window()
823 return gEpocEnv
->iDsa
->Window();
826 void EpocSdlEnv::UpdateWholeScreen(bool val
)
828 gEpocEnv
->iDsa
->m_updateWholeScreen
= val
;
831 bool EpocSdlEnv::GetUpdateWholeScreen()
833 return gEpocEnv
->iDsa
->m_updateWholeScreen
;
836 void EpocSdlEnv::SetOrientation(CAknAppUi::TAppUiOrientation orientation
, const TSize
& aSize
, TDisplayMode aMode
)
838 gEpocEnv
->iWaitingForOrientationChange
= true;
839 gEpocEnv
->iSize
= aSize
;
840 gEpocEnv
->iMode
= aMode
;
842 TRAPD(err
, static_cast<CAknAppUi
*>(CEikonEnv::Static()->EikAppUi())->SetOrientationL(orientation
));
845 EXPORT_C TThreadId
CSDL::CallMainL(const TMainFunc
& aFunc
, TRequestStatus
* const aStatus
, const CDesC8Array
* const aArg
, int aStackSize
)
847 ASSERT(gEpocEnv
!= NULL
);
848 gEpocEnv
->iMain
= aFunc
;
849 const TBool args
= aArg
!= NULL
;
851 if(gEpocEnv
->iArgv
!= NULL
)
852 User::Leave(KErrAlreadyExists
);
854 gEpocEnv
->iArgc
= args
? aArg
->Count() + 1 : 0;
855 gEpocEnv
->iArgv
= new char*[gEpocEnv
->iArgc
+ 2];
858 const TFileName processName
= RProcess().FileName();
859 const int len
= processName
.Length();
860 gEpocEnv
->iArgv
[k
] = new char[len
+ 1];
861 Mem::Copy(gEpocEnv
->iArgv
[k
], processName
.Ptr(), len
);
862 gEpocEnv
->iArgv
[k
][len
] = 0;
864 for(int i
= 0; args
&& (i
< aArg
->Count()); i
++)
867 const int len
= aArg
->MdcaPoint(i
).Length();
868 gEpocEnv
->iArgv
[k
] = new char[len
+ 1];
869 Mem::Copy(gEpocEnv
->iArgv
[k
], aArg
->MdcaPoint(i
).Ptr(), len
);
870 gEpocEnv
->iArgv
[k
][len
] = 0;
873 gEpocEnv
->iArgv
[k
+ 1] = NULL
;
875 gEpocEnv
->iEventQueue
->ConstructL();
876 gEpocEnv
->iAppSrv
->ConstructL();
878 if(EnvUtils::IsOwnThreaded())
881 User::LeaveIfError(thread
.Create(KSDLMain
, DoMain
, aStackSize
, NULL
, NULL
));
885 thread
.Logon(*aStatus
);
888 gEpocEnv
->iId
= thread
.Id();
889 thread
.SetPriority(EPriorityLess
);
895 gEpocEnv
->iCallerStatus
= aStatus
;
897 *aStatus
= KRequestPending
;
898 gEpocEnv
->iId
= RThread().Id();
899 // when priority is not lowered screen updates much more frequently, which
900 // may be undesired, for example in case of openttd's generating world dialog
901 RThread().SetPriority(EPriorityLess
);
905 return gEpocEnv
->iId
;
908 EXPORT_C
int CSDL::AppendWsEvent(const TWsEvent
& aEvent
)
910 return EpocSdlEnv::EventQueue().Append(aEvent
);
913 EXPORT_C
void CSDL::SDLPanic(const TDesC
& aInfo
, int aErr
)
915 EpocSdlEnv::PanicMain(aInfo
, aErr
);
918 EXPORT_C
int CSDL::GetSDLCode(int aScanCode
)
922 if(aScanCode
>= MAX_SCANCODE
)
924 return KeyMap()[aScanCode
];
927 EXPORT_C
int CSDL::SDLCodesCount() const
932 EXPORT_C
void CSDL::ResetSDLCodes()
937 EXPORT_C
int CSDL::SetSDLCode(int aScanCode
, int aSDLCode
)
939 const int current
= GetSDLCode(aScanCode
);
940 if(aScanCode
>= 0 && aScanCode
< MAX_SCANCODE
)
941 KeyMap()[aScanCode
] = static_cast<SDLKey
>(aSDLCode
);
946 EXPORT_C MSDLObserver
* CSDL::Observer()
948 return gEpocEnv
->iAppSrv
->Observer();
951 EXPORT_C
void CSDL::SetObserver(MSDLObserver
* aObserver
)
953 gEpocEnv
->iAppSrv
->SetObserver(aObserver
);
956 EXPORT_C
void CSDL::Resume()
958 EpocSdlEnv::Resume();
961 EXPORT_C
void CSDL::Suspend()
963 if(gEpocEnv
->iDsa
!= NULL
)
964 gEpocEnv
->iDsa
->DoStop();
967 EXPORT_C
void CSDL::Resize()
969 if(gEpocEnv
->iWaitingForOrientationChange
)
971 EpocSdlEnv::AllocSurface(gEpocEnv
->iSize
, gEpocEnv
->iMode
);
972 gEpocEnv
->iWaitingForOrientationChange
= false;
976 TSize size
= gEpocEnv
->iDsa
->Window()->Size();
977 SDL_PrivateResize(size
.iWidth
, size
.iHeight
);
981 EXPORT_C
CSDL::CSDL()
984 TBool
EnvUtils::Rendezvous(RThread
& aThread
, TRequestStatus
& aStatus
)
986 if(gEpocEnv
->iId
!= TThreadId(0) &&
987 aThread
.Open(gEpocEnv
->iId
) &&
988 aThread
.ExitType() == EExitPending
)
990 aThread
.Rendezvous(aStatus
);
996 void* SDL_LoadObject(const char *sofile
)
998 RLibrary
* lib
= new RLibrary();
1002 name
.Copy(TPtrC8((const TUint8
*)sofile
));
1003 if(KErrNone
== lib
->Load(name
))
1009 void* SDL_LoadFunction(void *handle
, const char *name
)
1011 TLex8
v((const TUint8
*)(name
));
1014 if(KErrNone
!= v
.Val(ord
))
1017 const RLibrary
* lib
= reinterpret_cast<RLibrary
*>(handle
);
1018 TLibraryFunction f
= lib
->Lookup(ord
);
1022 void SDL_UnloadObject(void *handle
)
1024 RLibrary
* lib
= reinterpret_cast<RLibrary
*>(handle
);