--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/windowing/windowserver/nonnga/SERVER/EVENT.H Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,273 @@
+// 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 handling
+//
+//
+
+
+#ifndef __EVENT_H__
+#define __EVENT_H__
+
+#include "EVQUEUE.H"
+#include <e32std.h>
+#include <e32base.h>
+#include <e32svr.h>
+#include <w32std.h>
+#include "w32cmd.h"
+#include <w32adll.h>
+#include <graphics/wsgraphicdrawer.h>
+
+class CWsClient;
+class CWsWindowBase;
+class CWsWindowGroup;
+class MEventHandler;
+class CWsHotKey;
+class CWsCaptureLongKey;
+class CScreen;
+
+struct TEventRequestItem
+ {
+ const CWsWindowBase *iWindow;
+ TInt iParam;
+ TEventControl iCircumstances;
+ TSglQueLink iQue;
+ };
+
+class TEventRequestQueue
+ {
+public:
+ TEventRequestQueue();
+ TEventRequestItem *FindInEventRequestQueueList(const CWsWindowBase &aWindow);
+ void AddToEventRequestListL(const CWsWindowBase &aWindow, TInt aParam, TEventControl aCircumstances);
+ void RemoveFromEventRequestListL(const CWsWindowBase &aWindow);
+ inline TSglQue<TEventRequestItem> &Queue();
+private:
+ TSglQue<TEventRequestItem> iQueue;
+ };
+
+class CRawEventReceiver : public CActive
+ {
+public:
+ CRawEventReceiver(TInt aPriority);
+ ~CRawEventReceiver();
+ void ConstructL();
+protected:
+ void Request();
+ void DoCancel();
+ void RunL();
+private:
+ TRawEventBuf iEventBuf;
+ };
+
+class TRepeatKey
+ {
+public:
+ TKeyData iKey;
+ TInt iScanCode;
+ };
+
+class CKeyboardRepeat : public CTimer
+ {
+public:
+ CKeyboardRepeat();
+ static void NewL();
+ static void Destroy();
+ static void KeyDown();
+ static void KeyUp(TInt aScanCode);
+ static TBool StartRepeat(const TKeyData &aKey, TInt aScanCode, CWsWindowGroup *aRepeatFocus, CWsCaptureLongKey* longCapture);
+ static void CancelRepeat(CWsWindowGroup *aRepeatFocus);
+ static void CancelRepeat(CWsWindowGroup *aRepeatFocus,TUint aScanCode,TBool aLongCaptureFlag,TUint aModifiers=0);
+ static void SetRepeatTime(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime);
+ static void GetRepeatTime(TTimeIntervalMicroSeconds32 &aInitialTime, TTimeIntervalMicroSeconds32 &aTime);
+ static inline TBool IsAreadyActive();
+private:
+ enum TRepeatType
+ {
+ ERepeatNone,
+ ERepeatNormal,
+ ERepeatLong,
+ ERepeatLongRepeated,
+ };
+private:
+ static void doCancelRepeat();
+ void RunL();
+private:
+ static CWsWindowGroup *iFocus;
+ static CKeyboardRepeat *iThis; // Needed as CTimer derived parts can't be static
+ static TTimeIntervalMicroSeconds32 iInitialTime;
+ static TTimeIntervalMicroSeconds32 iTime;
+ static TRepeatKey iCurrentRepeat;
+ static TRepeatType iRepeating;
+ static TRepeatKey iAlternateRepeat;
+ static TBool iAlternateRepeatExists;
+ static CWsCaptureLongKey* iLongCapture;
+ static TInt iRepeatRollover;
+ };
+
+struct SNotificationHandler {CAnim* iAnim; TUint32 iNotifications;};
+struct TDrawerHandler
+ {
+ TDrawerHandler(CWsGraphicDrawer *aDrawer, TUint32 aEvents): iDrawer(aDrawer), iEvents(aEvents) {}
+ CWsGraphicDrawer* iDrawer;
+ TUint32 iEvents;
+ };
+
+// Andy - can we deprectate TDrawerHandler and just use this? It seems to be more generic and there's no
+// good reason not to be.
+struct TWsEventHandler
+ {
+ TWsEventHandler(MWsEventHandler *aHandler, TUint32 aEvents): iHandler(aHandler), iEvents(aEvents) {}
+ static TBool CompareHandler(const TWsEventHandler& lhs, const TWsEventHandler& rhs) { return lhs.iHandler == rhs.iHandler; }
+ MWsEventHandler* iHandler;
+ TUint32 iEvents;
+ };
+
+class TWindowServerEvent
+ {
+ #define EDefaultInitialRepeatTime TTimeIntervalMicroSeconds32(300000)
+ #define EDefaultRepeatTime TTimeIntervalMicroSeconds32(100000)
+
+ typedef void (*TSendEventFunc)(TEventRequestItem *aQptr, TInt aParam1, TInt aParam2);
+public:
+ enum {ENumHotKeys=21};
+ enum {EOomEventSecondGap=150}; // Don't resend OOM messages unless at least 150 seconds has passed
+ enum {ERemovedEventHandlerWhileProcessingRawEvents=0x02};
+public:
+ static void InitStaticsL();
+ static void DeleteStatics();
+ static CWsHotKey* ClearHotKeysL(TInt aHotKey);
+ static void ResetDefaultHotKeyL(TInt aHotKey);
+ static void SetHotKeyL(const TWsClCmdSetHotKey &aHotKey);
+ static void AddCaptureKeyL(const TCaptureKey &aCaptureKey);
+ static void SetCaptureKey(TUint32 aHandle, const TCaptureKey &aCaptureKey);
+ static void CancelCaptureKey(TUint32 aHandle);
+ static void ClientDestroyed(CWsClient *aClient);
+ static inline void AddToSwitchOnEventListL(const CWsWindowBase &aWindow, TEventControl aCircumstances);
+ static inline void RemoveFromSwitchOnEventList(const CWsWindowBase &aWindow);
+ static inline void AddToErrorMessageListL(const CWsWindowBase &aWindow, TEventControl aCircumstances);
+ static inline void RemoveFromErrorMessageList(const CWsWindowBase &aWindow);
+ static inline void AddToModifierChangedEventListL(const CWsWindowBase &aWindow, TInt aModifierMask, TEventControl aCircumstances);
+ static inline void RemoveFromModifierChangedEventList(const CWsWindowBase &aWindow);
+ static inline void AddToGroupChangeEventListL(const CWsWindowBase &aWindow);
+ static inline void RemoveFromGroupChangeEventEventList(const CWsWindowBase &aWindow);
+ static inline void AddToFocusChangeEventListL(const CWsWindowBase &aWindow);
+ static inline void RemoveFromFocusChangeEventEventList(const CWsWindowBase &aWindow);
+ static inline void AddToGroupListChangeEventListL(const CWsWindowBase &aWindow);
+ static inline void RemoveFromGroupListChangeEventEventList(const CWsWindowBase &aWindow);
+ static inline void AddToScreenDeviceChangeEventListL(const CWsWindowBase &aWindow);
+ static inline void RemoveFromScreenDeviceChangeEventList(const CWsWindowBase &aWindow);
+ static TInt GetModifierState();
+ static inline TInt GetStoredModifierState();
+ static void SetModifierState(TEventModifier aModifier,TModifierState aState);
+ static void ProcessRawEvent(const TRawEvent& aRawEvent);
+ static void ProcessKeyEvent(const TKeyEvent& aKeyEvent,TInt aRepeats);
+ static TBool MousePress(const TRawEvent &aRawEvent, const CWsWindowGroup *aGroupWin);
+ static void SendGroupChangedEvents();
+ static void SendFocusChangedEvents();
+ static void SendGroupListChangedEvents();
+ static void SendVisibilityChangedEvents(CWsWindowBase* aWin, TUint aFlags);
+ static void SendScreenDeviceChangedEvents(CScreen* aScreen);
+ static void SendScreenDeviceChangedEvent(const CWsWindowBase *aWindow);
+ static TBool ProcessErrorMessages(TWsErrorMessage::TErrorCategory aCategory, TInt aError);
+ static void NotifyOom();
+ static void QueueKeyPress(const TKeyData &aKey, TInt aScanCode, CWsWindowGroup *aRepeatFocus, TBool aCheckRepeat,TInt aRepeats);
+ static void AddEventHandler(MEventHandler *aEventHandler);
+ static void RemoveEventHandler(const MEventHandler *aEventHandler);
+ static void PotentialEventHandlerL(TInt aNum);
+ static TInt AddNotificationHandler(CAnim* aAnim, TUint32 aNotifications);
+ static void RemoveNotificationHandler(CAnim* aAnim);
+ static void PublishNotification(const TWsEvent& aWsEvent);
+ static TInt RegisterDrawerHandler(CWsGraphicDrawer* aDrawer, TUint32 aEvents);
+ static TInt UnregisterDrawerHandler(CWsGraphicDrawer* aDrawer);
+ static TInt RegisterWsEventHandler(MWsEventHandler * aHandler, TUint32 aEvents);
+ static TInt UnregisterWsEventHandler(MWsEventHandler * aHandler);
+ static void NotifyDrawer(const TWservCrEvent& aEvent);
+ static void NotifyScreenDrawingEvent(const TRegion* aRegion);
+ static void NotifyScreenDrawingEvent(const TRect& aRect);
+private:
+ static void ProcessEventQueue(TEventRequestQueue &aQueue, TSendEventFunc aFunc, TInt aParam1, TInt aParam2);
+ static void DeleteHotKeys();
+ static void QueueKeyEvent(CWsWindowGroup *aWin, TWsEvent &aEvent, TWservEventPriorities aPriority);
+ static void QueueKeyUpDown(const TRawEvent &aRawEvent);
+ static void ConstructDefaultHotKeyL(TInt aHotKey, const TWsWinCmdCaptureKey &aSystemKey);
+ static void ProcessModifierChanges();
+ static void LinkHotKey(CWsHotKey *aWsHotKey);
+ static TBool DrawerCompareFunc(const TDrawerHandler& lhs, const TDrawerHandler& rhs);
+private:
+ static CKeyTranslator *iKeyTranslator;
+ static TEventRequestQueue iSwitchOnQueue;
+ static TEventRequestQueue iErrorMessageQueue;
+ static TEventRequestQueue iModifierChangedQueue;
+ static TEventRequestQueue iGroupChangedQueue;
+ static TEventRequestQueue iFocusChangedQueue;
+ static TEventRequestQueue iGroupListChangedQueue;
+ static TEventRequestQueue iScreenDeviceChangedQueue;
+ static TTime iPrevOomMessageTime;
+ static CCaptureKeys *iCaptureKeys;
+ static CWsHotKey *iHotKeys;
+ static TInt iModifierState;
+ static CRawEventReceiver *iEventReceiver;
+ static CArrayPtrFlat<MEventHandler> *iEventHandlers;
+ static CArrayFixFlat<SNotificationHandler> *iNotificationHandlers;
+ static TInt iPotentialEventHandlers;
+ static RArray<TDrawerHandler>* iDrawerHandlers;
+ static RArray<TWsEventHandler> iWsEventHandlers;
+ static TUint32 iBinaryFlags;
+ static TInt iEventHandlerCount;
+ };
+
+
+//
+// inlines //
+//
+
+inline TBool CKeyboardRepeat::IsAreadyActive()
+ {
+ return iThis->IsActive();
+ }
+
+//
+inline void TWindowServerEvent::AddToSwitchOnEventListL(const CWsWindowBase &aWindow, TEventControl aCircumstances)
+ {iSwitchOnQueue.AddToEventRequestListL(aWindow, 0, aCircumstances);}
+inline void TWindowServerEvent::AddToErrorMessageListL(const CWsWindowBase &aWindow, TEventControl aCircumstances)
+ {iErrorMessageQueue.AddToEventRequestListL(aWindow, 0, aCircumstances);}
+inline void TWindowServerEvent::AddToModifierChangedEventListL(const CWsWindowBase &aWindow, TInt aModifierMask, TEventControl aCircumstances)
+ {iModifierChangedQueue.AddToEventRequestListL(aWindow, aModifierMask, aCircumstances);}
+inline void TWindowServerEvent::AddToGroupChangeEventListL(const CWsWindowBase &aWindow)
+ {iGroupChangedQueue.AddToEventRequestListL(aWindow, 0, EEventControlAlways);}
+inline void TWindowServerEvent::AddToFocusChangeEventListL(const CWsWindowBase &aWindow)
+ {iFocusChangedQueue.AddToEventRequestListL(aWindow, 0, EEventControlAlways);}
+inline void TWindowServerEvent::AddToGroupListChangeEventListL(const CWsWindowBase &aWindow)
+ {iGroupListChangedQueue.AddToEventRequestListL(aWindow, 0, EEventControlAlways);}
+inline void TWindowServerEvent::AddToScreenDeviceChangeEventListL(const CWsWindowBase &aWindow)
+ {iScreenDeviceChangedQueue.AddToEventRequestListL(aWindow, 0, EEventControlAlways);}
+
+inline void TWindowServerEvent::RemoveFromSwitchOnEventList(const CWsWindowBase &aWindow)
+ {iSwitchOnQueue.RemoveFromEventRequestListL(aWindow);}
+inline void TWindowServerEvent::RemoveFromErrorMessageList(const CWsWindowBase &aWindow)
+ {iErrorMessageQueue.RemoveFromEventRequestListL(aWindow);}
+inline void TWindowServerEvent::RemoveFromModifierChangedEventList(const CWsWindowBase &aWindow)
+ {iModifierChangedQueue.RemoveFromEventRequestListL(aWindow);}
+inline void TWindowServerEvent::RemoveFromGroupChangeEventEventList(const CWsWindowBase &aWindow)
+ {iGroupChangedQueue.RemoveFromEventRequestListL(aWindow);}
+inline void TWindowServerEvent::RemoveFromFocusChangeEventEventList(const CWsWindowBase &aWindow)
+ {iFocusChangedQueue.RemoveFromEventRequestListL(aWindow);}
+inline void TWindowServerEvent::RemoveFromGroupListChangeEventEventList(const CWsWindowBase &aWindow)
+ {iGroupListChangedQueue.RemoveFromEventRequestListL(aWindow);}
+inline void TWindowServerEvent::RemoveFromScreenDeviceChangeEventList(const CWsWindowBase &aWindow)
+ {iScreenDeviceChangedQueue.RemoveFromEventRequestListL(aWindow);}
+inline TInt TWindowServerEvent::GetStoredModifierState()
+ {return(iModifierState);}
+
+#endif