2 #include "sdlepocapi.h"
7 #include "vectorbuffer.h"
11 #include "SDL_epocevents_c.h"
12 #include "SDL_keysym.h"
14 #include "SDL_loadso.h"
16 extern SDLKey
* KeyMap();
17 extern void ResetKeyMap();
24 NONSHARABLE_CLASS(EpocSdlEnvData
)
29 CEventQueue
* iEventQueue
;
37 CArrayFix
<TSdlCleanupItem
>* iCleanupItems
;
41 TRequestStatus
* iCallerStatus
;
44 EpocSdlEnvData
* gEpocEnv
;
46 NONSHARABLE_CLASS(EnvUtils
)
49 static inline TBool
IsOwnThreaded();
50 static void DisableKeyBlocking();
51 static TBool
Rendezvous(RThread
& aThread
, TRequestStatus
& aStatus
);
52 static void RunSingleThread();
55 inline TBool
EnvUtils::IsOwnThreaded()
57 return gEpocEnv
->iEpocEnvFlags
& CSDL::EOwnThread
;
60 void EnvUtils::RunSingleThread()
62 if(!EnvUtils::IsOwnThreaded())
64 TInt count
= RThread().RequestCount();
68 if(CActiveScheduler::RunIfReady(err
, CActive::EPriorityIdle
))
70 CActiveScheduler::Current()->WaitForAnyRequest();
76 TInt
Panic(TInt aErr
, TInt aLine
)
79 b
.Format(_L("Main at %d"), aLine
);
85 NONSHARABLE_CLASS(CCurrentAppUi
) : public CAknAppUi
88 static CCurrentAppUi
* Cast(CEikAppUi
* aUi
);
89 void DisableKeyBlocking();
93 CCurrentAppUi
* CCurrentAppUi::Cast(CEikAppUi
* aUi
)
95 return static_cast<CCurrentAppUi
*>(aUi
);
98 void CCurrentAppUi::DisableKeyBlocking()
100 SetKeyBlockMode(ENoKeyBlock
);
104 class CEventQueue
: public CBase
, public MEventQueue
109 TInt
Append(const TWsEvent
& aEvent
);
110 const TWsEvent
& Shift();
116 TVector
<TWsEvent
, 64> iVector
;
117 RCriticalSection iCS
;
120 void CEventQueue::ConstructL()
122 if(EnvUtils::IsOwnThreaded())
123 User::LeaveIfError(iCS
.CreateLocal());
126 CEventQueue::~CEventQueue()
131 TInt
CEventQueue::Append(const TWsEvent
& aEvent
)
134 const TInt err
= iVector
.Append(aEvent
);
140 TBool
CEventQueue::HasData()
142 EnvUtils::RunSingleThread();
143 return iVector
.Size() > 0;
146 void CEventQueue::Lock()
148 if(EnvUtils::IsOwnThreaded())
152 void CEventQueue::Unlock()
154 if(EnvUtils::IsOwnThreaded())
158 const TWsEvent
& CEventQueue::Shift()
160 const TWsEvent
& event
= iVector
.Shift();
165 TSdlCleanupItem::TSdlCleanupItem(TSdlCleanupOperation aOperation
, TAny
* aItem
) :
166 iOperation(aOperation
), iItem(aItem
), iThread(RThread().Id())
169 #define MAINFUNC(x) EXPORT_C TMainFunc::TMainFunc(mainfunc##x aFunc){Mem::FillZ(iMainFunc, sizeof(iMainFunc)); iMainFunc[x - 1] = (void*) aFunc;}
178 EXPORT_C
TMainFunc::TMainFunc()
180 Mem::FillZ(iMainFunc
, sizeof(iMainFunc
));
184 const void* TMainFunc::operator[](TInt aIndex
) const
186 return iMainFunc
[aIndex
];
190 NONSHARABLE_CLASS(CSdlAppServ
) : public CActive
195 EAppSrvNoop
= CDsa::ELastDsaRequest
,
198 EAppSrvWindowDisplayMode
,
199 EAppSrvWindowPointerCursorMode
,
207 TInt
Request(TInt aService
);
208 TInt
RequestValue(TInt aService
);
210 void PanicMain(TInt aReason
);
211 void PanicMain(const TDesC
& aInfo
, TInt aReason
);
212 void SetObserver(MSDLObserver
* aObserver
);
213 TInt
ObserverEvent(TInt aEvent
, TInt aParam
);
214 void SetParam(TInt aParam
);
215 void HandleObserverValue(TInt aService
, TInt aReturnValue
, TBool aMainThread
);
216 MSDLObserver
* Observer();
221 const TThreadId iMainId
;
226 MSDLObserver
* iObserver
;
227 TRequestStatus
* iStatusPtr
;
230 CSdlAppServ::CSdlAppServ() : CActive(CActive::EPriorityHigh
), iMainId(RThread().Id())
234 MSDLObserver
* CSdlAppServ::Observer()
239 void CSdlAppServ::SetObserver(MSDLObserver
* aObserver
)
241 iObserver
= aObserver
;
244 TInt
CSdlAppServ::ObserverEvent(TInt aEvent
, TInt aParam
)
246 if(iObserver
!= NULL
)
248 if(RThread().Id() == gEpocEnv
->iId
&& EnvUtils::IsOwnThreaded())
250 return iObserver
->SdlThreadEvent(aEvent
, aParam
);
252 else if(RThread().Id() == iMainId
)
254 return iObserver
->SdlEvent(aEvent
, aParam
);
256 PANIC(KErrNotSupported
);
261 void CSdlAppServ::PanicMain(TInt aReason
)
263 iAppThread
.Panic(RThread().Name(), aReason
);
266 void CSdlAppServ::PanicMain(const TDesC
& aInfo
, TInt aReason
)
268 iAppThread
.Panic(aInfo
, aReason
);
271 void CSdlAppServ::ConstructL()
273 CActiveScheduler::Add(this);
274 if(EnvUtils::IsOwnThreaded())
275 User::LeaveIfError(iSema
.CreateLocal(1));
276 iStatus
= KRequestPending
;
277 iStatusPtr
= &iStatus
;
281 CSdlAppServ::~CSdlAppServ()
284 if(iSema
.Handle() != NULL
)
290 TInt
CSdlAppServ::Request(TInt aService
)
292 if(EnvUtils::IsOwnThreaded())
294 if(RThread().Id() == iAppThread
.Id())
295 return KErrBadHandle
;
298 EnvUtils::RunSingleThread();
300 iAppThread
.RequestComplete(iStatusPtr
, KErrNone
);
304 TInt
CSdlAppServ::RequestValue(TInt aService
)
307 Request(EAppSrvNoop
);
311 void CSdlAppServ::Init()
313 PANIC_IF_ERROR(iAppThread
.Open(iMainId
));
316 void CSdlAppServ::SetParam(TInt aParam
)
318 iReturnValue
= aParam
;
321 void CSdlAppServ::HandleObserverValue(TInt aService
, TInt aReturnValue
, TBool aMainThread
)
323 if(iObserver
!= NULL
&& aMainThread
)
327 case MSDLObserver::EEventScreenSizeChanged
:
328 if(aReturnValue
== MSDLObserver::EScreenSizeChangedDefaultPalette
)
329 EpocSdlEnv::LockPalette(EFalse
);
333 if(!aMainThread
&& aService
== MSDLObserver::EEventSuspend
)
335 if(iObserver
== NULL
|| (gEpocEnv
->iDsa
!= NULL
&& gEpocEnv
->iDsa
->Stopped() && aReturnValue
!= MSDLObserver::ESuspendNoSuspend
))
337 EpocSdlEnv::Suspend();
342 void CSdlAppServ::RunL()
344 if(iStatus
== KErrNone
)
348 case CSdlAppServ::EAppSrvWaitDsa
:
349 EpocSdlEnv::SetWaitDsa();
350 iReturnValue
= EpocSdlEnv::IsDsaAvailable();
353 case CSdlAppServ::EAppSrvStopThread
:
354 if(gEpocEnv
->iDsa
!= NULL
)
355 gEpocEnv
->iDsa
->SetSuspend();
358 case EpocSdlEnv::EDisableKeyBlocking
:
359 EnvUtils::DisableKeyBlocking();
362 case EAppSrvWindowPointerCursorMode
:
363 iReturnValue
= gEpocEnv
->iDsa
!= NULL
? gEpocEnv
->iDsa
->Session().PointerCursorMode() : KErrNotReady
;
366 case EAppSrvDsaStatus
:
367 if(gEpocEnv
->iDsa
!= NULL
)
368 gEpocEnv
->iDsa
->Stop();
369 iReturnValue
= KErrNone
;
372 case CDsa::ERequestUpdate
:
373 gEpocEnv
->iDsa
->UnlockHWSurfaceRequestComplete();
379 case MSDLObserver::EEventResume
:
380 case MSDLObserver::EEventSuspend
:
381 case MSDLObserver::EEventScreenSizeChanged
:
382 case MSDLObserver::EEventWindowReserved
:
383 case MSDLObserver::EEventKeyMapInit
:
384 case MSDLObserver::EEventWindowNotAvailable
:
385 case MSDLObserver::EEventMainExit
:
386 iReturnValue
= ObserverEvent(iService
, iReturnValue
);
387 HandleObserverValue(iService
, iReturnValue
, ETrue
);
391 PANIC(KErrNotSupported
);
395 iStatus
= KRequestPending
;
396 iStatusPtr
= &iStatus
;
400 if(EnvUtils::IsOwnThreaded())
404 void CSdlAppServ::DoCancel()
406 if(EnvUtils::IsOwnThreaded())
408 TRequestStatus
* s
= &iStatus
;
409 iAppThread
.RequestComplete(s
, KErrCancel
);
412 MEventQueue
& EpocSdlEnv::EventQueue()
414 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
415 return *gEpocEnv
->iEventQueue
;
419 TBool
EpocSdlEnv::Flags(TInt aFlag
)
421 const TInt flag
= gEpocEnv
->iEpocEnvFlags
& aFlag
;
422 return flag
== aFlag
;
425 TInt
EpocSdlEnv::Argc()
427 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
428 return gEpocEnv
->iArgc
;
431 char** EpocSdlEnv::Argv()
433 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
434 return gEpocEnv
->iArgv
;
437 TBool
EpocSdlEnv::IsDsaAvailable()
439 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
440 return gEpocEnv
->iDsa
!= NULL
&& gEpocEnv
->iDsa
->IsDsaAvailable();
443 void EpocSdlEnv::WaitDsaAvailable()
445 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventWindowNotAvailable
, 0);
446 gEpocEnv
->iAppSrv
->Request(CSdlAppServ::EAppSrvStopThread
);
447 if(EpocSdlEnv::Flags(CSDL::EEnableFocusStop
))
449 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventSuspend
, 0);
453 void EpocSdlEnv::Suspend()
455 if(gEpocEnv
->iDsa
!= NULL
&& (gEpocEnv
->iDsa
->Stopped() || EpocSdlEnv::Flags(CSDL::EEnableFocusStop
)))
457 gEpocEnv
->iDsa
->SetSuspend();
458 if(EnvUtils::IsOwnThreaded())
461 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventResume
, 0);
466 void EpocSdlEnv::SetWaitDsa()
468 if(!IsDsaAvailable())
470 if(EnvUtils::IsOwnThreaded())
473 th
.Open(gEpocEnv
->iId
);
477 if(gEpocEnv
->iDsa
!= NULL
)
478 gEpocEnv
->iDsa
->SetSuspend();
482 void EpocSdlEnv::Resume()
484 if(gEpocEnv
->iDsa
!= NULL
)
486 gEpocEnv
->iDsa
->Resume();
488 if(EnvUtils::IsOwnThreaded())
491 th
.Open(gEpocEnv
->iId
);
495 const TInt value
= gEpocEnv
->iAppSrv
->ObserverEvent(MSDLObserver::EEventResume
, 0);
496 gEpocEnv
->iAppSrv
->HandleObserverValue(MSDLObserver::EEventResume
, value
, ETrue
);
500 TInt
EpocSdlEnv::AllocSwSurface(const TSize
& aSize
, TDisplayMode aMode
)
502 return gEpocEnv
->iDsa
->AllocSurface(EFalse
, aSize
, aMode
);
505 TInt
EpocSdlEnv::AllocHwSurface(const TSize
& aSize
, TDisplayMode aMode
)
507 return gEpocEnv
->iDsa
->AllocSurface(ETrue
, aSize
, aMode
);
510 void EpocSdlEnv::UnlockHwSurface()
512 gEpocEnv
->iDsa
->UnlockHwSurface();
515 TUint8
* EpocSdlEnv::LockHwSurface()
517 return gEpocEnv
->iDsa
->LockHwSurface();
520 void EpocSdlEnv::UpdateSwSurface()
522 gEpocEnv
->iDsa
->UpdateSwSurface();
525 TBool
EpocSdlEnv::AddUpdateRect(TUint8
* aAddress
, const TRect
& aUpdateRect
, const TRect
& aRect
)
527 return gEpocEnv
->iDsa
->AddUpdateRect(aAddress
, aUpdateRect
, aRect
);
530 void EpocSdlEnv::Request(TInt aService
)
532 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
533 gEpocEnv
->iAppSrv
->Request(aService
);
536 TSize
EpocSdlEnv::WindowSize(const TSize
& aRequestedSize
)
538 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
539 if(gEpocEnv
->iDsa
!= NULL
&& EpocSdlEnv::Flags(CSDL::EAllowImageResize
) && gEpocEnv
->iDsa
->WindowSize() != aRequestedSize
)
541 TRAP_IGNORE(gEpocEnv
->iDsa
->CreateZoomerL(aRequestedSize
));
543 return gEpocEnv
->iDsa
== NULL
? TSize(0, 0) : gEpocEnv
->iDsa
->WindowSize();
546 TSize
EpocSdlEnv::WindowSize()
548 __ASSERT_DEBUG(gEpocEnv
!= NULL
, PANIC(KErrNotReady
));
549 return gEpocEnv
->iDsa
== NULL
? TSize(0, 0) : gEpocEnv
->iDsa
->WindowSize();
552 TDisplayMode
EpocSdlEnv::DisplayMode()
554 return gEpocEnv
->iDsa
== NULL
? ENone
: gEpocEnv
->iDsa
->DisplayMode();
557 TPointerCursorMode
EpocSdlEnv::PointerMode()
559 return static_cast<TPointerCursorMode
>(gEpocEnv
->iAppSrv
->RequestValue(CSdlAppServ::EAppSrvWindowPointerCursorMode
));
562 TInt
EpocSdlEnv::SetPalette(TInt aFirstcolor
, TInt aColorCount
, TUint32
* aPalette
)
564 return gEpocEnv
->iDsa
->SetPalette(aFirstcolor
, aColorCount
, aPalette
);
567 void EpocSdlEnv::PanicMain(TInt aErr
)
569 gEpocEnv
->iAppSrv
->PanicMain(aErr
);
573 TInt
EpocSdlEnv::AppendCleanupItem(const TSdlCleanupItem
& aItem
)
575 TRAPD(err
, gEpocEnv
->iCleanupItems
->AppendL(aItem
));
579 void EpocSdlEnv::RemoveCleanupItem(TAny
* aItem
)
581 for(TInt i
= 0; i
< gEpocEnv
->iCleanupItems
->Count(); i
++)
583 if(gEpocEnv
->iCleanupItems
->At(i
).iItem
== aItem
)
584 gEpocEnv
->iCleanupItems
->Delete(i
);
588 void EpocSdlEnv::CleanupItems()
590 const TThreadId id
= RThread().Id();
591 TInt last
= gEpocEnv
->iCleanupItems
->Count() - 1;
594 for(i
= last
; i
>= 0 ; i
--)
596 TSdlCleanupItem
& item
= gEpocEnv
->iCleanupItems
->At(i
);
597 if(item
.iThread
== id
)
599 item
.iThread
= TThreadId(0);
600 item
.iOperation(item
.iItem
);
604 last
= gEpocEnv
->iCleanupItems
->Count() - 1;
606 for(i
= last
; i
>= 0 ; i
--)
608 TSdlCleanupItem
& item
= gEpocEnv
->iCleanupItems
->At(i
);
609 if(item
.iThread
== TThreadId(0))
611 gEpocEnv
->iCleanupItems
->Delete(i
);
616 void EpocSdlEnv::FreeSurface()
618 Request(CSdlAppServ::EAppSrvDsaStatus
);
619 if(gEpocEnv
->iDsa
!= NULL
)
620 gEpocEnv
->iDsa
->Free();
623 void EpocSdlEnv::LockPalette(TBool aLock
)
625 gEpocEnv
->iDsa
->LockPalette(aLock
);
628 void EpocSdlEnv::ObserverEvent(TInt aService
, TInt aParam
)
630 const TBool sdlThread
= RThread().Id() == gEpocEnv
->iId
;
631 const TInt valuea
= gEpocEnv
->iAppSrv
->ObserverEvent(aService
, aParam
);
632 gEpocEnv
->iAppSrv
->HandleObserverValue(aService
, valuea
, !sdlThread
);
635 gEpocEnv
->iAppSrv
->SetParam(aParam
);
636 const TInt valuet
= gEpocEnv
->iAppSrv
->RequestValue(aService
);
637 gEpocEnv
->iAppSrv
->HandleObserverValue(aService
, valuet
, EFalse
);
641 TPoint
EpocSdlEnv::WindowCoordinates(const TPoint
& aPoint
)
643 return gEpocEnv
->iDsa
== NULL
? aPoint
: gEpocEnv
->iDsa
->WindowCoordinates(aPoint
);
646 void EpocSdlEnv::PanicMain(const TDesC
& aInfo
, TInt aErr
)
648 gEpocEnv
->iAppSrv
->PanicMain(aInfo
, aErr
);
651 //Dsa is a low priority ao, it has to wait if its pending event, but ws
652 //event has been prioritized before it
653 //this is not called from app thread!
654 void EpocSdlEnv::WaitDeviceChange()
657 gEpocEnv
->iAppSrv
->RequestValue(CSdlAppServ::EAppSrvWaitDsa
);
658 const TSize sz
= WindowSize();
659 const TInt param
= reinterpret_cast<TInt
>(&sz
);
660 ObserverEvent(MSDLObserver::EEventScreenSizeChanged
, param
);
663 LOCAL_C TBool
CheckSdl()
667 if(sdl
.Open(gEpocEnv
->iId
) == KErrNone
)
669 if(sdl
.ExitType() == EExitPending
)
678 void EpocSdlEnvData::Free()
680 if(RThread().Id() == gEpocEnv
->iId
)
687 __ASSERT_ALWAYS(iArgv
== NULL
|| CheckSdl(), PANIC(KErrNotReady
));
690 void EpocSdlEnvData::Delete()
692 for(TInt i
= 0; i
<= iArgc
; i
++)
695 User::Free( iArgv
[i
] );
711 delete gEpocEnv
->iCaller
;
714 _LIT(KSDLMain
, "SDLMain");
718 gEpocEnv
->iCleanupItems
= new (ELeave
) CArrayFixFlat
<TSdlCleanupItem
>(8);
721 /* !! process exits here if there is "exit()" in main! */
723 for(TInt i
= 0; i
< 6; i
++)
725 void* f
= (void*) gEpocEnv
->iMain
[i
];
731 ret
= ((mainfunc1
)f
)();
739 ret
= ((mainfunc2
)f
)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv());
743 ((mainfunc2
)f
)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv());
747 ret
= ((mainfunc3
)f
)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv(), envp
);
751 ((mainfunc3
)f
)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv(), envp
);
760 LOCAL_C TInt
DoMain(TAny
* /*aParam*/)
762 TBool fbsconnected
= EFalse
;
763 CTrapCleanup
* cleanup
= NULL
;
765 if(EnvUtils::IsOwnThreaded())
767 cleanup
= CTrapCleanup::New();
769 if(RFbsSession::GetSession() == NULL
)
771 PANIC_IF_ERROR(RFbsSession::Connect());
772 fbsconnected
= ETrue
;
775 gEpocEnv
->iAppSrv
->Init();
779 if(EnvUtils::IsOwnThreaded())
781 //completes waiting rendesvous
782 RThread::Rendezvous(KErrNone
);
785 TRAPD(err
, err
= MainL());
787 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventMainExit
, err
);
789 // Free resources and return
790 EpocSdlEnv::CleanupItems();
792 gEpocEnv
->iCleanupItems
->Reset();
793 delete gEpocEnv
->iCleanupItems
;
794 gEpocEnv
->iCleanupItems
= NULL
;
796 gEpocEnv
->Free(); //free up in thread resources
799 RFbsSession::Disconnect();
803 if(gEpocEnv
->iCallerStatus
!= NULL
)
805 User::RequestComplete(gEpocEnv
->iCallerStatus
, err
);
810 return err
== KErrNone
? ret
: err
;
814 EXPORT_C
CSDL::~CSDL()
819 User::Free(gEpocEnv
);
823 EXPORT_C CSDL
* CSDL::NewL(TInt aFlags
)
825 __ASSERT_ALWAYS(gEpocEnv
== NULL
, PANIC(KErrAlreadyExists
));
826 gEpocEnv
= (EpocSdlEnvData
*) User::AllocL(sizeof(EpocSdlEnvData
));
827 Mem::FillZ(gEpocEnv
, sizeof(EpocSdlEnvData
));
829 gEpocEnv
->iEpocEnvFlags
= aFlags
;
830 gEpocEnv
->iEventQueue
= new (ELeave
) CEventQueue();
831 gEpocEnv
->iAppSrv
= new (ELeave
) CSdlAppServ();
833 CSDL
* sdl
= new (ELeave
) CSDL();
835 gEpocEnv
->iSdl
= sdl
;
840 EXPORT_C
void CSDL::SetContainerWindowL(RWindow
& aWindow
, RWsSession
& aSession
, CWsScreenDevice
& aDevice
)
842 if(gEpocEnv
->iDsa
== NULL
)
843 gEpocEnv
->iDsa
= CDsa::CreateL(aSession
);
844 gEpocEnv
->iDsa
->ConstructL(aWindow
, aDevice
);
847 TInt
EpocSdlEnv::ApplyGlesDsa()
850 TRAPD(err
, dsa
= gEpocEnv
->iDsa
->CreateGlesDsaL());
851 gEpocEnv
->iDsa
= dsa
;
855 RWindow
* EpocSdlEnv::Window()
857 return gEpocEnv
->iDsa
->Window();
860 EXPORT_C TThreadId
CSDL::CallMainL(const TMainFunc
& aFunc
, TRequestStatus
* const aStatus
, const CDesC8Array
* const aArg
, TInt aFlags
, TInt aStackSize
)
862 ASSERT(gEpocEnv
!= NULL
);
863 gEpocEnv
->iMain
= aFunc
;
864 const TBool args
= aArg
!= NULL
;
866 if(gEpocEnv
->iArgv
!= NULL
)
867 User::Leave(KErrAlreadyExists
);
869 gEpocEnv
->iArgc
= args
? aArg
->Count() + 1 : 0;
870 gEpocEnv
->iArgv
= (char**) User::AllocL(sizeof(char*) * (gEpocEnv
->iArgc
+ 2));
873 const TFileName processName
= RProcess().FileName();
874 const TInt len
= processName
.Length();
875 gEpocEnv
->iArgv
[k
] = (char*) User::AllocL(len
+ 1);
876 Mem::Copy(gEpocEnv
->iArgv
[k
], processName
.Ptr(), len
);
877 gEpocEnv
->iArgv
[k
][len
] = 0;
879 for(TInt i
= 0; args
&& (i
< aArg
->Count()); i
++)
882 const TInt len
= aArg
->MdcaPoint(i
).Length();
883 gEpocEnv
->iArgv
[k
] = (char*) User::AllocL(len
+ 1);
884 Mem::Copy(gEpocEnv
->iArgv
[k
], aArg
->MdcaPoint(i
).Ptr(), len
);
885 gEpocEnv
->iArgv
[k
][len
] = 0;
888 gEpocEnv
->iArgv
[k
+ 1] = NULL
;
890 //For legacy, set to be threaded if resume is requested
891 if(aFlags
& CSDL::ERequestResume
)
892 { //unless explicitly told not to
893 if(!(gEpocEnv
->iEpocEnvFlags
& EMainThread
))
895 gEpocEnv
->iEpocEnvFlags
|= EOwnThread
;
899 gEpocEnv
->iEventQueue
->ConstructL();
900 gEpocEnv
->iAppSrv
->ConstructL();
902 if(EnvUtils::IsOwnThreaded())
905 User::LeaveIfError(thread
.Create(KSDLMain
, DoMain
, aStackSize
, NULL
, NULL
));
909 thread
.Logon(*aStatus
);
912 gEpocEnv
->iId
= thread
.Id();
913 thread
.SetPriority(EPriorityLess
);
914 if((aFlags
& CSDL::ERequestResume
) == 0)
922 gEpocEnv
->iCaller
= CIdle::NewL(CActive::EPriorityIdle
);
923 gEpocEnv
->iCaller
->Start(TCallBack(DoMain
));
924 gEpocEnv
->iCallerStatus
= aStatus
;
926 *aStatus
= KRequestPending
;
927 gEpocEnv
->iId
= RThread().Id();
928 RThread().SetPriority(EPriorityLess
);
931 return gEpocEnv
->iId
;
934 EXPORT_C TInt
CSDL::AppendWsEvent(const TWsEvent
& aEvent
)
936 return EpocSdlEnv::EventQueue().Append(aEvent
);
939 EXPORT_C
void CSDL::SDLPanic(const TDesC
& aInfo
, TInt aErr
)
941 EpocSdlEnv::PanicMain(aInfo
, aErr
);
944 EXPORT_C TInt
CSDL::GetSDLCode(TInt aScanCode
)
948 if(aScanCode
>= MAX_SCANCODE
)
950 return KeyMap()[aScanCode
];
953 EXPORT_C TInt
CSDL::SDLCodesCount() const
958 EXPORT_C
void CSDL::ResetSDLCodes()
963 EXPORT_C
void CSDL::SetOrientation(TOrientationMode aMode
)
965 CDsa::TOrientationMode mode
= CDsa::EViewOrientation0
;
968 case EOrientation0
: mode
= CDsa::EViewOrientation0
; break;
969 case EOrientation90
: mode
= CDsa::EViewOrientation90
; break;
970 case EOrientation180
: mode
= CDsa::EViewOrientation180
; break;
971 case EOrientation270
: mode
= CDsa::EViewOrientation270
; break;
973 gEpocEnv
->iDsa
->SetOrientation(mode
);
976 EXPORT_C TInt
CSDL::SetSDLCode(TInt aScanCode
, TInt aSDLCode
)
978 const TInt current
= GetSDLCode(aScanCode
);
979 if(aScanCode
>= 0 && aScanCode
< MAX_SCANCODE
)
980 KeyMap()[aScanCode
] = static_cast<SDLKey
>(aSDLCode
);
985 EXPORT_C MSDLObserver
* CSDL::Observer()
987 return gEpocEnv
->iAppSrv
->Observer();
990 EXPORT_C
void CSDL::SetObserver(MSDLObserver
* aObserver
)
992 gEpocEnv
->iAppSrv
->SetObserver(aObserver
);
995 EXPORT_C
void CSDL::Resume()
997 EpocSdlEnv::Resume();
1000 EXPORT_C
void CSDL::Suspend()
1002 if(gEpocEnv
->iDsa
!= NULL
)
1003 gEpocEnv
->iDsa
->DoStop();
1006 EXPORT_C
CSDL::CSDL()
1009 EXPORT_C
void CSDL::DisableKeyBlocking(CAknAppUi
& aAppUi
) const
1011 gEpocEnv
->iAppUi
= &aAppUi
;
1012 EnvUtils::DisableKeyBlocking();
1015 EXPORT_C TInt
CSDL::SetBlitter(MBlitter
* aBlitter
)
1017 if(gEpocEnv
&& gEpocEnv
->iDsa
)
1019 gEpocEnv
->iDsa
->SetBlitter(aBlitter
);
1022 return KErrNotReady
;
1026 EXPORT_C TInt
CSDL::AppendOverlay(MOverlay
& aOverlay
, TInt aPriority
)
1028 if(gEpocEnv
&& gEpocEnv
->iDsa
)
1030 return gEpocEnv
->iDsa
->AppendOverlay(aOverlay
, aPriority
);
1032 return KErrNotReady
;
1035 EXPORT_C TInt
CSDL::RemoveOverlay(MOverlay
& aOverlay
)
1037 if(gEpocEnv
&& gEpocEnv
->iDsa
)
1039 return gEpocEnv
->iDsa
->RemoveOverlay(aOverlay
);
1041 return KErrNotReady
;
1044 EXPORT_C TInt
CSDL::RedrawRequest()
1046 if(gEpocEnv
&& gEpocEnv
->iDsa
)
1048 const TInt err
= gEpocEnv
->iDsa
->RedrawRequest();
1049 EnvUtils::RunSingleThread();
1052 return KErrNotReady
;
1055 void EnvUtils::DisableKeyBlocking()
1057 if(gEpocEnv
->iAppUi
!= NULL
)
1058 return CCurrentAppUi::Cast(gEpocEnv
->iAppUi
)->DisableKeyBlocking();
1061 TBool
EnvUtils::Rendezvous(RThread
& aThread
, TRequestStatus
& aStatus
)
1063 if(gEpocEnv
->iId
!= TThreadId(0) &&
1064 aThread
.Open(gEpocEnv
->iId
) &&
1065 aThread
.ExitType() == EExitPending
)
1067 aThread
.Rendezvous(aStatus
);
1073 void* SDL_LoadObject(const char *sofile
)
1075 RLibrary
* lib
= new RLibrary();
1079 name
.Copy(TPtrC8((const TUint8
*)sofile
));
1080 if(KErrNone
== lib
->Load(name
))
1086 void* SDL_LoadFunction(void *handle
, const char *name
)
1088 TLex8
v((const TUint8
*)(name
));
1091 if(KErrNone
!= v
.Val(ord
))
1094 const RLibrary
* lib
= reinterpret_cast<RLibrary
*>(handle
);
1095 TLibraryFunction f
= lib
->Lookup(ord
);
1099 void SDL_UnloadObject(void *handle
)
1101 RLibrary
* lib
= reinterpret_cast<RLibrary
*>(handle
);