commands/focus/focus.cpp
changeset 0 7f656887cf89
child 80 562156073bab
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/focus/focus.cpp	Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,160 @@
+// focus.cpp
+// 
+// Copyright (c) 2008 - 2010 Accenture. All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the "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:
+// Accenture - Initial contribution
+//
+
+#include <w32std.h>
+#include <apgwgnam.h>
+#include <fshell/ioutils.h>
+
+const TInt KPriorityNeverAtFront = -999;
+
+using namespace IoUtils;
+
+class CCmdFocus : public CCommandBase
+	{
+public:
+	static CCommandBase* NewLC();
+	~CCmdFocus();
+private:
+	CCmdFocus();
+	void PrintDetailsL();
+	void FocusWindowGroupL(TInt aWindowGroupId);
+private: // From CCommandBase.
+	virtual const TDesC& Name() const;
+	virtual void DoRunL();
+	virtual void OptionsL(RCommandOptionList& aOptions);
+private:
+	RWsSession iWsSession;
+	RWindowGroup iWindowGroup;
+	TInt iWindowGroupId;
+	HBufC* iWindowGroupPattern;
+	TBool iFollow;
+	TBool iVerbose;
+	};
+
+
+CCommandBase* CCmdFocus::NewLC()
+	{
+	CCmdFocus* self = new(ELeave) CCmdFocus();
+	CleanupStack::PushL(self);
+	self->BaseConstructL();
+	return self;
+	}
+
+CCmdFocus::~CCmdFocus()
+	{
+	iWindowGroup.Close();
+	iWsSession.Close();
+	delete iWindowGroupPattern;
+	}
+
+CCmdFocus::CCmdFocus()
+	{
+	}
+
+const TDesC& CCmdFocus::Name() const
+	{
+	_LIT(KName, "focus");	
+	return KName;
+	}
+
+void CCmdFocus::DoRunL()
+	{
+	LeaveIfErr(iWsSession.Connect(), _L("Couldn't connect to windowserver"));
+
+	if (iOptions.IsPresent(&iWindowGroupId))
+		{
+		FocusWindowGroupL(iWindowGroupId);
+		}
+	else if (iWindowGroupPattern)
+		{
+		TInt id = 0;
+		id = iWsSession.FindWindowGroupIdentifier(id, *iWindowGroupPattern);
+		if (id >= 0)
+			{
+			FocusWindowGroupL(id);
+			}
+		}
+	else
+		{
+		PrintDetailsL();
+		if (iFollow)
+			{
+			iWindowGroup = RWindowGroup(iWsSession);
+			User::LeaveIfError(iWindowGroup.Construct((TUint32)this,EFalse));
+			iWindowGroup.SetOrdinalPosition(0, KPriorityNeverAtFront);
+			iWindowGroup.EnableFocusChangeEvents();
+
+			TRequestStatus status;
+			FOREVER
+				{
+				iWsSession.EventReady(&status);
+				User::WaitForRequest(status);
+				User::LeaveIfError(status.Int());
+				TWsEvent event;
+				iWsSession.GetEvent(event);
+				if (event.Type() == EEventFocusGroupChanged) 
+					{
+					PrintDetailsL();
+					}
+				}
+			}
+		}
+	}
+
+void CCmdFocus::PrintDetailsL()
+	{
+	TInt focusedWgId = iWsSession.GetFocusWindowGroup();
+	CApaWindowGroupName* wgn = CApaWindowGroupName::NewLC(iWsSession, focusedWgId);
+	_LIT(KUnknown, "Un-named");
+	TPtrC caption(wgn->Caption());
+	if (caption.Length() == 0)
+		{
+		caption.Set(KUnknown);
+		}
+	Printf(_L("Focused window group: %S\r\n"), &caption);
+	CleanupStack::PopAndDestroy(wgn);
+
+	if (iVerbose)
+		{
+		TThreadId focusedThreadId;
+		User::LeaveIfError(iWsSession.GetWindowGroupClientThreadId(focusedWgId, focusedThreadId));
+		RThread thread;
+		User::LeaveIfError(thread.Open(focusedThreadId));
+		TFullName name(thread.FullName());
+		thread.Close();
+		Printf(_L("  Window group id:    %u\r\n"), focusedWgId);
+		Printf(_L("  Owning thread:      %S\r\n"), &name);
+		Printf(_L("  Owning thread id:   %u\r\n"), (TUint32)focusedThreadId);
+		Printf(_L("  Tick count:         %u\r\n"), User::NTickCount());
+		}
+	}
+
+void CCmdFocus::FocusWindowGroupL(TInt aWindowGroupId)
+	{
+	LeaveIfErr(iWsSession.SetWindowGroupOrdinalPosition(aWindowGroupId, 0), _L("Unable to set window group %d to ordinal position zero"), aWindowGroupId);
+	}
+
+void CCmdFocus::OptionsL(RCommandOptionList& aOptions)
+	{
+	_LIT(KOptWindowGroupId, "id");
+	aOptions.AppendIntL(iWindowGroupId, KOptWindowGroupId);
+	_LIT(KOptWindowGroupPattern, "match");
+	aOptions.AppendStringL(iWindowGroupPattern, KOptWindowGroupPattern);
+	_LIT(KOptFollow, "follow");
+	aOptions.AppendBoolL(iFollow, KOptFollow);
+	_LIT(KOptVerbose, "verbose");
+	aOptions.AppendBoolL(iVerbose, KOptVerbose);
+	}
+
+
+EXE_BOILER_PLATE(CCmdFocus)
+