windowing/windowserver/profiler/ProfilerKeys.cpp
changeset 0 5d03bc08d59c
--- /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 <e32base.h>
+#include <w32std.h>
+#include <profiler.h>
+
+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();
+	}
+
+