--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commands/screenmode/screenmode.cpp Wed Jun 23 15:52:26 2010 +0100
@@ -0,0 +1,463 @@
+// screenmode.cpp
+//
+// Copyright (c) 2009 - 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 <fshell/common.mmh>
+
+#if defined (FSHELL_PLATFORM_S60) && FSHELL_PLATFORM_S60 >= 5
+#include "AknCapServerClient.h" //for screen orientation change
+#endif
+
+#include <W32STD.H>
+
+#include <fshell/ioutils.h>
+using namespace IoUtils;
+
+class CCmdScreenMode : public CCommandBase
+ {
+public:
+ void PrintTime(const TTime& aTime, TBool aNewline);
+ static const TDesC* EventCodeToString(TUint aEvent);
+ static const TDesC* DisplayModeToString(TDisplayMode aMode);
+ static const TDesC* RotationToString(CFbsBitGc::TGraphicsOrientation aRotation);
+ static const TDesC* EnforcementToString(TScreenModeEnforcement aEnforcement);
+ static CCommandBase* NewLC();
+ ~CCmdScreenMode();
+private:
+ CCmdScreenMode();
+ void PrintCurrentModeDetailL();
+ void DoListModeL();
+ void DoSetModeL();
+ void DoFollowL();
+ void DoRotateL();
+
+private: // From CCommandBase.
+ virtual const TDesC& Name() const;
+ virtual void DoRunL();
+ virtual void ArgumentsL(RCommandArgumentList& aArguments);
+ virtual void OptionsL(RCommandOptionList& aOptions);
+
+private:
+ RWsSession iWsSes;
+ CWsScreenDevice* iWsDev;
+
+ TBool iVerbose;
+ TInt iOptModeIndex; // Which mode to use.
+
+ enum TScreenModeCmd
+ {
+ ECmdListMode,
+ ECmdSetMode,
+ ECmdFollow,
+ ECmdRotate
+ };
+
+ TScreenModeCmd iCommand;
+ };
+
+CCommandBase* CCmdScreenMode::NewLC()
+ {
+ CCmdScreenMode* self = new(ELeave) CCmdScreenMode();
+ CleanupStack::PushL(self);
+ self->BaseConstructL();
+ return self;
+ }
+
+CCmdScreenMode::CCmdScreenMode()
+ {
+ }
+
+CCmdScreenMode::~CCmdScreenMode()
+ {
+ delete iWsDev;
+ iWsDev = NULL;
+ iWsSes.Close();
+ }
+
+const TDesC& CCmdScreenMode::Name() const
+ {
+ _LIT(KName, "screenmode");
+ return KName;
+ }
+
+void CCmdScreenMode::ArgumentsL(RCommandArgumentList& aArguments)
+ {
+ _LIT(KArgCommand, "command");
+ aArguments.AppendEnumL((TInt&)iCommand, KArgCommand);
+ }
+
+void CCmdScreenMode::OptionsL(RCommandOptionList& aOptions)
+ {
+ aOptions.AppendBoolL(iVerbose, _L("verbose"));
+ aOptions.AppendUintL((TUint&)iOptModeIndex, _L("mode"));
+ }
+
+void CCmdScreenMode::PrintCurrentModeDetailL()
+ {
+ TInt scrMode = iWsDev->CurrentScreenMode();
+ TPixelsTwipsAndRotation modeSizeAndRotation;
+ iWsDev->GetDefaultScreenSizeAndRotation(modeSizeAndRotation);
+ const TDesC* pRotationStr = RotationToString(modeSizeAndRotation.iRotation);
+
+ TPoint origin = iWsDev->GetDefaultScreenModeOrigin();
+ TSize scale = iWsDev->GetCurrentScreenModeScale();
+ TPoint scaledOrigin = iWsDev->GetCurrentScreenModeScaledOrigin();
+ TScreenModeEnforcement screenModeEnforcement = iWsDev->ScreenModeEnforcement();
+ const TDesC* pEnforcementStr = EnforcementToString(screenModeEnforcement);
+
+ Printf(_L("Current ScreenMode %d,%dx%d,Twips:%dx%d,%S\r\n"), scrMode,
+ modeSizeAndRotation.iPixelSize.iWidth, modeSizeAndRotation.iPixelSize.iHeight,
+ modeSizeAndRotation.iTwipsSize.iWidth , modeSizeAndRotation.iTwipsSize.iHeight,
+ pRotationStr);
+ Printf(_L("Origin:(%d,%d) Scale:%dx%d ScaledOrigin:(%d,%d) %S\r\n"),
+ origin.iX, origin.iX, scale.iWidth, scale.iHeight, scaledOrigin.iX, scaledOrigin.iY,
+ pEnforcementStr);
+ }
+
+//if VerboseLevel > 0, then print every message received
+//
+void CCmdScreenMode::DoFollowL()
+ {
+ const TUint KClientHandle = 0xC0C0C0C0;
+ TInt err;
+ //TInt verboseLevel = iVerbose.Count();
+
+ RWindowGroup wndGrp(iWsSes);
+ err = wndGrp.Construct(KClientHandle);
+ LeaveIfErr(err, _L("Could not construct window group"));
+
+ CleanupClosePushL(wndGrp);
+ err = wndGrp.EnableScreenChangeEvents();
+ LeaveIfErr(err, _L("Could not enable screen change events"));
+
+ Printf(_L("Tracking screen change events... press 'q' to quit\r\n"));
+
+ TWsEvent event;
+ TInt eventType;
+ TUint eventHandle;
+ TTime eventTime;
+ TRequestStatus status;
+
+ RIoConsoleReadHandle& keyIn = Stdin();
+ TRequestStatus statusKey;
+ keyIn.WaitForKey(statusKey);
+
+ for(;;)
+ {
+ iWsSes.EventReady(&status);
+WaitAgain:
+ User::WaitForRequest(status, statusKey);
+
+ if (status.Int()==KRequestPending)
+ {
+ err = statusKey.Int();
+ ASSERT(err == KErrNone);
+ //it must be user press a key, so check if that key is 'q'
+ TUint pressedKey = keyIn.KeyCode();
+ if (pressedKey=='q' || pressedKey=='Q')
+ break;
+ else
+ {
+ keyIn.WaitForKey(statusKey);
+ goto WaitAgain;
+ }
+ }
+
+ iWsSes.GetEvent(event);
+
+ eventType = event.Type();
+ eventHandle = event.Handle();
+ eventTime = event.Time();
+
+ /*
+ if (verboseLevel > 0)
+ {
+ const TDesC* eventCodeStr = EventCodeToString(eventType);
+ Printf(_L(" Event:%d(%S) Handle:0x%08x Time:"), eventType, eventCodeStr,
+ eventHandle);
+ PrintTime(eventTime, ETrue);
+ }
+ */
+
+ if (eventType == EEventScreenDeviceChanged && eventHandle==KClientHandle)
+ {
+ // Get the new screen mode and size
+ TInt newMode = iWsDev->CurrentScreenMode();
+ TPixelsTwipsAndRotation modeSizeAndRotation;
+ iWsDev->GetScreenModeSizeAndRotation(newMode, modeSizeAndRotation);
+
+ Printf(_L("\r\n"));
+ Printf(_L("Screen Device Changed, EventTime:"));
+ PrintTime(eventTime, ETrue);
+ PrintCurrentModeDetailL();
+ }
+ }
+
+ wndGrp.DisableScreenChangeEvents();
+ CleanupStack::PopAndDestroy(&wndGrp);
+ }
+
+//S60 proprietary: toggle screen oritation by calling CAknCapServer::RotateScreenL
+//
+void CCmdScreenMode::DoRotateL()
+ {
+#if defined (FSHELL_PLATFORM_S60) && FSHELL_PLATFORM_S60 >= 5
+ TInt err;
+ RAknUiServer akSrv;
+ err = akSrv.Connect();
+ LeaveIfErr(err, _L("Could not connect to AknCapServer"));
+
+ CleanupClosePushL(akSrv);
+
+ if (iVerbose)
+ {
+ Printf(_L("Calling RAknUiServer::RotateScreen() / CAknCapServer::RotateScreenL...\r\n"));
+ }
+ err = akSrv.RotateScreen();
+ LeaveIfErr(err, _L("RotateScreen() failed"));
+
+ CleanupStack::PopAndDestroy(&akSrv);
+ if (iVerbose)
+ {
+ PrintCurrentModeDetailL();
+ }
+#else
+ LeaveIfErr(KErrNotSupported, _L("Rotate not supported on this platform."));
+#endif
+ }
+
+void CCmdScreenMode::DoSetModeL()
+ {
+ TInt numScreenModes = iWsDev->NumScreenModes();
+ if ( (iOptModeIndex >= numScreenModes) || iOptModeIndex<0)
+ {
+ LeaveIfErr(KErrArgument, _L("Invalid screenmode index:%d"), iOptModeIndex);
+ }
+
+ if (iVerbose)
+ {
+ Printf(_L("Calling CWsScreenDevice::SetScreenMode(%d)\r\n"), iOptModeIndex);
+ }
+ iWsDev->SetScreenMode(iOptModeIndex);
+
+ //verify the result by query current screen mode
+ if (iVerbose)
+ {
+ PrintCurrentModeDetailL();
+ }
+ }
+
+void CCmdScreenMode::DoListModeL()
+ {
+ //for platform defined with SYMBIAN_WSERV_AND_CONE_MULTIPLE_SCREENS
+ //it would be possible to query how many screens on this device
+ //but S60 5.0 doesn't define this
+ //TInt Screens = iWsSes.NumberOfScreens();
+ TInt curScreenNum = iWsDev->GetScreenNumber();
+ TInt numScreenModes = iWsDev->NumScreenModes();
+ Printf(_L("Current Screen number:%d Screen Modes:%d \r\n"), curScreenNum, numScreenModes);
+
+ for (TInt i=0; i<numScreenModes; i++)
+ {
+ Printf(_L("-------------------------------------------\r\n"));
+ TDisplayMode dMode = iWsDev->GetScreenModeDisplayMode(i);
+ const TDesC* pModeString = DisplayModeToString(dMode);
+ TSize modeScale = iWsDev->GetScreenModeScale(i);
+ TPoint modeOrigin = iWsDev->GetScreenModeOrigin(i);
+ TPoint scaledOrigin = iWsDev->GetScreenModeScaledOrigin(i);
+
+ TPixelsTwipsAndRotation modeSizeAndRotation;
+ iWsDev->GetScreenModeSizeAndRotation(i, modeSizeAndRotation);
+ const TDesC* pRotationStr = RotationToString(modeSizeAndRotation.iRotation);
+
+ Printf(_L("Mode:%d DisplayMode:%S Scale(WxH):%dx%d Origin:(%d,%d) ScaledOrigin:(%d,%d)\r\n"),
+ i, pModeString,
+ modeScale.iWidth, modeScale.iHeight,
+ modeOrigin.iX, modeOrigin.iY, scaledOrigin.iX, scaledOrigin.iY);
+
+ Printf(_L("Size(WxH) Pixels:%dx%d, Twips:%dx%d %S\r\n"),
+ modeSizeAndRotation.iPixelSize.iWidth, modeSizeAndRotation.iPixelSize.iHeight,
+ modeSizeAndRotation.iTwipsSize.iWidth, modeSizeAndRotation.iTwipsSize.iHeight,
+ pRotationStr);
+ }
+
+ //current screen mode
+ Printf(_L("===========================================\r\n"));
+ PrintCurrentModeDetailL();
+ }
+
+void CCmdScreenMode::DoRunL()
+ {
+ TInt err;
+ err = iWsSes.Connect();
+ LeaveIfErr(err, _L("Could not connect to the window server"));
+
+ iWsDev = new (ELeave) CWsScreenDevice(iWsSes);
+ err = iWsDev->Construct();
+ LeaveIfErr(err, _L("Could not construct CWsScreenDevice"));
+
+ switch(iCommand)
+ {
+ case ECmdListMode:
+ DoListModeL();
+ break;
+ case ECmdSetMode:
+ DoSetModeL();
+ break;
+ case ECmdFollow:
+ DoFollowL();
+ break;
+ case ECmdRotate:
+ DoRotateL();
+ break;
+ }
+
+ }
+
+EXE_BOILER_PLATE(CCmdScreenMode)
+
+#define CASE_MODELIT(x) case x: { _LIT(KName, #x); pString = &KName; break; }
+
+const TDesC* CCmdScreenMode::DisplayModeToString(TDisplayMode aMode)
+ {
+ enum { EColor16MAP = EColor16MA+1 }; // Not defined in 9.1
+ const TDesC* pString = NULL;
+ switch(aMode)
+ {
+ CASE_MODELIT(ENone);
+ CASE_MODELIT(EGray2);
+ CASE_MODELIT(EGray4);
+ CASE_MODELIT(EGray16);
+ CASE_MODELIT(EGray256);
+ CASE_MODELIT(EColor16);
+ CASE_MODELIT(EColor256);
+ CASE_MODELIT(EColor64K);
+ CASE_MODELIT(EColor16M);
+ CASE_MODELIT(ERgb);
+ CASE_MODELIT(EColor4K);
+ CASE_MODELIT(EColor16MU);
+ CASE_MODELIT(EColor16MA);
+ CASE_MODELIT(EColor16MAP);
+ default:
+ _LIT(KUnknowStr, "Unknown");
+ pString = &KUnknowStr;
+ }
+ return pString;
+ }
+
+const TDesC* CCmdScreenMode::EnforcementToString(TScreenModeEnforcement aEnforcement)
+ {
+ const TDesC* pString = NULL;
+ switch(aEnforcement)
+ {
+ CASE_MODELIT(ESizeEnforcementNone);
+ CASE_MODELIT(ESizeEnforcementPixelsAndRotation);
+ CASE_MODELIT(ESizeEnforcementPixelsTwipsAndRotation);
+ default:
+ _LIT(KUnknowStr, "Unknown");
+ pString = &KUnknowStr;
+ }
+ return pString;
+ }
+
+const TDesC* CCmdScreenMode::EventCodeToString(TUint aEvent)
+ {
+ const TDesC* pString = NULL;
+ switch(aEvent)
+ {
+ CASE_MODELIT(EEventNull);
+ CASE_MODELIT(EEventKey);
+ CASE_MODELIT(EEventKeyUp);
+ CASE_MODELIT(EEventKeyDown);
+ CASE_MODELIT(EEventModifiersChanged);
+ CASE_MODELIT(EEventPointer);
+ CASE_MODELIT(EEventPointerEnter);
+ CASE_MODELIT(EEventPointerExit);
+ CASE_MODELIT(EEventPointerBufferReady);
+ CASE_MODELIT(EEventDragDrop);
+ CASE_MODELIT(EEventFocusLost);
+ CASE_MODELIT(EEventFocusGained);
+ CASE_MODELIT(EEventSwitchOn);
+ CASE_MODELIT(EEventPassword);
+ CASE_MODELIT(EEventWindowGroupsChanged);
+ CASE_MODELIT(EEventErrorMessage);
+ CASE_MODELIT(EEventMessageReady);
+ CASE_MODELIT(EEventMarkInvalid);
+ CASE_MODELIT(EEventSwitchOff);
+ CASE_MODELIT(EEventKeySwitchOff);
+ CASE_MODELIT(EEventScreenDeviceChanged);
+ CASE_MODELIT(EEventFocusGroupChanged);
+ CASE_MODELIT(EEventCaseOpened);
+ CASE_MODELIT(EEventCaseClosed);
+ CASE_MODELIT(EEventWindowGroupListChanged);
+ CASE_MODELIT(EEventWindowVisibilityChanged);
+#ifdef SYMBIAN_PROCESS_MONITORING_AND_STARTUP
+ CASE_MODELIT(EEventRestartSystem);
+#endif
+ CASE_MODELIT(EEventKeyRepeat);
+
+ //the following 3 are not defined in S60 3.2
+#if defined (FSHELL_PLATFORM_S60) && FSHELL_PLATFORM_S60 >= 5
+ CASE_MODELIT(EEventGroupWindowOpen);
+ CASE_MODELIT(EEventGroupWindowClose);
+ CASE_MODELIT(EEventWindowClose);
+#endif
+
+ CASE_MODELIT(EEventDirectScreenAccessBegin);
+ CASE_MODELIT(EEventDirectScreenAccessEnd);
+ CASE_MODELIT(EEventHeartbeatTimerStateChange);
+ CASE_MODELIT(EEventPowerMgmt);
+ CASE_MODELIT(EEventReserved);
+ CASE_MODELIT(EEventUser);
+ default:
+ _LIT(KUnknowStr, "Unknown");
+ pString = &KUnknowStr;
+ }
+ return pString;
+ }
+
+#define CASE_ROTLIT(x) case CFbsBitGc::x: { _LIT(KName, #x); pString = &KName; break; }
+
+const TDesC* CCmdScreenMode::RotationToString(CFbsBitGc::TGraphicsOrientation aRotation)
+ {
+ const TDesC* pString = NULL;
+ switch(aRotation)
+ {
+ CASE_ROTLIT(EGraphicsOrientationNormal);
+ CASE_ROTLIT(EGraphicsOrientationRotated90);
+ CASE_ROTLIT(EGraphicsOrientationRotated180);
+ CASE_ROTLIT(EGraphicsOrientationRotated270);
+ default:
+ _LIT(KUnknowStr, "Unknown");
+ pString = &KUnknowStr;
+ }
+ return pString;
+ }
+
+void CCmdScreenMode::PrintTime(const TTime& aTime, TBool aNewline)
+ {
+ TTime NullTime = Time::NullTTime();
+ if (aTime == NullTime)
+ {
+ Printf(_L("(NullTime)"));
+ }
+ else
+ {
+ _LIT8(KDateTimeFormat, "%d-%02d-%02d %02d:%02d:%02d");
+ TDateTime dt = aTime.DateTime();
+ Printf(KDateTimeFormat, dt.Year(), dt.Month()+1, dt.Day()+1, dt.Hour(), dt.Minute(), dt.Second());
+ }
+
+ if (aNewline)
+ {
+ Printf(_L("\r\n"));
+ }
+ }