3975
|
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
|