headers/bsd: Add sys/queue.h.
[haiku.git] / src / servers / app / EventDispatcher.h
blobaff524b6a94c15fa6d4a13a0a7df695f86662283
1 /*
2 * Copyright 2005-2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Axel Dörfler, axeld@pinc-software.de
7 */
8 #ifndef EVENT_DISPATCHER_H
9 #define EVENT_DISPATCHER_H
12 #include <Locker.h>
13 #include <Message.h>
14 #include <MessageFilter.h>
15 #include <Messenger.h>
16 #include <ObjectList.h>
19 class Desktop;
20 class EventStream;
21 class HWInterface;
22 class ServerBitmap;
24 struct event_listener;
27 class EventTarget {
28 public:
29 EventTarget();
30 ~EventTarget();
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,
37 bool temporary);
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); }
50 private:
51 bool _RemoveTemporaryListener(event_listener* listener, int32 index);
53 BObjectList<event_listener> fListeners;
54 BMessenger fMessenger;
57 class EventFilter {
58 public:
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 {
66 public:
67 EventDispatcher();
68 ~EventDispatcher();
70 status_t SetTo(EventStream* stream);
71 status_t InitCheck();
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);
87 bigtime_t IdleTime();
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
95 // "mouse up".
96 // if the mouse is not pressed, it should
97 // be delivered to the "current" target right away.
99 void SetDesktop(Desktop* desktop);
101 private:
102 status_t _Run();
103 void _Unset();
105 void _SendFakeMouseMoved(BMessage* message);
106 bool _SendMessage(BMessenger& messenger, BMessage* message,
107 float importance);
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();
125 void _EventLoop();
126 void _CursorLoop();
128 static status_t _event_looper(void* dispatcher);
129 static status_t _cursor_looper(void* dispatcher);
131 private:
132 EventStream* fStream;
133 thread_id fThread;
134 thread_id fCursorThread;
136 EventTarget* fPreviousMouseTarget;
137 EventTarget* fFocus;
138 bool fSuspendFocus;
140 EventFilter* fMouseFilter;
141 EventFilter* fKeyboardFilter;
143 BObjectList<EventTarget> fTargets;
145 BMessage* fNextLatestMouseMoved;
146 BPoint fLastCursorPosition;
147 int32 fLastButtons;
148 bigtime_t fLastUpdate;
150 BMessage fDragMessage;
151 bool fDraggingMessage;
152 BPoint fDragOffset;
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
161 BLocker fCursorLock;
162 HWInterface* fHWInterface;
163 Desktop* fDesktop;
166 #endif /* EVENT_DISPATCHER_H */