2 * Copyright 2005-2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
6 * Axel Dörfler, axeld@pinc-software.de
8 #ifndef EVENT_DISPATCHER_H
9 #define EVENT_DISPATCHER_H
14 #include <MessageFilter.h>
15 #include <Messenger.h>
16 #include <ObjectList.h>
24 struct event_listener
;
32 void SetTo(const BMessenger
& messenger
);
33 BMessenger
& Messenger() { return fMessenger
; }
35 event_listener
* FindListener(int32 token
, int32
* _index
= NULL
);
36 bool AddListener(int32 token
, uint32 eventMask
, uint32 options
,
38 void RemoveListener(event_listener
* listener
, bool temporary
);
40 bool RemoveListener(int32 token
);
41 bool RemoveTemporaryListener(int32 token
);
42 void RemoveTemporaryListeners();
44 bool IsEmpty() const { return fListeners
.IsEmpty(); }
46 int32
CountListeners() const { return fListeners
.CountItems(); }
47 event_listener
* ListenerAt(int32 index
) const
48 { return fListeners
.ItemAt(index
); }
51 bool _RemoveTemporaryListener(event_listener
* listener
, int32 index
);
53 BObjectList
<event_listener
> fListeners
;
54 BMessenger fMessenger
;
59 virtual ~EventFilter() {};
60 virtual filter_result
Filter(BMessage
* event
, EventTarget
** _target
,
61 int32
* _viewToken
= NULL
, BMessage
* latestMouseMoved
= NULL
) = 0;
62 virtual void RemoveTarget(EventTarget
* target
);
65 class EventDispatcher
: public BLocker
{
70 status_t
SetTo(EventStream
* stream
);
73 void RemoveTarget(EventTarget
& target
);
75 bool AddListener(EventTarget
& target
, int32 token
,
76 uint32 eventMask
, uint32 options
);
77 bool AddTemporaryListener(EventTarget
& target
,
78 int32 token
, uint32 eventMask
, uint32 options
);
79 void RemoveListener(EventTarget
& target
, int32 token
);
80 void RemoveTemporaryListener(EventTarget
& target
, int32 token
);
82 void SetMouseFilter(EventFilter
* filter
);
83 void SetKeyboardFilter(EventFilter
* filter
);
85 void GetMouse(BPoint
& where
, int32
& buttons
);
86 void SendFakeMouseMoved(EventTarget
& target
, int32 viewToken
);
89 bool HasCursorThread();
90 void SetHWInterface(HWInterface
* interface
);
92 void SetDragMessage(BMessage
& message
, ServerBitmap
* bitmap
,
93 const BPoint
& offsetFromCursor
);
94 // the message should be delivered on the next
96 // if the mouse is not pressed, it should
97 // be delivered to the "current" target right away.
99 void SetDesktop(Desktop
* desktop
);
105 void _SendFakeMouseMoved(BMessage
* message
);
106 bool _SendMessage(BMessenger
& messenger
, BMessage
* message
,
109 bool _AddTokens(BMessage
* message
, EventTarget
* target
,
110 uint32 eventMask
, BMessage
* nextMouseMoved
= NULL
,
111 int32
* _viewToken
= NULL
);
112 void _RemoveTokens(BMessage
* message
);
113 void _SetFeedFocus(BMessage
* message
);
114 void _UnsetFeedFocus(BMessage
* message
);
116 void _SetMouseTarget(const BMessenger
* messenger
);
117 void _UnsetLastMouseTarget();
119 bool _AddListener(EventTarget
& target
, int32 token
,
120 uint32 eventMask
, uint32 options
, bool temporary
);
121 void _RemoveTemporaryListeners();
123 void _DeliverDragMessage();
128 static status_t
_event_looper(void* dispatcher
);
129 static status_t
_cursor_looper(void* dispatcher
);
132 EventStream
* fStream
;
134 thread_id fCursorThread
;
136 EventTarget
* fPreviousMouseTarget
;
140 EventFilter
* fMouseFilter
;
141 EventFilter
* fKeyboardFilter
;
143 BObjectList
<EventTarget
> fTargets
;
145 BMessage
* fNextLatestMouseMoved
;
146 BPoint fLastCursorPosition
;
148 bigtime_t fLastUpdate
;
150 BMessage fDragMessage
;
151 bool fDraggingMessage
;
153 ServerBitmap
* fDragBitmap
;
154 // NOTE: unfortunately, the EventDispatcher
155 // has to know what a ServerBitmap is...
156 // otherwise, linking the libs in the
157 // testenvironment is problematic, because
158 // the alternative is that HWInterface knows
159 // about BitmapManager
162 HWInterface
* fHWInterface
;
166 #endif /* EVENT_DISPATCHER_H */