--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/SERVER/EVQUEUE.H Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,215 @@
+// Copyright (c) 1999-2009 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:
+// Definition of classes related event queues
+//
+//
+
+#if !defined(__EVQUEUE_H__)
+#define __EVQUEUE_H__
+
+#include <e32std.h>
+#include <e32base.h>
+#include <w32std.h>
+#include <graphics/wsgraphicdrawerinterface.h>
+
+class CWsClient;
+class CWsWindowRedraw;
+class CWsGraphicDrawer;
+
+enum TEventQueueWalkRet
+ {
+ EEventQueueWalkOk,
+ EEventQueueWalkDeleteEvent,
+ EEventQueueWalkRestart,
+ };
+class TWsEvent;
+
+typedef TEventQueueWalkRet (*EventQueueWalk)(TAny *aPtr, TWsEvent *aEvent);
+
+enum TWservEventPriorities
+ {
+ EEventPriorityHigh,
+ EEventPriorityLow,
+ };
+
+struct TRedraw
+ {
+ CWsWindowRedraw *iRedraw;
+ TUint iPriority;
+ };
+
+class CEventBase : public CBase
+ {
+private:
+ enum TEventSignalledState
+ {
+ EEventFlagSignalled=0x1,
+ EEventFlagCancelled=0x2
+ };
+public:
+ CEventBase(CWsClient *aOwner);
+ ~CEventBase();
+ void CancelRead();
+ void EventReadyCheck();
+ virtual void EventReady(const RMessagePtr2& aEventMsg);
+ void GetData(TAny *aData, TInt aLen);
+protected:
+ void SignalEvent(TInt aCode = KErrNone);
+ inline TBool IsEventCancelled();
+protected:
+ TInt iEventSignalledState;
+ CWsClient *iWsOwner;
+ RMessagePtr2 iEventMsg;
+ };
+
+class CEventQueue : public CEventBase
+ {
+private:
+ enum {EExtraQueueSize=16};
+ enum {EMaxQueueSize=32};
+ enum {EMinQueueSize=2};
+ enum {EQueueGranularity=4};
+ enum TCompressMode
+ {
+ ECompressNoPurge, // Compress only free space
+ ECompressPurge1, // Purge from only non-foreground queues
+ ECompressPurge2, // Purge from all queues
+ };
+// Functions
+public:
+ CEventQueue(CWsClient *aOwner);
+ ~CEventQueue();
+ void ConstructL();
+ TBool QueueEvent(const TWsEvent &event);
+ TBool QueueEvent(const TWsEvent &event, TWservEventPriorities aPriority);
+ TBool QueueEvent(TUint32 aTarget, TInt aEvent);
+ TBool CheckRoom();
+ void GetData();
+ void UpdateLastEvent(const TWsEvent &event);
+ void RemoveEvent(TInt index);
+ void PurgePointerEvents();
+ const TWsEvent *PeekLastEvent();
+ void WalkEventQueue(EventQueueWalk aFunc, TAny *aFuncParam);
+ void MoveToFront();
+ static void Wait();
+ static void Signal();
+ static void InitStaticsL();
+ static void DeleteStaticsL();
+ //void LogUpDownEvents(TChar aChar);
+public:// from CEventBase
+ void EventReady(const RMessagePtr2& aEventMsg);
+private:
+ static void EventCopy(TWsEvent *aStart, TWsEvent *aEnd, TInt aNumEvents);
+ static TInt RequiredQueueSize(TInt aNumConnections);
+ void AdjustQueueSizeL(TInt aNewSize);
+ void IncreaseQueueSize(TInt aNumSpaces);
+ TInt FollowingGap() const;
+ void Purge();
+ TInt PurgeInactiveEvents(const TInt& aSizeRequired);
+ void Compress(TCompressMode aCompressMode);
+ void AddQueueL();
+ void RemoveQueue();
+ TBool Expand(TWservEventPriorities aPriority);
+ TBool doExpand(TCompressMode aCompressMode);
+ TInt SqueezeUp();
+ void SqueezeDown();
+ void MoveUp(TInt aMove);
+ void MoveDown(TInt aMove);
+ TBool MoveDownAndExpand(TDblQueIter<CEventQueue> &aIter, TInt aExpand);
+#if defined(_DEBUG)
+ void CheckQueue();
+ void ZapEvent(TWsEvent *aTarget);
+ void ZapEvents(TWsEvent *aTarget, TInt aLen);
+#endif
+private:
+ void QueueActive();
+ TWsEvent *EventPtr(TInt index);
+// Data
+ TInt iHead;
+ TInt iCount;
+ TInt iQueueSize;
+ TWsEvent *iEventPtr;
+ TDblQueLink iLink;
+ static RMutex iMutex;
+ static TWsEvent iNullEvent;
+ static TDblQue<CEventQueue> iQueueList;
+ static TWsEvent *iGlobalEventQueue;
+ static TInt iGlobalEventQueueSize;
+ static TInt iNumConnections;
+ };
+
+class TWsRedrawEvent;
+
+class CRedrawQueue : public CEventBase
+ {
+// Functions
+public:
+ CRedrawQueue(CWsClient *aOwner);
+ ~CRedrawQueue();
+ void ConstructL();
+ TBool TriggerRedraw();
+ void ReCalcOrder();
+ void AddInvalid(CWsWindowRedraw *redrawWin);
+ void RemoveInvalid(CWsWindowRedraw *redrawWin);
+ void GetData();
+ TUint RedrawPriority(CWsWindowRedraw *aRedrawWin);
+public:// from CEventBase
+ void EventReady(const RMessagePtr2& aEventMsg);
+private:
+ void DeleteFromQueue(TInt aIndex);
+ void QueueActive();
+ TBool FindOutstandingRedrawEvent(CWsWindowRedraw& aRedraw, TWsRedrawEvent& aEvent);
+ TBool FindWindowNeedingRedrawEvent(TWsRedrawEvent& aEvent);
+private:
+// Data
+ CArrayFixSeg<TRedraw> *iRedraws; // List of windows and their areas that require redraws
+ TBool iAllocError;
+ TBool iRedrawTrigger;
+ TKeyArrayFix *iKeyPriority;
+ TKeyArrayFix *iKeyWindow;
+ static TWsRedrawEvent iNullRedrawEvent;
+ };
+
+class CWsGraphicMessageQueue: public CEventBase
+ {
+public:
+ class CMessage: public CWsMessageData
+ {
+ public:
+ static CMessage* New(const TDesC8& aData);
+ ~CMessage();
+ public: // From CWsMessageData
+ TPtrC8 Data() const;
+ void Release();
+ private:
+ CMessage(const TDesC8& aData);
+ private:
+ TPtr8 iData;
+ };
+public:
+ CWsGraphicMessageQueue(CWsClient *aOwner);
+ ~CWsGraphicMessageQueue();
+ void GetGraphicMessage();
+ void AbortMessage(TInt aError);
+ void EventReady(const RMessagePtr2& aEventMsg);
+ void Queue(CWsMessageData* aMessage);
+ TInt TopClientHandle() const;
+private:
+ CWsMessageData* iHead;
+ CWsMessageData* iTail;
+ CWsMessageData* Pop();
+ void GetDataWithHeader(TUint aHeader, const TDesC8& aData, TInt aDataLen);
+ };
+
+#endif