--- /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);
+ }