windowing/windowserver/tman/HOTKEY2.CPP
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/tman/HOTKEY2.CPP	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,424 @@
+// Copyright (c) 1995-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:
+// Test capture key
+// 
+//
+
+#include <e32std.h>
+#include <e32svr.h>
+#include "W32STD.H"
+#include "../tlib/testbase.h"
+#include "TMAN.H"
+
+enum THotKeyRetValues
+	{
+	EHotKeyOkay,
+	EHotKeyRetry,
+	EHotKeyFail,
+	};
+
+struct SHotKeyParams
+	{
+	THotKey hotKey;
+	TUint keyCode;
+	TUint mod_mask;
+	TUint modifiers;
+	};
+
+struct SHotKeyTestParams
+	{
+	TText *txt;			// Text message telling user what to do
+	};
+
+LOCAL_D SHotKeyParams HotKeys[]={
+	{EHotKeyEnableLogging,'e',EModifierFunc|EModifierCtrl|EModifierShift,0},
+	{EHotKeyDisableLogging,'d',EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc},
+	{EHotKeyOfDeath,'q',0},
+	{EHotKeyOfDeath,'w',0},
+	};
+	
+LOCAL_D SHotKeyTestParams HotKeyTests[]={
+	{(TText *)_S("Use \"e\" to enable logging")},
+	{(TText *)_S("Use \"<Alt>d\" to disable logging")},
+	{(TText *)_S("Use \"q\" to kill the foreground app")},
+	{(TText *)_S("Use \"w\" to kill the foreground app")},
+	{(TText *)_S("Use \"<Cntrl><Alt><Shift>K\" to kill the foreground app")},
+	};
+
+LOCAL_D TBool HotKeyTestIsDeathTest[]={EFalse, EFalse, ETrue, ETrue, ETrue};
+
+struct SErrorHotKey
+	{
+	THotKey hotKey;
+	TUint keyCode;
+	TUint mod_mask;
+	TUint modifiers;
+	};
+
+LOCAL_D SErrorHotKey errorKeys[]={
+	{EHotKeyEnableLogging,'a',EModifierFunc|EModifierShift,EModifierFunc|EModifierCtrl},
+	{EHotKeyDisableLogging,'1',0,EModifierFunc},
+	{EHotKeyEnableLogging,3,EModifierCtrl,EModifierCtrl|EModifierShift},
+	{EHotKeyDisableLogging,'a',EModifierFunc|EModifierShift,EModifierFunc|EModifierCtrl},
+	{(THotKey)100,'1',0,EModifierFunc},
+	{(THotKey)200, 3,EModifierCtrl,EModifierCtrl|EModifierShift},
+	};
+
+const TInt numHotKeys=sizeof(HotKeys)/sizeof(HotKeys[0]);
+const TInt numHotKeyTests=sizeof(HotKeyTests)/sizeof(HotKeyTests[0]);
+const TInt numErrorKeys=sizeof(errorKeys)/sizeof(errorKeys[0]);
+
+class SHKWindow;
+class THotKeyTest;
+class SHKConnection;
+
+class SHKDeath : public CActive
+	{
+public:
+	SHKDeath(TInt aPriority);
+	void SetConnection(SHKConnection *aConn);
+	virtual void DoCancel();
+	virtual void RunL();
+	void Request();
+private:
+	SHKConnection *iConn;
+	};
+
+class SHKWindowGroup : public CTWindowGroup
+	{
+public:
+	SHKWindowGroup(CTClient *aClient);
+	void KeyL(const TKeyEvent &aKey,const TTime &aTime);
+	};
+
+class SHKConnection : public CTClient
+	{
+public:
+	SHKConnection(THotKeyTest *aTest, TInt aMode);
+	~SHKConnection();
+	void ConstructL();
+	void KeyL(const TKeyEvent &aKey);
+	void SubStateChangedL();
+	void CompleteL();
+protected:
+	TInt iMode;
+	SHKDeath iDeath;
+	THotKeyTest *iTest;
+	CTWin *iWin;
+	static TInt iMainWinId;
+	};
+
+class SHKWindow : public CTWin
+	{
+public:
+	SHKWindow(THotKeyTest *aTest);
+	void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
+	void Draw();
+protected:
+	THotKeyTest *iTest;
+	TRgb iBack;
+	};
+
+class SHKWindow2 : public CTWin
+	{
+public:
+	SHKWindow2();
+	void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
+	void Draw();
+	};
+
+class THotKeyTest : public CTestBase
+	{
+public:
+	THotKeyTest();
+	~THotKeyTest();
+	TestState DoTestL();
+	void ConstructL();
+	void EndCaptureKeyTest();
+	TInt SubState() const;
+	void IncSubStateL();
+	void BadParamsL();
+private:
+	SHKConnection *iConn1;
+	TSize iWinSize;
+	TInt iState;
+	TInt iSubState;
+	TBool iIsInActiveScheduler;
+	};
+
+TInt SHKConnection::iMainWinId;
+
+TInt SubThread(TAny *);
+
+GLDEF_C CTestBase *CreateHotKeyTest()
+	{
+	return(new(ELeave) THotKeyTest());
+	}
+
+THotKeyTest::THotKeyTest() : CTestBase(_L("Hot Key"))
+	{}
+
+THotKeyTest::~THotKeyTest()
+	{
+	User::SetJustInTime(ETrue);
+	for(TInt index=0;index<numHotKeys;index++)
+		{
+		Client()->iWs.ClearHotKeys(HotKeys[index].hotKey);
+		Client()->iWs.RestoreDefaultHotKey(HotKeys[index].hotKey);
+		}
+	delete iConn1;
+	if (iIsInActiveScheduler)
+		CActiveScheduler::Stop();
+	}
+
+void THotKeyTest::EndCaptureKeyTest()
+	{
+	Request();
+	}
+
+void THotKeyTest::ConstructL()
+	{
+	iConn1=new(ELeave) SHKConnection(this, EFalse);
+	iConn1->ConstructL();
+	for(TInt index=0;index<numHotKeys;index++)
+		User::LeaveIfError(Client()->iWs.SetHotKey(HotKeys[index].hotKey, HotKeys[index].keyCode,HotKeys[index].mod_mask,HotKeys[index].modifiers));
+	User::SetJustInTime(EFalse);
+	}
+
+//
+// SHKDeath //
+//
+
+SHKDeath::SHKDeath(TInt aPriority) : CActive(aPriority)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void SHKDeath::SetConnection(SHKConnection *aConn)
+	{
+	iConn=aConn;
+	}
+
+void SHKDeath::DoCancel()
+	{
+	}
+
+void SHKDeath::RunL()
+	{
+	iConn->CompleteL();
+	}
+
+void SHKDeath::Request()
+	{
+	SetActive();
+	}
+
+//
+
+SHKWindowGroup::SHKWindowGroup(CTClient *aClient) : CTWindowGroup(aClient)
+	{}
+
+void SHKWindowGroup::KeyL(const TKeyEvent &aKey,const TTime &)
+	{
+	((SHKConnection *)iClient)->KeyL(aKey);
+	}
+
+//
+// SHKConnection
+
+SHKConnection::SHKConnection(THotKeyTest *aTest, TInt aMode) : iMode(aMode), iDeath(100), iTest(aTest)
+	{
+	iDeath.SetConnection(this);
+	}
+
+SHKConnection::~SHKConnection()
+	{
+	iGroup->GroupWin()->EnableReceiptOfFocus(EFalse);
+	CTWin::Delete(iWin);
+	}
+
+void SHKConnection::KeyL(const TKeyEvent &aKey)
+	{
+	if (iTest)
+		{
+		if (aKey.iCode==EKeyEnter && !HotKeyTestIsDeathTest[iTest->SubState()])
+			iTest->IncSubStateL();
+		else if (aKey.iCode==EKeyEscape)
+			iTest->AbortL();
+		}
+	}
+
+void SHKConnection::CompleteL()
+	{
+	iTest->IncSubStateL();
+	}
+
+void SHKConnection::SubStateChangedL()
+	{
+	if (HotKeyTestIsDeathTest[iTest->SubState()])
+		{
+		RThread thread;
+		iMainWinId=iGroup->GroupWin()->Identifier();
+		TInt subState=iTest->SubState();
+		User::After(100000);
+		User::LeaveIfError(thread.Create(_L("SubThread"),SubThread,KDefaultStackSize,0x2000,0x2000,&subState,EOwnerThread));
+		thread.Logon(iDeath.iStatus);
+		iDeath.Request();
+		thread.Resume();
+		thread.Close();
+		}
+	iWin->Invalidate();
+	iWs.Flush();
+	}
+
+void SHKConnection::ConstructL()
+	{
+	CTClient::ConstructL();
+	iGroup=new(ELeave) SHKWindowGroup(this);
+	iGroup->ConstructL();
+	TSize screenSize=iGroup->Size();
+	iGroup->GroupWin()->AutoForeground(EFalse);		// Don't allow clicking to cause foreground, might mess up test
+	TInt winWidth;
+	TInt winHeight;
+	if (iMode==0)
+		{
+		winWidth=screenSize.iWidth/2;
+		winHeight=screenSize.iHeight-10;
+		SHKWindow *win=new(ELeave) SHKWindow(iTest);
+		win->SetUpL(TPoint(5,5),TSize(winWidth,winHeight),iGroup,*iGc);
+		iWin=win;
+		}
+	else
+		{
+		winWidth=150;
+		winHeight=50;
+		iGroup->GroupWin()->SetOwningWindowGroup(iMainWinId);
+		SHKWindow2 *win=new(ELeave) SHKWindow2();
+		win->SetUpL(TPoint((screenSize.iWidth-winWidth)/2,(screenSize.iHeight-winHeight)/2),TSize(winWidth,winHeight),iGroup,*iGc);
+		iWin=win;
+		}
+	iWs.Flush();
+	}
+
+//
+// SHKWindow, class //
+//
+
+SHKWindow::SHKWindow(THotKeyTest *aTest) : CTWin(), iTest(aTest)
+	{
+	iBack=TRgb::Gray256(230);
+	}
+
+void SHKWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
+	{
+	ConstructExtLD(*parent,pos,size);
+	iWin.SetBackgroundColor(iBack);
+	Activate();
+	AssignGC(aGc);
+	}
+
+void SHKWindow::Draw()
+	{
+	iGc->Clear();
+	iGc->DrawText(TPtrC(HotKeyTests[iTest->SubState()].txt), TPoint(10,20));
+	iGc->DrawText(TPtrC(_L("Press <Enter> when tested okay")), TPoint(10,35));
+	iGc->DrawText(TPtrC(_L("or escape to abort tests")), TPoint(10,50));
+	}
+
+//
+// SHKWindow2, class //
+//
+
+SHKWindow2::SHKWindow2() : CTWin()
+	{
+	}
+
+void SHKWindow2::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
+	{
+	ConstructExtLD(*parent,pos,size);
+	iWin.SetBackgroundColor(TRgb(0,0,0));
+	Activate();
+	AssignGC(aGc);
+	}
+
+void SHKWindow2::Draw()
+	{
+	iGc->SetBrushColor(TRgb::Gray4(1));
+	iGc->Clear();
+	iGc->SetPenColor(TRgb::Gray4(3));
+	iGc->DrawText(TPtrC(_L("Kill me!!!")), TPoint(10,15));
+	}
+
+//
+
+TInt THotKeyTest::SubState() const
+	{
+	return(iSubState);
+	}
+
+void THotKeyTest::IncSubStateL()
+	{
+	if (iSubState==(numHotKeyTests-1))
+		EndCaptureKeyTest();
+	else
+		{
+		iSubState++;
+		iConn1->SubStateChangedL();
+		}
+	}
+
+void THotKeyTest::BadParamsL()
+	{
+	TInt resCount=Client()->iWs.ResourceCount();
+	for(TInt index=0;index<numErrorKeys;index++)
+		TestL(Client()->iWs.SetHotKey(errorKeys[index].hotKey, errorKeys[index].keyCode,errorKeys[index].mod_mask,errorKeys[index].modifiers)==KErrArgument);
+	TestL(Client()->iWs.ResourceCount()==resCount);
+	}
+
+TestState THotKeyTest::DoTestL()
+	{
+	switch(iState)
+		{
+		case 0:
+			LogSubTest(_L("Errors"),1);
+			BadParamsL();
+			LogSubTest(_L("CaptureKey"),2);
+			iState++;
+			return(EContinue);
+		default:
+			return(EFinished);
+		}
+ 	}
+
+//======================================================//
+// Sub thread to do tests and get shot by window server //
+//======================================================//
+
+void SubThreadMain()
+	{
+	CActiveScheduler *TheActiveScheduler=new(ELeave) CActiveScheduler;
+	CActiveScheduler::Install(TheActiveScheduler);
+	SHKConnection *conn=new(ELeave) SHKConnection(NULL, ETrue);
+	conn->ConstructL();
+	CActiveScheduler::Start();
+	delete TheActiveScheduler;
+	}
+
+TInt SubThread(TAny *)
+	{
+	CTrapCleanup* CleanUpStack=CTrapCleanup::New();
+	TRAPD(err,SubThreadMain());
+	delete CleanUpStack;
+	return(err);
+	}