diff -r 666f914201fb -r 2fe1408b6811 epoc32/include/w32adll.h --- a/epoc32/include/w32adll.h Tue Nov 24 13:55:44 2009 +0000 +++ b/epoc32/include/w32adll.h Tue Mar 16 16:12:26 2010 +0000 @@ -1,1 +1,1086 @@ -w32adll.h +// 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 the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members +// which accompanies this distribution, and is available +// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Header for writing animated DLL add ons +// +// + +#if !defined(__W32ADLL_H__) +#define __W32ADLL_H__ + +#if !defined(__W32STD_H__) +#include +#endif + +#if !defined(__BITSTD_H__) +#include +#endif + +/** +@publishedAll +@deprecated +*/ +const TUint KWservAnimDllUidValue8=268435858; + +/** +@publishedAll +@deprecated +*/ +const TUid KWservAnimDllUid8={KWservAnimDllUidValue8}; + +/** +@publishedAll +@released +*/ +const TUint KWservAnimDllUidValue16=268450594; + +/** +@publishedAll +@released +*/ +const TUid KWservAnimDllUid16={KWservAnimDllUidValue16}; + +/** +@publishedAll +@released +*/ +const TUint KWservAnimDllUidValue=KWservAnimDllUidValue16; + +/** +@publishedAll +@released +*/ +const TUid KWservAnimDllUid={KWservAnimDllUidValue}; + +// +// Contains functions callable from animated DLLs +// + + +class TWindowInfo +/** Animation window information. + +Stores the window position and display mode for the animation. +During a redraw of the animation window, the redraw regions +can be retrieved by calling GetRedrawRegionAndRedrawShadowRegion(). + +@publishedAll +@released +@see TWindowInfo::GetRedrawRegionAndRedrawShadowRegion() */ + { +public: + /** The screen position. */ + TRect iScreenPos; + /** The display mode. + + This is the minimum display mode that the screen has to be in to display this window. */ + TDisplayMode iMode; +public: + /** Constructs an animation window information object. */ + inline TWindowInfo() : iRegionPair(NULL) {} +public: + /** Stores a pair of region pointers. */ + struct TRegionPair + { + const TRegion* iRegion1; + const TRegion* iRegion2; + }; + /** Returns the current redraw region and redraw shadow region. + This function must only be called from an override of CWindowAnim's pure virtual Redraw function. + The region pointers retrieved must not be used beyond the end of the Redraw override. + @param aRedrawRegion The redraw region in screen coordinates. + @param aRedrawShadowRegion The redraw shadow region in screen coordinates. */ + inline void GetRedrawRegionAndRedrawShadowRegion(const TRegion*& aRedrawRegion, const TRegion*& aRedrawShadowRegion) const + { + if (iRegionPair) + { + aRedrawRegion=iRegionPair->iRegion1; + aRedrawShadowRegion=iRegionPair->iRegion2; + iRegionPair=NULL; + } + else + { + aRedrawRegion=NULL; + aRedrawShadowRegion=NULL; + } + } +private: + mutable const TRegionPair* iRegionPair; + TAny *iFree2; + friend class CWsAnim; + }; + + +class MEventHandler +/** Event handler interface. + +The interface provides a function to handle raw events, e.g. key presses, +pen events, power buttons etc. Raw events are passed to the OfferRawEvent() +function when the MAnimGeneralFunctions::GetRawEvents() function has been +called. + +@publishedAll +@released */ + { +public: + /** Handles raw events. + + If the incoming event can be handled, the function should + process it and then return true. If it cannot be processed the function should + return false, and the event will be passed to other event handling code. + + This function must be implemented in every animation DLL. If event + handling is not required, the function should simply return false. + + @param aRawEvent The raw event to be processed + @return ETrue if the raw event is handled by this function, EFalse if the function + chooses not to process it. */ + virtual TBool OfferRawEvent(const TRawEvent &aRawEvent)=0; + }; + +enum TAnimNotifications +/** Bit flags to be used by anims when registering for notifications */ + { + /** Notify when direct screen access begins or ends.*/ + EDirectScreenAccess = 0x0001, + /** Notify when the wserv heartbeat timer starts or stops. */ + EHeartbeatTimer = 0x0002, + /** Notify when screen device changes.*/ + EScreenDeviceChange = 0x0004 + }; +//Forward Declaration. +class MAnimGeneralFunctionsWindowExtension; +class MAnimGeneralFunctionsEventExtension ; + +class MAnimGeneralFunctions +/** General animation utility functions interface. + +The interface provides functions to set the animation timing, +event functions, and other general functions. + +You do not have to create an object of this type. The class is implemented +by the window server and provides utility functions to all CAnim-derived +classes via the CAnim::iFunctions pointer. + +It is not intended for user derivation. + +@publishedAll +@released */ + { +public: + /** Animation synchronisation flags. + + The animation can be synchronised to any of these values; + the Animate() call will take place at the start of the new unit (day, hour, etc...). */ + enum TAnimSync + { + /** Not synchronised. Animate() is called after some number of flash cycles - + set by SetSync(). */ + ESyncNone, + /** Animate() every flash tick. This occurs twice a second, on the second and after + 7/12ths of a second, e.g. the function is called in a flash-on (7/12 seconds) - + flash-off (5/12 seconds) cycle. */ + ESyncFlash, + /** Animate() called as soon after every second as system activity allows. */ + ESyncSecond, + /** Animate() called as soon after every minute as system activity allows. */ + ESyncMinute, + /** Animate() called as soon after midnight every day as system activity allows. */ + ESyncDay, + }; + enum + { + ENumberOfExtendedInterfaces=0, + EWindowExtensionInterface, + EEventExtentionInterface, + EInterfaceCount, // Always keep at the end. + }; + //Timing functions + /** Calls the DLL's Animate() function then deactivates the graphics context. + + This allows users to do drawing from their own active object. + + Note: + + If the user calls the CAnim-derived classes' Animate() function directly, + or otherwise does drawing from their own active object, then this will not + deactivate the graphics context. This causes the window server to panic the + client. + + Alternatively, use CFreeTimerWindowAnim, which allows you to deactivate the + graphics context yourself. + + @param aDateTime The parameter passed into the animation DLL's Animate() + function. */ + virtual void Animate(TDateTime *aDateTime)=0; + /** Sets the synchronisation mode. + + This determines the time intervals between calls to the Animate() function. + + @param aSyncMode The synchronisation mode. */ + virtual void SetSync(TAnimSync aSyncMode)=0; + /** Sets the repeat interval. + + If the synchronisation mode is TAnimSync::ESyncNone, then the Animate() function + is called at intervals defined by some number of flash ticks. There are two + flash ticks a second, with a 7/12 second - 5/12 second cycle. If the function + is called when the synchronisation mode is not TAnimSync::ESyncNone, then + the window server panics the client. + + If the new interval is greater than the current countdown, then the call does + not affect the current countdown. For example, if the countdown has 10 flash + ticks remaining, and the interval is set to 20, the new interval does not + apply until the current countdown is complete. + + However if the new interval is less the current countdown, then the new interval + applies immediately i.e. the countdown is reset to the interval value. + + If the interval is set to zero the countdown stops, and the Animate() function + is no longer called. + + @param aInterval The number of flash ticks between calls to the Animate() + function. */ + virtual void SetInterval(TInt aInterval)=0; + /** Sets the next interval. + + This function immediately resets the current countdown to the specified number + of flash ticks, irrespective of its current value. After the countdown expires, + the interval returns to its usual rate. Note that this may be zero (i.e. + not at all). + + To call this function, the synchronisation mode must be TAnimSync::ESyncNone, + otherwise the window server panics the client. + + Note: there are two flash ticks a second, with a 7/12 second - 5/12 second cycle. + + @param aInterval The interval to the next Animate(). If the value is less + than 1, it automatically gets set to 1. + @see SetInterval() */ + virtual void SetNextInterval(TInt aInterval)=0; + /** Gets the system time as it was when Animate() was last called. + + @return The system time when Animate() was last called. */ + virtual TDateTime SystemTime() const=0; + /** Tests the flash cycle state. + + The flash cycle has 2 states: on (7/12 second) or off (5/12 second). + + @return ETrue if in the on part of the flash cycle, otherwise EFalse. */ + virtual TBool FlashStateOn() const=0; + /** Gets the current synchronisation mode. + + @return The current sync mode. */ + virtual TAnimSync Sync() const=0; + //Other functions generally useful + /** Gets a pointer to the screen device. + + For example, this might be used to gain access to twips to pixel conversion functions. + + @return A pointer to the screen device. */ + virtual const CFbsScreenDevice *ScreenDevice()=0; + /** Creates and duplicates a bitmap from a handle. + + This function might be used to duplicate client side bitmaps on the server side. + + @param aHandle A handle to the bitmap to be duplicated. + @return A pointer to the duplicate bitmap. */ + virtual CFbsBitmap *DuplicateBitmapL(TInt aHandle)=0; + /** Creates and duplicates a font from a handle. + + This function might be used to duplicate client side fonts on the server side. + + @param aHandle A handle to the font to be duplicated. + @return A pointer to the duplicate font. */ + virtual CFbsFont *DuplicateFontL(TInt aHandle)=0; + /** Closes a duplicate font. + + @param Pointer to the duplicate font. + @see DuplicateFontL() */ + virtual void CloseFont(CFbsFont *)=0; + /** Gets a reference to the calling client's thread. + + @return A reference to the calling client's thread. */ + virtual const RThread &Client()=0; + virtual void ReplyBuf(const TDesC8 &aDes)=0; // Reply a buffer to the client + virtual void ReplyBuf(const TDesC16 &aDes)=0; // Reply a buffer to the client + /** Panics the client. + + This will result in the client thread being destroyed. */ + virtual void Panic() const=0; + //Event functions + /** Switches animation raw event handling on and off. + + If raw event handling is switched on, then raw events, e.g. pointer, key, or power events + are all offered to the animation event handling code's MEventHandler::OfferRawEvent(). + + @param aGetEvents If ETrue, raw events are passed to the animation + event handling code. If EFalse, events are not passed to the animation. */ + virtual void GetRawEvents(TBool aGetEvents) const=0; + /** Posts a raw event, just as if it had come from the kernel. + + @param aRawEvent The raw event */ + virtual void PostRawEvent(const TRawEvent &aRawEvent) const=0; + /** Posts a key event. + + The function is similar to PostRawEvent() but should be + used for posting key events. + + @param aRawEvent The key event. */ + virtual void PostKeyEvent(const TKeyEvent &aRawEvent) const=0; + /** Get the address of an object which can retrieve information from and send + information to the client-side. + + @return A pointer to RMessagePtr2. Complete must be called on the returned object (or a + copy of it) if and only if Message is called from an override of CAnim's CommandReplyL which + has been caused by a client-side RAnim::AsyncCommandReply call. If Message is called outside + an override of CAnim's CommandReplyL or outside an override of CWindowAnim's ConstructL or + CSpriteAnim's ConstructL, the it returns NULL. + @see RMessagePtr2 */ + virtual const RMessagePtr2* Message()=0; // replaces Reserved1 + /**Returns an extension interface, maybe extended further in the future. + @param aInterfaceId The ID of the interface to return. + @return A pointer to the extension interface. + When aInterface=0 (ENumberOfExtendedInterfaces), the number of interfaces is returned (currently 2). + When aInterface=1 (EWindowExtensionInterface), a pointer to the Window Extension interface is returned. + When aInterface=2 (EEventExtentionInterface), a pointer to the Event Extension interface is returned. + */ + virtual TAny* ExtendedInterface(TInt aInterface)=0; // replaces Reserved2 + + /** Register to receive notifications. + @param aNotifications A bitset of TAnimNotifications values indicating which notifications are required + @return One of the system wide error codes + */ + virtual TInt RegisterForNotifications(TUint32 aNotifications)=0; + /* + Return number of ExtendedInterfaces. */ + inline TInt NumberOfExtendedInterfaces() + { + return reinterpret_cast(ExtendedInterface(ENumberOfExtendedInterfaces)); + } + /** Gets access to Window Extension utility functions. + @return A pointer to a class containing functions for working with Window. */ + inline MAnimGeneralFunctionsWindowExtension* WindowExtension() + { + return static_cast(ExtendedInterface(EWindowExtensionInterface)); + } + /** Gets access to EventExtension utility functions. + @return A pointer to a class containing functions for working with Event. */ + inline MAnimGeneralFunctionsEventExtension* EventExtension() + { + return static_cast(ExtendedInterface(EEventExtentionInterface)); + } + private: + virtual void Reserved1() const; + virtual void Reserved2() const; + virtual void Reserved3() const; + }; + +/* Structure for passing window configuration information. Currently transparancey +related configuration information is supported, though this may be added to, as +apprioriate. + +@publishedAll +@released +*/ +class TWindowConfig + { +public: + /** Transparency flags. + + Used to represent transparency configuration of the window. */ + enum + { + /** Transparency is enabled on the window. */ + ETransparencyEnabled=0x0001, + /** Window transparency uses alpha blending channel. */ + EAlphaBlendedTransparency=0x0002, + }; +public: + /** Indicate configuration of window, using enumerations defined within this class. */ + TInt iFlags; +private: + TInt iReserved0; + TInt iReserved1; + TInt iReserved2; + }; + +class MAnimGeneralFunctionsWindowExtension +/** General Window utility functions interface. + +The member functions define the interface for querying and manipulating +the window and screen attributes. + +You obtain one by calling: iFunctions->ExtendedInterface(MAnimGeneralFunctions::EWindowExtensionInterface) +and casting the result. + +It is not intended for user derivation. + +@publishedAll +@released */ + { +public: + /** Class contains the information pertaining to a window group: name, priority, + focusability. */ + class TWindowGroupInfo + { + public: + enum + { + /** Window is focusable flag. */ + EIsFocusable=0x0001, + }; + public: + /** Returns whether or not the window is focusable. + @return ETrue if focusable, else returns EFalse. */ + inline TBool IsFocusable() const {return iFlags&EIsFocusable;} + public: + /* Window group attributes. */ + TInt iId; + TUint32 iFlags; + TInt iOrdinalPriority; + TInt iNameLength; + TInt iParentId; + }; +public: + /** Returns the total number of screens. + @return The total number of screens. */ + virtual TInt Screens() const=0; + + /** Returns the number of the screen which is currently in focus. + @return The number of the screen which is currently in focus.*/ + virtual TInt FocusScreens() const=0; + + /** Changes the focused screen. + @param aScreenNo New screen number. */ + virtual void SetFocusScreen(TInt aScreenNo)=0; + + /** Returns the number of window groups available for the specified screen. + + @param aScreen The screen number. + @return The number of window groups. */ + virtual TInt WindowGroups(TInt aScreen) const=0; + + /** Takes a screen number and an ordinal position and returns the complete window + group information of the specified window. If the window group does not exist, the + function returns EFalse. + + Note: the ordinal position specified should be the total or full ordinal position + of all group windows of all priorities on that screen. + + @param aInfo on return, complete window information. + @param aScreen Screen number. + @param aFullOrdinalPosition Ordinal position of the window. + @return ETrue if window group information exists, EFalse otherwise. */ + virtual TBool WindowGroupInfo(TWindowGroupInfo& aInfo,TInt aScreen,TInt aFullOrdinalPosition) const=0; + + /** Takes a screen number and an ordinal position and returns the window group name. + If the window group does not exist, the function returns false. + + Note: the ordinal position specified should be the total or full ordinal position of + all group windows of all priorities on that screen. + + Note: if the name does not fit into the descriptor provided then it will be truncated. + + @param aWindowName On return, the window group name. + @param aScreen The screen number. + @param aFullOrdinalPosition The ordinal position of the window. + @return ETrue if the window group name exists, EFalse otherwise. */ + virtual TBool WindowGroupName(TPtrC& aWindowName,TInt aScreen,TInt aFullOrdinalPosition) const=0; + + /** Changes the ordinal position and priority of the window group with the specified ID. + + @param aWindowGroupId The window group ID. + @param aPos The ordinal position to move the window to. + @param aOrdinalPriority The new ordinal priority of the window. + @return KErrNotFound if there is no window group with the specified ID, KErrNone otherwise. */ + virtual TInt SetOrdinalPosition(TInt aWindowGroupId,TInt aPos,TInt aOrdinalPriority)=0; + + /** Accessor for window configuration. + + @param aWindowConfig Gets filled in with window configuration details. */ + virtual void WindowConfig(TWindowConfig& aWindowConfig) const=0; + +private: + virtual void Reserved1() const; + virtual void Reserved2() const; + virtual void Reserved3() const; + }; + +class MAnimGeneralFunctionsEventExtension +/** Event utility functions interface. + +The member functions define the interface for generate repeated key events . + +It is not intended for user derivation. +*/ + { +public: + /** Posts a key event. + + The function is similar to PostKeyEvent() but should be +used for posting repeated key events. + + @param aRawEvent The key event. + @param aRepeats value */ + virtual void PostKeyEvent(const TKeyEvent& aRawEvent, TInt aRepeats) const=0; + +private: + virtual void Reserved1() const; + virtual void Reserved2() const; + }; + +class MAnimWindowFunctions +/** Window utility functions interface. + +The member functions define the interface for querying and manipulating +the window in which the animation takes place. + +You do not have to create an object of this type. The class is implemented +by the window server, and provides these utility functions to all CWindowAnim +and CFreeTimerWindowAnim derived classes via the iWindowFunctions pointer. + +It is not intended for user derivation. + +@publishedAll +@released */ + { +public: + /** Activates the graphics context. + + This function should be called to enable drawing in the CAnim-derived classes' + Command(), CommandReplyL(), Animate(), or FocusChanged() functions. + + Note: this function is called automatically by the animation DLL framework in the + Redraw() function. */ + virtual void ActivateGc()=0; + /** Sets the rectangle that this animation is to draw to. + + This function must be called as part of the initialisation/construction of + the CAnim-derived object, i.e. in CAnim::ConstructL(). This is so that the + window server knows which area the animation is operating in. + + @param aRect The rectangle to be drawn to. */ + virtual void SetRect(const TRect &aRect)=0; + /** Gets the window size. + + @return The window size, in pixels. */ + virtual TSize WindowSize() const=0; + /** Tests whether to draw the animation. + + If the window is completely hidden, there is normally no need to draw + the animation. However in some conditions the animation should be drawn even + if it is obscured. The window server is aware of these cases, and returns + ETrue if it is not safe to draw the animation. + + @return True if the window is completely hidden and there is no requirement + to continue drawing the animation, otherwise false. */ + virtual TBool IsHidden()=0; + /** Sets the visibility of the window the animation is drawing to. + + This does the same as RWindowBase::SetVisible(). + + @param aState True for visible, false otherwise. */ + virtual void SetVisible(TBool aState)=0; + /** Forces a redraw of a rectangular part of the window. + + The function causes a redraw message on the part of the window specified, + which provides a non-immediate way to do drawing. + + It can be used to redraw the whole of the window, not just the part used by + the animation. + + @param aRect The rectangle to be redrawn. These co-ordinates are relative + to the origin of the window. */ + virtual void Invalidate(const TRect &aRect)=0; + /** Gets window information. + + @param aData The window information. */ + virtual void Parameters(TWindowInfo &aData)=0; + /** Gets the visible region. + + This region is the area of the visible window which + is currently unshadowed. If there is not enough memory to calculate this region + then aRegion's error flag is set. + + @param aRegion The visible region. */ + virtual void VisibleRegion(TRegion& aRegion)=0; + //virtual void CopyScreen(CFbsBitGc *aBitmapGc,TRect aRect)=0; +private: + virtual void Reserved() const; + virtual void Reserved1() const; + virtual void Reserved2() const; + virtual void Reserved3() const; + }; + + +class MAnimFreeTimerWindowFunctions : public MAnimWindowFunctions +/** Free timer animation utility functions interface. + +The class inherits functions from MAnimWindowFunctions, and defines the additional +interface required for window operations which support animations with their +own timers. + +You do NOT have to create an object of this type. The class is implemented +by the window server, and provides utility functions to all CFreeTimerWindowAnim +derived classes via the WindowFunctions() member. + +It is not intended for user derivation. + +@publishedAll +@released */ + { +public: + /** Deactivates the graphics context. + + This function is used in the context of a CFreeTimerWindowAnim derived class + when writing animation DLLs with their own timer. Within the timer's RunL(), + the ActivateGc() function should be called prior to drawing to the window. + DeactivateGc() should be called after drawing is finished. */ + virtual void DeactivateGc()=0; + /** Forces the screen to update. */ + virtual void Update()=0; +private: + virtual void Reserved3() const; + }; + +class MAnimSpriteFunctions +/** Sprite animation utility functions interface. + +The interface includes functions for querying and manipulating a sprite. + +You do NOT have to create an object of this type. The class is implemented +by the window server, and provides utility functions to all CSpriteAnim derived +classes via the CSpriteAnim::iSpriteFunctions pointer. + +It is not intended for user derivation. + +@publishedAll +@released */ + { +public: + /** Gets sprite member data. + + Each member of the sprite is effectively a bitmap, which is displayed for a + different amount of time. + + @param aMember The index of the sprite member for which information is required. + @return A pointer to the sprite member. */ + virtual TSpriteMember *GetSpriteMember(TInt aMember) const=0; + /** Redraws part of a sprite. + + WSERV1: + + The updates a sprite on the screen, possibly after the bitmap for a particular + sprite member has been changed. + + Two types of redraw are possible. A full update takes the bitmap off the screen + and then re-draws it. This is 'safe' in that the screen always reflects + the contents of the sprite bitmap. However it can result in flicker. Use the + aRect parameter to specify the (small) part of the sprite which has been changed, + then any flicker will only occur in this rectangle. + + A full update is required if you have removed pixels from the mask, i.e. made + pixels in the sprite transparent when they were not before. If drawing is + additive, e.g. you are using a mask or the draw mode is EDrawModePEN, a partial + update is possible. Otherwise the aFullUpdate argument is ignored and a full + update is always done. + + Note: if the sprite member aMember is not visible then there is no need for a change + to the display, so the aRect and aFullUpdate parameters are ignored. + + param aMember The index of the sprite member that is to be updated. + param aRect The part of the sprite member which has changed. + param aFullUpdate ETrue for a full update, EFalse otherwise. + + WSERV2: + + Updates a sprite on the screen, possibly after the bitmap for a particular + sprite member has been changed. + + Use the aRect parameter to specify the (small) part of the sprite which has been changed, + then any flicker will only occur in this rectangle. + + A full update used to be required if you had removed pixels from the mask, i.e. made + pixels in the sprite transparent when they were not before. If drawing is + additive, e.g. you are using a mask or the draw mode is EDrawModePEN, a partial + update used to be possible. But newer versions of the window-server always do full back to front rendering. + + Note: if the sprite member aMember is not visible then there is no need for a change + to the display, so the aRect and aFullUpdate parameters are ignored. + + @param aMember The index of the sprite member that is to be updated. + @param aRect The part of the sprite member which has changed. + @param aFullUpdate Not used. Wserv now always do full back to front rendering. */ + virtual void UpdateMember(TInt aMember,const TRect& aRect,TBool aFullUpdate)=0; + /** Turns a sprite on or off. + + In effect this makes the sprite bitmap visible. + + @param aActive ETrue to turn sprite on. EFalse to turn it off. */ + virtual void Activate(TBool aActive)=0; + /** Finishes constructing the sprite. + + It also sets the currently displayed sprite member to zero. + + This function must be called after members change size. */ + virtual void SizeChangedL()=0; + /** Set the sprite's position. + + @param aPos The new position of the sprite. */ + virtual void SetPosition(const TPoint &aPos)=0; +private: + virtual void Reserved() const; +public: + /** Returns the visibility of the sprite. + + A sprite can be seen if it is neither obscured by another window nor hidden. + + @return ETrue if the sprite can be seen, EFalse otherwise. */ + virtual TBool SpriteCanBeSeen() const = 0; +private: + virtual void Reserved2() const; + virtual void Reserved3() const; + virtual void Reserved4() const; + }; + + +class CAnimGc : public CBitmapContext +/** Animation graphics context. + +An object of this type is linked into CAnim by the window server, which allows +you to draw to the animation window. The object's functions allow you to set +and cancel the clipping region, and to draw to the visible window using +the inherited CBitmapContext functions. + +@publishedAll +@released */ + { +public: + /** Sets the clipping region. + + Only the parts of the animation which are within the clipping region are drawn. + + @param aRegion The clipping region. */ + virtual TInt SetClippingRegion(const TRegion &aRegion)=0; + /** Cancels the clipping region. + + @see SetClippingRegion() */ + virtual void CancelClippingRegion()=0; + }; + +class CWsAnim; // Forward ref for friend declaration + + +class CAnim : public CBase , public MEventHandler +/** Server side animated object base interface. + +Animations implement this interface, which is called by the window server +to pass commands from clients, perform a step in the animation, or to pass +window server events (if required) so that the animation can handle them +before the application. + +The functions are all pure virtual, and must be implemented in +the derived class to provide server side behaviour. The functions will be +called by the window server with optional arguments passed in from the client +side animation class RAnim. + +You should derive from CWindowAnim, CFreeTimerWindowAnim or CSpriteAnim, +depending on whether the animation is to draw to a sprite or a window, +rather than directly from this class. + +The derived class is constructed in the DLL factory class CAnimDll::CreateInstanceL() +function. + +The operation to perform an animation step is called by the window server +on a timer. The timing properties are set through an MAnimGeneralFunctions +member, which also provides other utility functions. + +@publishedAll +@released */ + { +public: + /** Implements client-side initiated commands, returning a value. + + The window server calls this function in response to application calls to + the client side command function RAnim::CommandReplyL(). The arguments passed + to the function by the window server are the same as were used on the client + side function call. + + This function returns values to the client side, and should be used to return + error codes for commands which might leave. + + @param aOpcode Opcode understood by the class. + @param aArgs Arguments packaged on the client side, for example as a struct + of a type determined by the aOpcode argument. These mirror the aArgs argument + passed in to RAnim::CommandReply(). + @return Value passed back to client side function when this function completes. + Typically this would be KErrNone or another of the system-wide error codes. + However any value may be returned to the client side. + @see RAnim */ + virtual TInt CommandReplyL(TInt aOpcode, TAny *aArgs)=0; + /** Implements client-side initiated commands. + + The window server calls this function in response to application calls to + the client side command function RAnim::Command(). The arguments passed to + the function by the window server are the same as were used on the client + side function call. + + Because this function does not return errors, it is not safe for commands + which might leave. + + @param aOpcode Opcode understood by the class + @param aArgs Arguments packaged on the client side, for example as a struct + of a type determined by the aOpcode argument. These mirror the aArgs argument + passed in to RAnim::Command(). + @see RAnim */ + virtual void Command(TInt aOpcode, TAny *aArgs)=0; + /** Main animation function, called by the window server. + + The drawing code which implements a given animation should be provided here. + + This function is called at a frequency determined by the SetSync() helper + function. Note that if sync is not set, then this function will never be + called. This effect can be exploited to use the animation framework, with + its server side speed, for what are strictly not animations, e.g. for streaming + video images. + + The aDateTime parameter will be null if the current time (as determined by + the window server) matches the time implied by the sync period, modulo normalisation, + otherwise it will contain a valid (non-normalised) time. + + Normalisation is to some specified granularity, for example if one minute + is specified as the animation frequency, then in effect the window server + will decide whether the implied time is correct to the minute, but not to + the second. + + Implied time is the time implied by the (normalised) actual time of the previous + animation call plus the sync interval. For example if the last call was at + time 't' and the sync interval is 1 second then if the time at this call + is t + 1 second, then actual time and implied time match and the value placed + into aDateTime will be NULL. + + Cases in which the two may not match include, for example, system time having + been reset between animation calls (perhaps British Summer Time or other daylight + saving time has just come into effect). The intention is that when system + time changes, a mechanism is provided to alert the animation code and allow + it to reset itself. The assumption is that somewhere in its initialisation + code, the animation will have performed a CAnimFunctions utility call to set + a base time, which is then implicitly tracked by incrementing by a suitable + interval; when aDateTime is non-NULL after a call to Animate(), base time + should be reset. + + @param aDateTime Null if the current time w.r.t. the window server matches + the time implied by the synch period. Otherwise a valid (non-normalised) time. */ + virtual void Animate(TDateTime *aDateTime)=0; + virtual void HandleNotification(const TWsEvent& /*aEvent*/) {}; +private: + inline CAnim() {} + virtual void Reserved1() const {}; + virtual void Reserved2() const {}; + virtual void Reserved3() const {}; +protected: + /** Pointer to a class containing functions implemented by the window server. + + These are available to any CAnim derived class. + + Note that this value is automatically set for you by the animation framework. + You do not need to assign a value to this pointer. + @publishedAll + @released */ + MAnimGeneralFunctions *iFunctions; + friend class CWsAnim; + friend class CWindowAnim; + friend class CSpriteAnim; + }; + + +class CWindowAnim : public CAnim +/** Window animation interface. + +This interface is provided to create animations other than sprites. A window +animation can be provided by deriving from this class. + +The interface inherits from CAnim and has access to its functions. It additionally +can access an interface for querying and manipulating the window in which +the animation takes place, using its iWindowFunctions member. + +The derived class is constructed in the DLL factory class CAnimDll::CreateInstanceL(). + +@publishedAll +@released +@see CFreeTimerWindowAnim +@see CSpriteAnim */ + { +public: + /** Server side construction and initialisation of an animation class. + + Note: the aHasFocus argument allows the animation to start in a known focus state. + For example, an animation may or may not have focus, depending on how it was + started. Together with the FocusChanged() function, this allows an animation + to always know its focus state. + + @param aArgs Packaged arguments which may be required during construction. + These are transferred from the aParams argument of the client side constructor's + RAnim::Construct(). + @param aHasFocus Specifies whether or not the animation has window server focus. */ + virtual void ConstructL(TAny *aArgs, TBool aHasFocus)=0; + /** Redraws the objects. + + The function is called by the window server when it needs to redraw the object. + The object must provide all the low level drawing code. */ + virtual void Redraw()=0; + /** Notifies change of focus. + + The function is called by the window server to notify a change of focus, + allowing the animation code to track whether it does or does not have focus, + and to change its appearance accordingly. + + @param aState Indicates whether the focus has or has not changed. */ + virtual void FocusChanged(TBool aState)=0; +protected: + /** Protected constructor. + + Prevents objects of this class being directly constructed. */ + inline CWindowAnim() {} +private: + virtual void ReservedW1() const {}; + virtual void ReservedW2() const {}; +protected: + /** Pointer to a class containing functions implemented by the window server. + + These are available to any CWindowAnim-derived class. + + Note that this and the iGc pointer are automatically set for you by the + animation framework - you do not need to assign a value to them.*/ + MAnimWindowFunctions *iWindowFunctions; + /** Pointer to the graphics context. */ + CAnimGc *iGc; + friend class CWsAnim; + }; + + +class CFreeTimerWindowAnim : public CWindowAnim +/** Free timer animation interface. + +This interface allows animations to have their own timers or other active +objects, and to draw to the window when the timer completes. The implication +of this is that animations derived from this class can have an extremely short +user-defined time between calls to the Animate() function, unlike the +other animation classes, which are tied to the (approximately) half second +flash cycle. + +The interface inherits from CWindowAnim and has access to its functions. It +additionally can access functions declared in the MAnimFreeTimerWindowFunctions +interface, using WindowFunctions(). + +In order to draw to the window inside the RunL() of your own timer, you will +need call the ActivateGc() function before doing any drawing, and the DeactivateGc() +function after finishing the drawing. + +@publishedAll +@released +@see CSpriteAnim */ + { +protected: + inline MAnimFreeTimerWindowFunctions* WindowFunctions() + /** Gets the free timer utility functions. + + These functions include all the MAnimWindowFunctions, + and additional functions to deactivate the graphics context and to force the + screen to update. + + @return A pointer to the free timer utility functions. */ + {return STATIC_CAST(MAnimFreeTimerWindowFunctions*,iWindowFunctions);} +private: + virtual void ReservedF1() const {}; + }; + + +class CSpriteAnim : public CAnim +/** Sprite animation interface. + +Sprites are bitmaps that can overlay a window or the screen. A sprite animation +can be provided by deriving from this class. + +The interface inherits from CAnim and has access to its functions. It additionally +can access an interface for querying and manipulating a sprite, using its +iSpriteFunctions member. + +The derived class is constructed in the DLL factory class CAnimDll::CreateInstanceL() +function. + +@publishedAll +@released +@see CFreeTimerWindowAnim +@see CWindowAnim */ + { +public: + /** Server side construction and initialisation of an animation class. + + @param aArgs Packaged arguments which may be required during construction. + These are transferred from the aParams argument of the client side constructor's + RAnim::Construct(). */ + virtual void ConstructL(TAny *aArgs)=0; +protected: + inline CSpriteAnim() + /** Protected constructor. + + Ensures that only derived classes can be constructed. */ + {} +private: + virtual void ReservedS1() const {}; + virtual void ReservedS2() const {}; +protected: + /** Pointer to a class containing functions implemented by the window server. + + These are available to any CSpriteAnim-derived class. + + Note that this value is automatically set for you by the animation framework. + You do not need to assign a value to this pointer. */ + MAnimSpriteFunctions *iSpriteFunctions; + friend class CWsAnim; + }; + + +class CAnimDll : public CBase +/** Animation DLL factory interface. + +An animation DLL class must be a derived class of CAnimDll, and can be thought +of as a server side factory class. CAnimDll consists of a single pure virtual +factory function, CreateInstanceL(TInt aType), which is used to create new +instances of animation objects of type CAnim contained in the DLL. Animation +DLL objects are created by the CreateCAnimDllL() function, which is called +by the window server at the request of the client. + +For efficiency reasons, it makes sense to collect multiple animation classes +into a single DLL, even if they are otherwise logically quite separate classes. + +@publishedAll +@released */ + { +public: + /** Factory function for animation DLLs. + + It must be provided in the derived class. + + The parameter can be used to differentiate between multiple animation + classes contained in the same animation DLL. + + @param aType Identifies an animation class to be constructed. This is the + same value as the aType argument of the client side animation constructor + RAnim::Construct(). It is passed from the client side by the animation framework. + @return Pointer to a CAnim-derived animation class object. */ + virtual CAnim *CreateInstanceL(TInt aType)=0; + }; + +#endif