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