|
1 // INCLUDES |
|
2 #include <aknapp.h> |
|
3 #include <aknappui.h> |
|
4 #include <eikdoc.h> |
|
5 #include <sdlepocapi.h> |
|
6 #include <bautils.h> |
|
7 #include <eikstart.h> |
|
8 #include <badesca.h> |
|
9 #include <bautils.h> |
|
10 #include <apgcli.h> |
|
11 #include <sdlmain.h> |
|
12 #include <eikedwin.h> |
|
13 #include <eiklabel.h> |
|
14 #include <sdlexe.rsg> |
|
15 #include <aknglobalmsgquery.h> |
|
16 #include <apgwgnam.h> |
|
17 |
|
18 |
|
19 |
|
20 // FORWARD DECLARATIONS |
|
21 class CApaDocument; |
|
22 |
|
23 |
|
24 //const TUid KSDLUID = { 0xF01F605E }; |
|
25 |
|
26 LOCAL_C void MakeCCmdLineL(const TDesC8& aParam, CDesC8Array& aArray) |
|
27 { |
|
28 |
|
29 const TChar dq('\"'); |
|
30 |
|
31 TLex8 lex(aParam); |
|
32 TBool in = EFalse; |
|
33 |
|
34 lex.SkipSpaceAndMark(); |
|
35 |
|
36 while(!lex.Eos()) |
|
37 { |
|
38 TPtrC8 ptr; |
|
39 if(in) |
|
40 { |
|
41 const TPtrC8 rem = lex.RemainderFromMark(); |
|
42 const TInt pos = rem.Locate(dq); |
|
43 if(pos > 0) |
|
44 { |
|
45 lex.Inc(pos); |
|
46 ptr.Set(lex.MarkedToken()); |
|
47 lex.SkipAndMark(1); |
|
48 } |
|
49 else |
|
50 { |
|
51 ptr.Set(rem); |
|
52 } |
|
53 in = EFalse; |
|
54 } |
|
55 else |
|
56 { |
|
57 ptr.Set(lex.NextToken()); |
|
58 const TInt pos = ptr.Locate(dq); |
|
59 if(pos == 0) |
|
60 { |
|
61 lex.UnGetToMark(); |
|
62 lex.SkipAndMark(1); |
|
63 in = ETrue; |
|
64 continue; // back to in brace |
|
65 } |
|
66 else |
|
67 lex.SkipSpaceAndMark(); |
|
68 } |
|
69 |
|
70 aArray.AppendL(ptr); |
|
71 |
|
72 } |
|
73 } |
|
74 |
|
75 NONSHARABLE_CLASS(TVirtualCursor) : public MOverlay |
|
76 { |
|
77 public: |
|
78 TVirtualCursor(); |
|
79 void Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha); |
|
80 void Move(TInt aX, TInt aY); |
|
81 void MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const; |
|
82 void Toggle(); |
|
83 TBool IsOn() const; |
|
84 private: |
|
85 void Draw(CBitmapContext& aGc, const TRect& aTargetRect, const TSize& aSize); |
|
86 private: |
|
87 TRect iRect; |
|
88 TPoint iInc; |
|
89 TPoint iPos; |
|
90 TBool iIsOn; |
|
91 CFbsBitmap* iCBmp; |
|
92 CFbsBitmap* iAlpha; |
|
93 }; |
|
94 |
|
95 |
|
96 TVirtualCursor::TVirtualCursor() : iInc(0, 0), iIsOn(EFalse), iCBmp(NULL) |
|
97 { |
|
98 } |
|
99 |
|
100 const TInt KMaxMove = 10; |
|
101 |
|
102 void TVirtualCursor::Move(TInt aX, TInt aY) |
|
103 { |
|
104 if(aX > 0 && iInc.iX > 0) |
|
105 ++iInc.iX; |
|
106 else if(aX < 0 && iInc.iX < 0) |
|
107 --iInc.iX; |
|
108 else |
|
109 iInc.iX = aX; |
|
110 |
|
111 if(aY > 0 && iInc.iY > 0) |
|
112 ++iInc.iY; |
|
113 else if(aY < 0 && iInc.iY < 0) |
|
114 --iInc.iY; |
|
115 else |
|
116 iInc.iY = aY; |
|
117 |
|
118 iInc.iX = Min(KMaxMove, iInc.iX); |
|
119 |
|
120 iInc.iX = Max(-KMaxMove, iInc.iX); |
|
121 |
|
122 iInc.iY = Min(KMaxMove, iInc.iY); |
|
123 |
|
124 iInc.iY =Max(-KMaxMove, iInc.iY); |
|
125 |
|
126 const TPoint pos = iPos + iInc; |
|
127 if(iRect.Contains(pos)) |
|
128 { |
|
129 iPos = pos; |
|
130 } |
|
131 else |
|
132 { |
|
133 iInc = TPoint(0, 0); |
|
134 } |
|
135 } |
|
136 |
|
137 |
|
138 void TVirtualCursor::Toggle() |
|
139 { |
|
140 iIsOn = !iIsOn; |
|
141 } |
|
142 |
|
143 |
|
144 TBool TVirtualCursor::IsOn() const |
|
145 { |
|
146 return iIsOn; |
|
147 } |
|
148 |
|
149 void TVirtualCursor::Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha) |
|
150 { |
|
151 iRect = aRect; |
|
152 iCBmp = aBmp; |
|
153 iAlpha = aAlpha; |
|
154 } |
|
155 |
|
156 |
|
157 void TVirtualCursor::MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const |
|
158 { |
|
159 aEvent.SetType(EEventPointer), |
|
160 aEvent.SetTimeNow(); |
|
161 TPointerEvent& pointer = *aEvent.Pointer(); |
|
162 pointer.iType = TPointerEvent::EButton1Down; |
|
163 pointer.iPosition = iPos; |
|
164 pointer.iParentPosition = aBasePos; |
|
165 } |
|
166 |
|
167 |
|
168 void TVirtualCursor::Draw(CBitmapContext& aGc, const TRect& /*aTargetRect*/, const TSize& /*aSize*/) |
|
169 { |
|
170 if(iIsOn && iCBmp != NULL) |
|
171 { |
|
172 const TRect rect(TPoint(0, 0), iCBmp->SizeInPixels()); |
|
173 aGc.AlphaBlendBitmaps(iPos, iCBmp, rect, iAlpha, TPoint(0, 0)); |
|
174 } |
|
175 |
|
176 } |
|
177 |
|
178 NONSHARABLE_CLASS(TSdlClass) |
|
179 { |
|
180 public: |
|
181 TSdlClass(); |
|
182 void SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags); |
|
183 TInt SdlFlags() const; |
|
184 const TMainFunc& Main() const; |
|
185 void SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL); |
|
186 TInt AppFlags() const; |
|
187 void AppFlags(TInt aFlags); |
|
188 private: |
|
189 TMainFunc iFunc; |
|
190 TInt iSdlFlags; |
|
191 TInt iExeFlags; |
|
192 MSDLMainObs* iObs; |
|
193 }; |
|
194 |
|
195 |
|
196 void TSdlClass::AppFlags(TInt aFlags) |
|
197 { |
|
198 iExeFlags |= aFlags; |
|
199 } |
|
200 |
|
201 void TSdlClass::SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL) |
|
202 { |
|
203 if(iObs != NULL) |
|
204 iObs->SDLMainEvent(aEvent, aParam, aSDL); |
|
205 } |
|
206 |
|
207 TInt TSdlClass::AppFlags() const |
|
208 { |
|
209 return iExeFlags; |
|
210 } |
|
211 |
|
212 void TSdlClass::SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags) |
|
213 { |
|
214 iFunc = aFunc; |
|
215 iSdlFlags = aFlags; |
|
216 iExeFlags = aExeFlags; |
|
217 iObs = aObs; |
|
218 } |
|
219 |
|
220 const TMainFunc& TSdlClass::Main() const |
|
221 { |
|
222 return iFunc; |
|
223 } |
|
224 |
|
225 |
|
226 TInt TSdlClass::SdlFlags() const |
|
227 { |
|
228 return iSdlFlags; |
|
229 } |
|
230 |
|
231 |
|
232 |
|
233 TSdlClass::TSdlClass() |
|
234 { |
|
235 Mem::FillZ(this, sizeof(this)); |
|
236 } |
|
237 |
|
238 TSdlClass gSDLClass; |
|
239 |
|
240 |
|
241 //////////////////////////////////////////////////////////////// |
|
242 |
|
243 NONSHARABLE_CLASS(CSDLApplication) : public CAknApplication |
|
244 { |
|
245 public: |
|
246 CSDLApplication(); |
|
247 private: |
|
248 CApaDocument* CreateDocumentL(); |
|
249 TFileName ResourceFileName() const; |
|
250 TUid AppDllUid() const; |
|
251 void FindMeL(); |
|
252 TUid iUid; |
|
253 }; |
|
254 |
|
255 NONSHARABLE_CLASS(CSDLDocument) : public CEikDocument |
|
256 { |
|
257 public: |
|
258 CSDLDocument(CEikApplication& aApp); |
|
259 private: |
|
260 CEikAppUi* CreateAppUiL(); |
|
261 |
|
262 }; |
|
263 |
|
264 //////////////////////////////////////////////////////////////////// |
|
265 |
|
266 |
|
267 NONSHARABLE_CLASS(MExitWait) |
|
268 { |
|
269 public: |
|
270 virtual void DoExit(TInt aErr) = 0; |
|
271 }; |
|
272 |
|
273 ///////////////////////////////////////////////////////////////////////// |
|
274 |
|
275 NONSHARABLE_CLASS(CExitWait) : public CActive |
|
276 { |
|
277 public: |
|
278 CExitWait(MExitWait& aWait); |
|
279 ~CExitWait(); |
|
280 private: |
|
281 void RunL(); |
|
282 void DoCancel(); |
|
283 private: |
|
284 MExitWait& iWait; |
|
285 TRequestStatus* iStatusPtr; |
|
286 }; |
|
287 |
|
288 //////////////////////////////////////////////////////////////////////// |
|
289 |
|
290 |
|
291 NONSHARABLE_CLASS(CSDLWin) : public CCoeControl |
|
292 { |
|
293 public: |
|
294 void ConstructL(const TRect& aRect); |
|
295 RWindow& GetWindow() const; |
|
296 void SetNoDraw(); |
|
297 private: |
|
298 void Draw(const TRect& aRect) const; |
|
299 private: |
|
300 TBool iNoDraw; |
|
301 }; |
|
302 |
|
303 |
|
304 //////////////////////////////////////////////////////////////////////////// |
|
305 |
|
306 NONSHARABLE_CLASS(CSDLAppUi) : public CAknAppUi, public MExitWait, MSDLObserver |
|
307 { |
|
308 public: |
|
309 ~CSDLAppUi(); |
|
310 private: // New functions |
|
311 void ConstructL(); |
|
312 void HandleCommandL(TInt aCommand); |
|
313 void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination); |
|
314 void HandleResourceChangeL(TInt aType); |
|
315 |
|
316 void DoExit(TInt aErr); |
|
317 |
|
318 TInt SdlEvent(TInt aEvent, TInt aParam); |
|
319 TInt SdlThreadEvent(TInt aEvent, TInt aParam); |
|
320 |
|
321 void StartL(); |
|
322 static TBool StartL(TAny* aThis); |
|
323 |
|
324 TBool ParamEditorL(TDes& aCheat); |
|
325 |
|
326 TBool ProcessCommandParametersL(CApaCommandLine &aCommandLine); |
|
327 |
|
328 void PrepareToExit(); |
|
329 void HandleConsoleWindowL(); |
|
330 void HandleConsoleWindow(); |
|
331 void HandleForegroundEventL(TBool aForeground); |
|
332 |
|
333 static TBool IdleRequestL(TAny* aThis); |
|
334 |
|
335 TBool HandleKeyL(const TWsEvent& aEvent); |
|
336 |
|
337 |
|
338 private: |
|
339 CExitWait* iWait; |
|
340 CSDLWin* iSDLWin; |
|
341 CSDL* iSdl; |
|
342 CIdle* iStarter; |
|
343 TBool iExitRequest; |
|
344 CDesC8Array* iParams; |
|
345 TInt iResOffset; |
|
346 CIdle* iIdle; |
|
347 TInt iStdOut; |
|
348 TVirtualCursor iCursor; |
|
349 CFbsBitmap* iCBmp; |
|
350 CFbsBitmap* iAlpha; |
|
351 // TTime iLastPress; |
|
352 // CSDL::TOrientationMode iOrientation; |
|
353 }; |
|
354 |
|
355 ////////////////////////////////////////////////////////////////////////////////////////7 |
|
356 |
|
357 CApaDocument* CSDLApplication::CreateDocumentL() |
|
358 { |
|
359 return new (ELeave) CSDLDocument(*this); |
|
360 } |
|
361 |
|
362 TUid CSDLApplication::AppDllUid() const |
|
363 { |
|
364 return iUid; |
|
365 } |
|
366 |
|
367 |
|
368 CSDLApplication::CSDLApplication() |
|
369 { |
|
370 TRAPD(err, FindMeL()); |
|
371 ASSERT(err == KErrNone); |
|
372 } |
|
373 |
|
374 void CSDLApplication::FindMeL() |
|
375 { |
|
376 RApaLsSession apa; |
|
377 User::LeaveIfError(apa.Connect()); |
|
378 CleanupClosePushL(apa); |
|
379 User::LeaveIfError(apa.GetAllApps()); |
|
380 TFileName name = RProcess().FileName(); |
|
381 TApaAppInfo info; |
|
382 while(apa.GetNextApp(info) == KErrNone) |
|
383 { |
|
384 if(info.iFullName.CompareF(name) == 0) |
|
385 { |
|
386 iUid = info.iUid; |
|
387 break; |
|
388 } |
|
389 } |
|
390 CleanupStack::PopAndDestroy(); |
|
391 } |
|
392 |
|
393 TFileName CSDLApplication::ResourceFileName() const |
|
394 { |
|
395 return KNullDesC(); |
|
396 } |
|
397 |
|
398 /////////////////////////////////////////////////////////////////////////////////////////// |
|
399 |
|
400 CExitWait::CExitWait(MExitWait& aWait) : CActive(CActive::EPriorityStandard), iWait(aWait) |
|
401 { |
|
402 CActiveScheduler::Add(this); |
|
403 SetActive(); |
|
404 iStatusPtr = &iStatus; |
|
405 } |
|
406 |
|
407 CExitWait::~CExitWait() |
|
408 { |
|
409 Cancel(); |
|
410 } |
|
411 |
|
412 void CExitWait::RunL() |
|
413 { |
|
414 if(iStatusPtr != NULL ) |
|
415 iWait.DoExit(iStatus.Int()); |
|
416 } |
|
417 |
|
418 void CExitWait::DoCancel() |
|
419 { |
|
420 if(iStatusPtr != NULL ) |
|
421 User::RequestComplete(iStatusPtr , KErrCancel); |
|
422 } |
|
423 |
|
424 |
|
425 ////////////////////////////////////////////////////////////////////////////////////////////// |
|
426 |
|
427 CSDLDocument::CSDLDocument(CEikApplication& aApp) : CEikDocument(aApp) |
|
428 {} |
|
429 |
|
430 CEikAppUi* CSDLDocument::CreateAppUiL() |
|
431 { |
|
432 return new (ELeave) CSDLAppUi; |
|
433 } |
|
434 |
|
435 /////////////////////////////////////////////////////////////////////////// |
|
436 |
|
437 void CSDLWin:: ConstructL(const TRect& aRect) |
|
438 { |
|
439 CreateWindowL(); |
|
440 SetRect(aRect); |
|
441 ActivateL(); |
|
442 } |
|
443 |
|
444 |
|
445 RWindow& CSDLWin::GetWindow() const |
|
446 { |
|
447 return Window(); |
|
448 } |
|
449 |
|
450 |
|
451 void CSDLWin::Draw(const TRect& /*aRect*/) const |
|
452 { |
|
453 if(!iNoDraw) |
|
454 { |
|
455 CWindowGc& gc = SystemGc(); |
|
456 gc.SetPenStyle(CGraphicsContext::ESolidPen); |
|
457 gc.SetPenColor(KRgbGray); |
|
458 gc.SetBrushStyle(CGraphicsContext::ESolidBrush); |
|
459 gc.SetBrushColor(0xaaaaaa); |
|
460 gc.DrawRect(Rect()); |
|
461 } |
|
462 } |
|
463 |
|
464 void CSDLWin::SetNoDraw() |
|
465 { |
|
466 iNoDraw = ETrue; |
|
467 } |
|
468 |
|
469 ///////////////////////////////////////////////////////////////////////// |
|
470 |
|
471 CSDLAppUi::~CSDLAppUi() |
|
472 { |
|
473 if(iIdle) |
|
474 iIdle->Cancel(); |
|
475 delete iIdle; |
|
476 if(iStarter != NULL) |
|
477 iStarter->Cancel(); |
|
478 delete iStarter; |
|
479 delete iWait; |
|
480 delete iSdl; |
|
481 delete iSDLWin; |
|
482 delete iParams; |
|
483 delete iCBmp; |
|
484 delete iAlpha; |
|
485 } |
|
486 |
|
487 |
|
488 void CSDLAppUi::ConstructL() |
|
489 { |
|
490 BaseConstructL(ENoAppResourceFile | ENoScreenFurniture); |
|
491 |
|
492 |
|
493 RLibrary lib; |
|
494 User::LeaveIfError(lib.Load(_L("sdlexe.dll"))); |
|
495 TFileName name = lib.FileName(); |
|
496 lib.Close(); |
|
497 name.Replace(3, name.Length() - 3, _L("resource\\apps\\sdlexe.rsc")); |
|
498 BaflUtils::NearestLanguageFile(iEikonEnv->FsSession(), name); |
|
499 iResOffset = iCoeEnv->AddResourceFileL(name); |
|
500 |
|
501 name.Replace(name.Length() - 3, 3, _L("mbm")); |
|
502 |
|
503 TEntry e; |
|
504 const TInt err = iEikonEnv->FsSession().Entry(name, e); |
|
505 |
|
506 iCBmp = iEikonEnv->CreateBitmapL(name, 0); |
|
507 iAlpha = iEikonEnv->CreateBitmapL(name, 1); |
|
508 |
|
509 iIdle = CIdle::NewL(CActive::EPriorityIdle); |
|
510 |
|
511 iSDLWin = new (ELeave) CSDLWin; |
|
512 iSDLWin->ConstructL(ApplicationRect()); |
|
513 |
|
514 iSdl = CSDL::NewL(gSDLClass.SdlFlags()); |
|
515 |
|
516 gSDLClass.SendEvent(MSDLMainObs::ESDLCreated, 0, iSdl); |
|
517 |
|
518 iSdl->SetObserver(this); |
|
519 iSdl->DisableKeyBlocking(*this); |
|
520 iSdl->SetContainerWindowL( |
|
521 iSDLWin->GetWindow(), |
|
522 iEikonEnv->WsSession(), |
|
523 *iEikonEnv->ScreenDevice()); |
|
524 iSdl->AppendOverlay(iCursor, 0); |
|
525 |
|
526 iCursor.Set(TRect(TPoint(0, 0), iSDLWin->Size()), iCBmp, iAlpha); |
|
527 |
|
528 iStarter = CIdle::NewL(CActive::EPriorityLow); |
|
529 iStarter->Start(TCallBack(StartL, this)); |
|
530 |
|
531 |
|
532 } |
|
533 |
|
534 |
|
535 |
|
536 TBool CSDLAppUi::StartL(TAny* aThis) |
|
537 { |
|
538 static_cast<CSDLAppUi*>(aThis)->StartL(); |
|
539 return EFalse; |
|
540 } |
|
541 |
|
542 |
|
543 void CSDLAppUi::PrepareToExit() |
|
544 { |
|
545 CAknAppUiBase::PrepareToExit(); //aknappu::PrepareToExit crashes |
|
546 iCoeEnv->DeleteResourceFile(iResOffset); |
|
547 } |
|
548 |
|
549 TBool CSDLAppUi::ProcessCommandParametersL(CApaCommandLine &aCommandLine) |
|
550 { |
|
551 const TPtrC8 cmdLine = aCommandLine.TailEnd(); |
|
552 iParams = new (ELeave) CDesC8ArrayFlat(8); |
|
553 MakeCCmdLineL(cmdLine, *iParams); |
|
554 return EFalse; |
|
555 } |
|
556 |
|
557 |
|
558 TBool CSDLAppUi::ParamEditorL(TDes& aCheat) |
|
559 { |
|
560 CAknTextQueryDialog* query = CAknTextQueryDialog::NewL(aCheat); |
|
561 CleanupStack::PushL(query); |
|
562 query->SetPromptL(_L("Enter parameters")); |
|
563 CleanupStack::Pop(); |
|
564 return query->ExecuteLD(R_PARAMEDITOR); |
|
565 } |
|
566 |
|
567 void CSDLAppUi::StartL() |
|
568 { |
|
569 if(gSDLClass.AppFlags() & SDLEnv::EParamQuery) |
|
570 { |
|
571 TBuf8<256> cmd; |
|
572 RFile file; |
|
573 TInt err = file.Open(iEikonEnv->FsSession(), _L("sdl_param.txt"),EFileRead); |
|
574 if(err == KErrNone) |
|
575 { |
|
576 file.Read(cmd); |
|
577 file.Close(); |
|
578 MakeCCmdLineL(cmd, *iParams); |
|
579 } |
|
580 if(err != KErrNone || gSDLClass.AppFlags() & (SDLEnv::EParamQueryDialog ^ SDLEnv::EParamQuery)) |
|
581 { |
|
582 TBuf<256> buffer; |
|
583 if(ParamEditorL(buffer)) |
|
584 { |
|
585 cmd.Copy(buffer); |
|
586 MakeCCmdLineL(cmd, *iParams); |
|
587 } |
|
588 } |
|
589 } |
|
590 iWait = new (ELeave) CExitWait(*this); |
|
591 iSdl->CallMainL(gSDLClass.Main(), &iWait->iStatus, iParams, CSDL::ENoParamFlags, 0xA000); |
|
592 } |
|
593 |
|
594 void CSDLAppUi::HandleCommandL(TInt aCommand) |
|
595 { |
|
596 switch(aCommand) |
|
597 { |
|
598 case EAknSoftkeyBack: |
|
599 case EAknSoftkeyExit: |
|
600 case EAknCmdExit: |
|
601 case EEikCmdExit: |
|
602 gSDLClass.AppFlags(SDLEnv::EAllowConsoleView); |
|
603 if(iWait == NULL || !iWait->IsActive() || iSdl == NULL) |
|
604 { |
|
605 Exit(); |
|
606 } |
|
607 else if(!iExitRequest) |
|
608 { |
|
609 iExitRequest = ETrue; //trick how SDL can be closed! |
|
610 iSdl->Suspend(); |
|
611 } |
|
612 break; |
|
613 } |
|
614 } |
|
615 |
|
616 |
|
617 |
|
618 TBool CSDLAppUi::HandleKeyL(const TWsEvent& aEvent) |
|
619 { |
|
620 const TInt type = aEvent.Type(); |
|
621 if(!(type == EEventKey || type == EEventKeyUp || type == EEventKeyDown)) |
|
622 { |
|
623 return ETrue; |
|
624 } |
|
625 const TKeyEvent& key = *aEvent.Key(); |
|
626 if((key.iScanCode == EStdKeyYes) && (gSDLClass.AppFlags() & SDLEnv::EVirtualMouse)) |
|
627 { |
|
628 if(type == EEventKeyUp) |
|
629 { |
|
630 iCursor.Toggle(); |
|
631 iSdl->RedrawRequest(); |
|
632 } |
|
633 return EFalse; |
|
634 } |
|
635 if(iCursor.IsOn()) |
|
636 { |
|
637 switch(key.iScanCode) |
|
638 { |
|
639 case EStdKeyUpArrow: |
|
640 iCursor.Move(0, -1); |
|
641 break; |
|
642 case EStdKeyDownArrow: |
|
643 iCursor.Move(0, 1); |
|
644 break; |
|
645 case EStdKeyLeftArrow: |
|
646 iCursor.Move(-1, 0); |
|
647 break; |
|
648 case EStdKeyRightArrow: |
|
649 iCursor.Move(1, 0); |
|
650 break; |
|
651 case EStdKeyDevice3: |
|
652 if(type == EEventKeyUp) |
|
653 { |
|
654 TWsEvent event; |
|
655 iCursor.MakeEvent(event, iSDLWin->Position()); |
|
656 iSdl->AppendWsEvent(event); |
|
657 } |
|
658 return EFalse; |
|
659 default: |
|
660 return ETrue; |
|
661 } |
|
662 iSdl->RedrawRequest(); |
|
663 return EFalse; |
|
664 } |
|
665 return ETrue; |
|
666 } |
|
667 |
|
668 void CSDLAppUi::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination) |
|
669 { |
|
670 if(iSdl && iWait && HandleKeyL(aEvent)) |
|
671 iSdl->AppendWsEvent(aEvent); |
|
672 CAknAppUi::HandleWsEventL(aEvent, aDestination); |
|
673 } |
|
674 |
|
675 void CSDLAppUi::HandleResourceChangeL(TInt aType) |
|
676 { |
|
677 CAknAppUi::HandleResourceChangeL(aType); |
|
678 if(aType == KEikDynamicLayoutVariantSwitch) |
|
679 { |
|
680 iSDLWin->SetRect(ApplicationRect()); |
|
681 iSdl->SetContainerWindowL( |
|
682 iSDLWin->GetWindow(), |
|
683 iEikonEnv->WsSession(), |
|
684 *iEikonEnv->ScreenDevice()); |
|
685 } |
|
686 } |
|
687 |
|
688 |
|
689 void CSDLAppUi::DoExit(TInt/*Err*/) |
|
690 { |
|
691 iExitRequest = ETrue; |
|
692 Exit(); |
|
693 } |
|
694 |
|
695 |
|
696 TInt CSDLAppUi::SdlThreadEvent(TInt aEvent, TInt /*aParam*/) |
|
697 { |
|
698 switch(aEvent) |
|
699 { |
|
700 case MSDLObserver::EEventResume: |
|
701 break; |
|
702 case MSDLObserver::EEventSuspend: |
|
703 if(iExitRequest) |
|
704 return MSDLObserver::ESuspendNoSuspend; |
|
705 break; |
|
706 case MSDLObserver::EEventWindowReserved: |
|
707 break; |
|
708 case MSDLObserver::EEventWindowNotAvailable: |
|
709 break; |
|
710 case MSDLObserver::EEventScreenSizeChanged: |
|
711 break; |
|
712 } |
|
713 return MSDLObserver::EParameterNone; |
|
714 } |
|
715 |
|
716 TInt CSDLAppUi::SdlEvent(TInt aEvent, TInt /*aParam*/) |
|
717 { |
|
718 switch(aEvent) |
|
719 { |
|
720 case MSDLObserver::EEventResume: |
|
721 break; |
|
722 case MSDLObserver::EEventSuspend: |
|
723 if(iExitRequest) |
|
724 return MSDLObserver::ESuspendNoSuspend; |
|
725 break; |
|
726 case MSDLObserver::EEventWindowReserved: |
|
727 break; |
|
728 case MSDLObserver::EEventWindowNotAvailable: |
|
729 { |
|
730 TRAP_IGNORE(HandleConsoleWindowL()); |
|
731 } |
|
732 break; |
|
733 case MSDLObserver::EEventScreenSizeChanged: |
|
734 break; |
|
735 case MSDLObserver::EEventKeyMapInit: |
|
736 break; |
|
737 case MSDLObserver::EEventMainExit: |
|
738 if(iStdOut != 0) |
|
739 { |
|
740 gSDLClass.AppFlags(SDLEnv::EAllowConsoleView); |
|
741 iEikonEnv->WsSession().SetWindowGroupOrdinalPosition(iStdOut, 0); |
|
742 } |
|
743 break; |
|
744 } |
|
745 return MSDLObserver::EParameterNone; |
|
746 } |
|
747 |
|
748 void CSDLAppUi::HandleForegroundEventL(TBool aForeground) |
|
749 { |
|
750 CAknAppUi::HandleForegroundEventL(aForeground); |
|
751 if(!aForeground) |
|
752 HandleConsoleWindow(); |
|
753 } |
|
754 |
|
755 void CSDLAppUi::HandleConsoleWindow() |
|
756 { |
|
757 if(!iIdle->IsActive()) |
|
758 iIdle->Start(TCallBack(IdleRequestL, this)); |
|
759 } |
|
760 |
|
761 TBool CSDLAppUi::IdleRequestL(TAny* aThis) |
|
762 { |
|
763 static_cast<CSDLAppUi*>(aThis)->HandleConsoleWindowL(); |
|
764 return EFalse; |
|
765 } |
|
766 |
|
767 void CSDLAppUi::HandleConsoleWindowL() |
|
768 { |
|
769 if(gSDLClass.AppFlags() & SDLEnv::EAllowConsoleView) |
|
770 { |
|
771 return; |
|
772 } |
|
773 RWsSession& ses = iEikonEnv->WsSession(); |
|
774 const TInt focus = ses.GetFocusWindowGroup(); |
|
775 CApaWindowGroupName* name = CApaWindowGroupName::NewLC(ses, focus); |
|
776 const TPtrC caption = name->Caption(); |
|
777 if(0 == caption.CompareF(_L("STDOUT"))) |
|
778 { |
|
779 iStdOut = focus; |
|
780 ses.SetWindowGroupOrdinalPosition(iEikonEnv->RootWin().Identifier(), 0); |
|
781 } |
|
782 CleanupStack::PopAndDestroy(); //name |
|
783 } |
|
784 |
|
785 |
|
786 //////////////////////////////////////////////////////////////////////// |
|
787 |
|
788 |
|
789 CApaApplication* NewApplication() |
|
790 { |
|
791 return new CSDLApplication(); |
|
792 } |
|
793 |
|
794 |
|
795 EXPORT_C TInt SDLEnv::SetMain(const TMainFunc& aFunc, TInt aSdlFlags, MSDLMainObs* aObs, TInt aSdlExeFlags) |
|
796 { |
|
797 gSDLClass.SetMain(aFunc, aSdlFlags, aObs, aSdlExeFlags); |
|
798 return EikStart::RunApplication(NewApplication); |
|
799 } |
|
800 |
|
801 ////////////////////////////////////////////////////////////////////// |
|
802 |
|
803 TInt SDLUiPrint(const TDesC8& /*aInfo*/) |
|
804 { |
|
805 return KErrNotFound; |
|
806 } |
|
807 |
|
808 |
|
809 |