diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/tman/TMMODCHG.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/tman/TMMODCHG.CPP Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,301 @@ +// Copyright (c) 1996-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 modifier changed message +// +// + +#include +#include +#include "W32STD.H" +#include "../tlib/testbase.h" +#include "TMAN.H" + +class CTModifiersChangedTest; + +class CMCWindow : public CTWin + { +public: + CMCWindow(CTModifiersChangedTest *aTest); + void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc); + void Draw(); + void DrawModSetLine(const TDesC &aDes,TInt aModifier,TInt iSettableModifiers); +protected: + CTModifiersChangedTest *iTest; + TRgb iBack; + TInt iLineHeight; + TInt iFontAscent; + TInt iYpos; + TInt iXpos1; + TInt iXpos2; + }; + +class CTEventWindowGroup : public CTWindowGroup + { +public: + CTEventWindowGroup(CTClient *aClient, CTModifiersChangedTest *iTest); + void ConstructL(); + void ModifiersChanged(const TModifiersChangedEvent &aModifiersChanged ,const TTime &aTime); + void KeyL(const TKeyEvent &aKey,const TTime &aTime); +private: + CTModifiersChangedTest *iTest; + }; + +class CTModifiersChangedTest : public CTestBase + { +public: + CTModifiersChangedTest(); + ~CTModifiersChangedTest(); + TestState DoTestL(); + void ConstructL(); + void EndTest(); + TInt SubState() const; + void IncSubState(); + void BadParams(); + void ModifierChangedEventsL(); + void SetModifiersL(); + void CheckModifierL(TEventModifier aModifier); +public: + TBool iModSetTest; + TInt iSettable; +private: + TSize iWinSize; + TInt iState; + TInt iSubState; + CTEventWindowGroup *iEventGroup; + CMCWindow *iWin; + }; + +struct TModifierChangedTestsParams + { + TText *txt; // Text message telling user what to do + TUint changed; + TUint state; + TUint stateMask; + }; + +LOCAL_D TModifierChangedTestsParams ModifierChangedTests[]={ +#if defined(__WINS__) + {(TText *)_S("Press Caps"),EModifierCapsLock,EModifierCapsLock,EModifierCapsLock}, + {(TText *)_S("Press Caps (again)"),EModifierCapsLock,0,EModifierCapsLock}, +#endif + {(TText *)_S("Press left shift"),EModifierShift|EModifierLeftShift,EModifierShift|EModifierLeftShift,EModifierShift|EModifierLeftShift}, + {(TText *)_S("Release left shift"),EModifierShift|EModifierLeftShift,0,EModifierShift|EModifierLeftShift}, + {(TText *)_S("Press right shift"),EModifierShift|EModifierRightShift,EModifierShift|EModifierRightShift,EModifierShift|EModifierRightShift}, + {(TText *)_S("Release right shift"),EModifierShift|EModifierRightShift,0,EModifierShift|EModifierRightShift}, + {(TText *)_S("Press (left) func"),EModifierFunc|EModifierLeftFunc,EModifierFunc|EModifierLeftFunc,EModifierFunc|EModifierLeftFunc}, + {(TText *)_S("Release (left) func"),EModifierFunc|EModifierLeftFunc,0,EModifierFunc|EModifierLeftFunc}, + {(TText *)_S("Press (left) control"),EModifierCtrl|EModifierLeftCtrl,EModifierCtrl|EModifierLeftCtrl,EModifierCtrl|EModifierLeftCtrl}, + {(TText *)_S("Release (left) control"),EModifierCtrl|EModifierLeftCtrl,0,EModifierCtrl|EModifierLeftCtrl}, + }; + +const TInt numTests=sizeof(ModifierChangedTests)/sizeof(ModifierChangedTests[0]); + +GLDEF_C CTestBase *CreateModifiersChangedTest() + { + return(new(ELeave) CTModifiersChangedTest()); + } + +// +// CTEventWindowGroup class // +// + +CTEventWindowGroup::CTEventWindowGroup(CTClient *aClient, CTModifiersChangedTest *aTest) : CTWindowGroup(aClient), iTest(aTest) + {} + +void CTEventWindowGroup::ConstructL() + { + CTWindowGroup::ConstructL(); + iGroupWin.EnableModifierChangedEvents(EModifierShift|EModifierLeftShift|EModifierRightShift|EModifierCapsLock| + EModifierFunc|EModifierLeftFunc|EModifierCtrl|EModifierLeftCtrl,EEventControlAlways); + } + +void CTEventWindowGroup::ModifiersChanged(const TModifiersChangedEvent &aModifiersChanged ,const TTime &) + { + TInt ss=iTest->SubState(); + TInt getMods=Client()->iWs.GetModifierState(); // Double check the mods with get mods + if (aModifiersChanged.iChangedModifiers==ModifierChangedTests[ss].changed && + (aModifiersChanged.iModifiers&ModifierChangedTests[ss].stateMask)==ModifierChangedTests[ss].state && + (getMods&ModifierChangedTests[ss].stateMask)==ModifierChangedTests[ss].state) + iTest->IncSubState(); + } + +void CTEventWindowGroup::KeyL(const TKeyEvent &aKey,const TTime &) + { + if (aKey.iCode==EKeyEscape || (aKey.iCode==' ' && iTest->iModSetTest)) + iTest->EndTest(); + } + +// +// CMCWindow, class // +// + +CMCWindow::CMCWindow(CTModifiersChangedTest *aTest) : CTWin(), iTest(aTest) + { + iBack=TRgb::Gray256(230); + } + +void CMCWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc) + { + ConstructExtLD(*parent,pos,size); + iWin.SetBackgroundColor(iBack); + Activate(); + AssignGC(aGc); + iLineHeight=iFont->HeightInPixels()*5/4; + iFontAscent=iFont->AscentInPixels(); + iXpos1=4; + iXpos2=iXpos1+12*iFont->TextWidthInPixels(_L("M")); + } + +void CMCWindow::DrawModSetLine(const TDesC &aDes,TInt aModifier,TInt iSettableModifiers) + { + iYpos+=iLineHeight; + iGc->DrawText(aDes, TPoint(iXpos1,iYpos)); + iGc->DrawText(aModifier&iSettableModifiers ? _L("Yes"):_L("No"), TPoint(iXpos2,iYpos)); + } + +void CMCWindow::Draw() + { + iGc->Clear(); + if (iTest->iModSetTest) + { + iYpos=iFontAscent+3; + TBuf<32> buf; + buf.Format(TRefByValue(_L("Settable? [0x%4x]")), iTest->iSettable); + iGc->DrawText(_L("Modifier"), TPoint(iXpos1,iYpos)); + iGc->DrawText(buf, TPoint(iXpos2,iYpos)); + DrawModSetLine(_L("Shift"),EModifierShift,iTest->iSettable); + DrawModSetLine(_L("Left Shift"),EModifierLeftShift,iTest->iSettable); + DrawModSetLine(_L("Func"),EModifierFunc,iTest->iSettable); + DrawModSetLine(_L("Caps"),EModifierCapsLock,iTest->iSettable); + DrawModSetLine(_L("NumLock"),EModifierNumLock,iTest->iSettable); + DrawModSetLine(_L("Double Click"),EModifierDoubleClick,iTest->iSettable); + } + else + iGc->DrawText(TPtrC(ModifierChangedTests[iTest->SubState()].txt), TPoint(10,20)); + } + +// + +CTModifiersChangedTest::CTModifiersChangedTest() : CTestBase(_L("Capture Key")) + {} + +CTModifiersChangedTest::~CTModifiersChangedTest() + { + delete iWin; + delete iEventGroup; + } + +void CTModifiersChangedTest::EndTest() + { + if (iModSetTest) + { + iModSetTest=EFalse; + iWin->Invalidate(); + } + Request(); + } + +void CTModifiersChangedTest::ConstructL() + { + iWin=new(ELeave) CMCWindow(this); + iWin->SetUpL(TPoint(10,10),TSize(240,200),Client()->iGroup, *Client()->iGc); + } + +TInt CTModifiersChangedTest::SubState() const + { + return(iSubState); + } + +void CTModifiersChangedTest::IncSubState() + { + if (iSubState==(numTests-1)) + EndTest(); + else + { + iSubState++; + iWin->Invalidate(); + } + } + +void CTModifiersChangedTest::BadParams() + { + } + +void CTModifiersChangedTest::ModifierChangedEventsL() + { + iEventGroup=new(ELeave) CTEventWindowGroup(Client(), this); + iEventGroup->ConstructL(); + } + +void CTModifiersChangedTest::CheckModifierL(TEventModifier aModifier) + { + TInt oldMods=Client()->iWs.GetModifierState(); + Client()->iWs.SetModifierState(aModifier, EToggleModifier); + TInt getMods=Client()->iWs.GetModifierState(); + if (oldMods!=getMods) + { + iSettable|=aModifier; + Client()->iWs.SetModifierState(aModifier, ETurnOffModifier); + getMods=Client()->iWs.GetModifierState(); + TestL(!(getMods&aModifier)); + Client()->iWs.SetModifierState(aModifier, ETurnOnModifier); + getMods=Client()->iWs.GetModifierState(); + TestL(getMods&aModifier); + Client()->iWs.SetModifierState(aModifier, ETurnOffModifier); + getMods=Client()->iWs.GetModifierState(); + TestL(!(getMods&aModifier)); + if (oldMods&aModifier) + Client()->iWs.SetModifierState(aModifier, ETurnOnModifier); + } + else + { + Client()->iWs.SetModifierState(aModifier, ETurnOffModifier); + TestL(oldMods==Client()->iWs.GetModifierState()); + Client()->iWs.SetModifierState(aModifier, ETurnOnModifier); + TestL(oldMods==Client()->iWs.GetModifierState()); + } + } + +void CTModifiersChangedTest::SetModifiersL() + { + iModSetTest=ETrue; + for(TInt mod=1;mod!=0;mod<<=1) + CheckModifierL((TEventModifier)mod); + iWin->Invalidate(); + Client()->iWs.Flush(); + } + +TestState CTModifiersChangedTest::DoTestL() + { + switch(iState) + { + case 0: //The first 2 tests have been converted to TAuto test code. + ModifierChangedEventsL(); + /* iState++; + return(EContinue); + case 1: + LogSubTest(_L("Errors"),1); + BadParams(); + break; + case 2:*/ + LogSubTest(_L("Set modifiers"),1); + SetModifiersL(); + iState++; + return(EContinue); + default: + return(EFinished); + } + //iState++; + //return(ENext); + }