diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/profiler/ProfilerKeys.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/profiler/ProfilerKeys.cpp Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,149 @@ +// Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// HotKey user interface to the PC-sampling Profiler engine in E32utils +// +// + +#include +#include +#include + +class CKeys : public CActive, private MProfilerController + { + class THotKey + { + enum {KAllModifiers = EModifierFunc|EModifierCtrl|EModifierShift}; + public: + inline THotKey() + :iCapture(-1) + {} + inline void CaptureL(RWindowGroup& aWg, TUint aKey) + {iCapture=User::LeaveIfError(aWg.CaptureKey(aKey,KAllModifiers,KAllModifiers));} + inline void Release(RWindowGroup& aWg) + {if (iCapture != -1) aWg.CancelCaptureKey(iCapture);} + private: + TInt32 iCapture; + }; +public: + IMPORT_C static MProfilerController* NewL(TInt aPriority, MProfilerEngine& aEngine); +private: + CKeys(TInt aPriority, MProfilerEngine& aEngine); + void ConstructL(); + ~CKeys(); + void Release(); +// + void Queue(); +// + void RunL(); + void DoCancel(); +// +private: + RWsSession iWs; + RWindowGroup iWg; + THotKey iStartKey; + THotKey iStopKey; + THotKey iCloseKey; + THotKey iUnloadKey; + THotKey iTestKey; + }; + + + + +EXPORT_C MProfilerController* CKeys::NewL(TInt aPriority, MProfilerEngine& aEngine) + { + CKeys* self = new(ELeave) CKeys(aPriority, aEngine); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +CKeys::CKeys(TInt aPriority, MProfilerEngine& aEngine) + :CActive(aPriority), MProfilerController(aEngine) + { + CActiveScheduler::Add(this); + } + +void CKeys::ConstructL() + { + User::LeaveIfError(iWs.Connect()); + iWg = iWs; + User::LeaveIfError(iWg.Construct(0,EFalse)); + iWg.AutoForeground(EFalse); + iStartKey.CaptureL(iWg, '1'); + iStopKey.CaptureL(iWg, '2'); + iCloseKey.CaptureL(iWg, '3'); + iUnloadKey.CaptureL(iWg, '4'); + iTestKey.CaptureL(iWg, '0'); + Queue(); + } + +CKeys::~CKeys() + { + Cancel(); + iStartKey.Release(iWg); + iStopKey.Release(iWg); + iCloseKey.Release(iWg); + iUnloadKey.Release(iWg); + iTestKey.Release(iWg); + iWg.Close(); + iWs.Close(); + } + +void CKeys::Release() + { + delete this; + } + +void CKeys::Queue() + { + iWs.EventReady(&iStatus); + SetActive(); + } + +void CKeys::RunL() + { + TWsEvent ev; + iWs.GetEvent(ev); + if (ev.Type() == EEventKey) + { + switch (ev.Key()->iCode) + { + case '0': + { + _LIT(KTestPrint,"Profiler is "); + static const TText* const KStates[] = {_S("running"),_S("waiting"),_S("loaded"),_S("?")}; + TBuf<60> info(KTestPrint); + info.Append(TPtrC(KStates[GetState()])); + User::InfoPrint(info); + } + break; + case '1': + case '2': + case '3': + case '4': + Control(Profiler::TState(ev.Key()->iCode - '1')); + break; + } + } + Queue(); + } + +void CKeys::DoCancel() + { + iWs.EventReadyCancel(); + } + +