--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tactilefeedback/tactilefeedbackclient/inc/touchfeedbackimpl.h Thu Dec 17 08:53:38 2009 +0200
@@ -0,0 +1,514 @@
+/*
+* Copyright (c) 2007 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: This class implements Tactile Feedback Client API
+* Part of: Tactile Feedback.
+*
+*/
+
+
+
+#ifndef C_TOUCHFEEDBACKIMPL_H
+#define C_TOUCHFEEDBACKIMPL_H
+
+#include <e32std.h>
+#include <e32base.h>
+#include <coemain.h>
+
+#include "touchlogicalfeedback.h"
+#include "touchfeedback.h"
+
+
+class CTouchFeedbackRegistry;
+class CTouchFeedbackClient;
+
+
+/**
+ * This structure stores one index / area id pair.
+ * This kind of entries are stored for each control, which have
+ * feedback areas defined.
+ */
+struct TAreaIndexEntry
+ {
+ TUint32 iIndex;
+ TInt iAreaId;
+ };
+
+/**
+ * This structure stores one control's information on client-side.
+ * This information includes control's visibility, dimming and feedback
+ * disabled information, as well as array of the feedback area
+ * identifiers.
+ *
+ * Notice that the client handle is stored for two reasons: Firstly
+ * it is an optimization to store it as this way we can avoid unnecessary
+ * client-server transaction (window server client-side API does not
+ * cache the handle). Secondly some times control's window may have been
+ * deleted before control removes it's feedback areas. In these situations
+ * we even wouldn't be able to use the control for getting the handle
+ * anymore.
+ */
+struct TControlCacheEntry
+ {
+ const CCoeControl* iControl;
+ TUint32 iClientHandle;
+ TBool iVibraDisabled;
+ TBool iAudioDisabled;
+ TBool iVisible;
+ TBool iDimmed;
+ RArray<TAreaIndexEntry> iAreaArray;
+ };
+
+/**
+ * This class implements the Client API that is provided for UI Controls
+ * and applications.
+ *
+ * The implemented interface is defined by MTouchFeedback -class.
+ *
+ * This class' main task is to have a bookkeeping of all the controls
+ * that have feedback areas defined. Services such as automatic disabling
+ * of the feedback areas of dimmed or invisible controls are implemented
+ * here.
+ *
+ * @lib touchfeedback.lib
+ * @since S60 v5.0
+ */
+NONSHARABLE_CLASS( CTouchFeedbackImpl ):
+ public CBase,
+ public MTouchFeedback
+ {
+public:
+ /**
+ * Instantiation method.
+ *
+ * @since S60 5.0
+ * @return New CTouchFeedbackImpl instance.
+ */
+ static CTouchFeedbackImpl* New();
+
+ /**
+ * Destructor.
+ * @since S60 5.0
+ */
+ virtual ~CTouchFeedbackImpl();
+
+ /**
+ * @see MTouchFeedback.
+ */
+ TBool TouchFeedbackSupported();
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void SetFeedbackEnabledForThisApp( TBool aEnabled );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ TBool FeedbackEnabledForThisApp();
+
+ /**
+ * @see MTouchFeedback.
+ */
+ TInt SetFeedbackArea( const CCoeControl* aControl,
+ TUint32 aIndex,
+ TRect aRect,
+ TTouchLogicalFeedback aFeedbackType,
+ TTouchEventType aEventType );
+
+
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void RemoveFeedbackArea( const CCoeControl* aControl, TUint32 aIndex );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void RemoveFeedbackForControl( const CCoeControl* aControl );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void ChangeFeedbackArea( const CCoeControl* aControl,
+ TUint32 aIndex,
+ TRect aNewRect );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void ChangeFeedbackType( const CCoeControl* aControl,
+ TUint32 aIndex,
+ TTouchLogicalFeedback aNewType );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void MoveFeedbackAreaToFirstPriority( const CCoeControl* aControl,
+ TUint32 aIndex );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void FlushRegistryUpdates( );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void InstantFeedback( TTouchLogicalFeedback aType );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void InstantFeedback( const CCoeControl* aControl,
+ TTouchLogicalFeedback aType );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ TBool ControlHasFeedback( const CCoeControl* aControl );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ TBool ControlHasFeedback( const CCoeControl* aControl, TUint32 aIndex );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void EnableFeedbackForControl(
+ const CCoeControl* aControl, TBool aEnable );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void EnableFeedbackForControl( const CCoeControl* aControl,
+ TBool aEnableVibra,
+ TBool aEnableAudio );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ virtual void SetFeedbackEnabledForThisApp( TBool aVibraEnabled,
+ TBool aAudioEnabled );
+
+public:
+ /**
+ * This function provides a way for getting the registry content.
+ *
+ * Used by CTouchFeedbackClient for listing all the registry
+ * areas, so that they can be put to shared memory.
+ *
+ * @since S60 5.0
+ */
+ RPointerArray<CTouchFeedbackRegistry>* RegistryArray();
+
+ /**
+ * This function can be used for getting the number of areas in the
+ * registry.
+ *
+ * @since S60 5.0
+ * @param aAreaCount - The total number of areas in the registry.
+ * @param aWindowCount - Number of different windows is returned here.
+ */
+ void GetAreaCount( TInt& aAreaCount, TInt& aWindowCount );
+
+ /**
+ * This should be called for informing
+ * that given control's state (i.e. visiblity or dimming status)
+ * has been changed. This way Tactile FW knows to disable or enable
+ * the feedback for that control again.
+ *
+ * @since S60 5.0
+ * @param aControl - Pointer to the control, which visiblity
+ * or dimming status has changed.
+ */
+ void ControlVisibilityChanged( const CCoeControl* aControl );
+
+ /**
+ * This should be called when the layout is changed.
+ *
+ * @since S60 5.0
+ * The motivation is to disable this application's feedback areas
+ * for this application in case pen usage is not supported in current
+ * layout.
+ */
+ void LayoutChanged();
+
+public: // new API functions since 5.2, defined in MTouchFeedback
+ /**
+ * @see MTouchFeedback.
+ */
+ TBool FeedbackEnabledForThisApp( TTouchFeedbackType aFeedbackType );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void StartFeedback( const CCoeControl* aControl,
+ TTouchContinuousFeedback aType,
+ const TPointerEvent* aPointerEvent,
+ TInt aIntensity,
+ TTimeIntervalMicroSeconds32 aTimeout );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void ModifyFeedback( const CCoeControl* aControl,
+ TInt aIntensity );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void StopFeedback( const CCoeControl* aControl );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ TInt SetFeedbackEnabledForDevice( TTouchFeedbackType aFeedbackType );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ TTouchFeedbackType FeedbackEnabledForDevice();
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void InstantFeedback( const CCoeControl* aControl,
+ TTouchLogicalFeedback aType,
+ const TPointerEvent& aPointerEvent );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ TInt SetFeedbackArea( const CCoeControl* aControl,
+ TUint32 aIndex,
+ TRect aRect,
+ CFeedbackSpec* aFeedbackSpec );
+
+ /**
+ * @see MTouchFeedback.
+ */
+ void InstantFeedback( const CCoeControl* aControl,
+ TTouchLogicalFeedback aType,
+ TTouchFeedbackType aFeedbackType,
+ const TPointerEvent& aPointerEvent );
+
+private:
+ /**
+ * Constructor.
+ */
+ CTouchFeedbackImpl();
+
+ /**
+ * 2nd phase constructor.
+ */
+ void ConstructL();
+
+ /**
+ * Actual functionality of setting a feedback area.
+ *
+ * The API function SetFeedbackArea does the basic parameter checks and
+ * runs this function under trap harness so that we can leave here.
+ *
+ * @see MTouchFeedback.
+ */
+ void DoSetFeedbackAreaL( const CCoeControl* aControl,
+ TUint32 aIndex,
+ TRect aRect,
+ CFeedbackSpec* aSpec,
+ TUint32 aClientHandle );
+
+
+ /**
+ * Finds window from the registry if it exists.
+ *
+ * Returns an index to iResolverArray, or KErrNotFound if
+ * there is no entry for the window yet.
+ *
+ * @since S60 5.0
+ * @param aWindowHandle - The window id to find from the array
+ * @return KErrNotFound if an area with given ID is not found from the registry.
+ */
+ TInt FindWindowFromRegistry( TUint aWindowHandle );
+
+ /**
+ * Generates a unique identifier inside this application process.
+ *
+ * This is the id that is used to distinguish the area registry
+ * entries from each other.
+ *
+ * @since S60 5.0
+ * @return Unique identifier.
+ */
+ TUint GenerateUniqueIdL();
+
+ /**
+ * Can be used to check whether feedback area with given id exists or not.
+ *
+ * This is as helper function when generating unique identifiers for
+ * new feedback areas.
+ *
+ * @since S60 5.0
+ * @return ETrue if feedback area with given identifier exists already.
+ * EFalse otherwise.
+ */
+ TBool FeedbackAreaExists( TUint aAreaId );
+
+ /**
+ * Returns the client handle of the window, where given control
+ * is located. Client handle is either directly casted from first
+ * window-owning control's address, or then asked from window
+ * server.
+ *
+ * @since S60 5.0
+ * @param aControl - Pointer to the control.
+ * @return Client handle of the window where given control is.
+ */
+ TUint32 ClientHandle( const CCoeControl* aControl );
+
+ /**
+ * Finds given control from the cache.
+ *
+ * @since S60 5.0
+ * @param aControl - Pointer to the control, which is searched
+ * @return The position in cache array, where searhed entry is found,
+ * or KErrNotFound if it is not found.
+ */
+ TInt FindControlFromCache( const CCoeControl* aControl );
+
+
+ /**
+ * Finds specific feedback area from control cache.
+ *
+ * @since S60 5.0
+ * @param aControl - Pointer to the control.
+ * @param aIndex - Area index (given by client)
+ * @param aCacheIndex - If control is found, then index to control cache is
+ * returned here.
+ * @param aAreaIndex - If area is found, then index to area array in
+ * corresponding control cache entry is returned
+ * here.
+ */
+ void FindAreaFromCache( const CCoeControl* aControl,
+ TUint32 aIndex,
+ TInt& aCacheIndex,
+ TInt& aAreaIndex );
+
+
+ /**
+ * Removes control with given index number from the control cache.
+ *
+ * @since S60 5.0
+ * @param aControlIndex - Index number of the control in the control
+ * array.
+ */
+ void RemoveControlFromCache( TInt aControlIndex );
+
+ /**
+ * Can be used for querying, whether control's areas should be active
+ * according to it's recorced dimming-, visibility-, and feedback
+ * disabling status.
+ *
+ * @since S60 5.0
+ * @param aControlIndex - Index number of the control in the control
+ * array.
+ * @return ETrue if control's areas should be active, EFalse otherwise.
+ */
+ TBool ControlsAreasActive( TInt aControlIndex );
+
+ /**
+ * Can be used for disabling or enabling control's feedback areas
+ * in the registry.
+ *
+ * This function only modifies the registry, and not the control cache.
+ *
+ * @since S60 5.0
+ * @param aControlIndex - Index number of the control in the control
+ * array.
+ * @param aEnableVibra - New disable / enable status for vibra
+ * @param aEnableAudio - New disable / enable status for audio
+ * @param aVisible - Visibility status of the control. If
+ * control is invisible, it's feedback areas
+ * will be temporarily removed from the
+ * registry.
+ */
+ void DoEnableControlsAreasInRegistry(
+ TInt aControlIndex,
+ TBool aEnableVibra,
+ TBool aEnableAudio,
+ TBool aVisible );
+
+private: // data
+
+ /**
+ * Array of area registries. There is one entry for each window.
+ * Own.
+ */
+ RPointerArray<CTouchFeedbackRegistry> iRegistryArray;
+
+ /**
+ * The id what was given to the area that was last added to the array.
+ */
+ TUint iCurrentId;
+
+ /**
+ * We maintain a bookkeeping to know in case the currently used
+ * feedback area id has already reached its maximum value at
+ * least once. This way we save some time for e.g. during boot-up
+ * when plenty of areas are added to the registry.
+ */
+ TBool iCurrentIdCounterRotated;
+
+ /**
+ * Pointer to client, used to inform it about registry changes.
+ * Own.
+ */
+ CTouchFeedbackClient* iClient;
+
+ /**
+ * Array of controls and their feedback area ids. This way users of the
+ * API don't have to store the ids themselves.
+ */
+ RArray<TControlCacheEntry> iControlCache;
+
+ /**
+ * Used to store the status of audio feedback for this application.
+ */
+ TBool iAudioEnabledForThisApp;
+
+ /**
+ * Used to store the status of vibra feedback for this application.
+ */
+ TBool iVibraEnabledForThisApp;
+
+ /**
+ * For bookkeeping about feedback areas. We need this information for
+ * recognizing the situation when we cannot add another area to the
+ * registry anymore (for e.g. due to Id generation problem).
+ */
+ TInt iNbOfFeedbackAreas;
+
+ /**
+ * For bookkeeping wheater pen is enabled in current layout or not. This
+ * way we can optimize layout change handling so that we only react
+ * to changes from non-pen enabled to pen enabled layout and vice versa,
+ * but do nothing when layout changes without effect to pen support.
+ */
+ TBool iPenEnabled;
+ };
+
+
+
+#endif // C_TOUCHFEEDBACKIMPL_H