diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/tman/HOTKEY2.CPP --- /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 +#include +#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 \"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 \"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;indexiWs.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;indexiWs.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 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;indexiWs.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); + }