1/*
2 * Copyright 2005-2007, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Axel Dörfler, axeld@pinc-software.de
7 */
8#ifndef EVENT_DISPATCHER_H
9#define EVENT_DISPATCHER_H
10
11
12#include <AutoDeleter.h>
13#include <Locker.h>
14#include <Message.h>
15#include <MessageFilter.h>
16#include <Messenger.h>
17#include <ObjectList.h>
18
19
20class Desktop;
21class EventStream;
22class HWInterface;
23class ServerBitmap;
24
25struct event_listener;
26
27
28class EventTarget {
29 public:
30 EventTarget();
31 ~EventTarget();
32
33 void SetTo(const BMessenger& messenger);
34 BMessenger& Messenger() { return fMessenger; }
35
36 event_listener* FindListener(int32 token, int32* _index = NULL);
37 bool AddListener(int32 token, uint32 eventMask, uint32 options,
38 bool temporary);
39 void RemoveListener(event_listener* listener, bool temporary);
40
41 bool RemoveListener(int32 token);
42 bool RemoveTemporaryListener(int32 token);
43 void RemoveTemporaryListeners();
44
45 bool IsEmpty() const { return fListeners.IsEmpty(); }
46
47 int32 CountListeners() const { return fListeners.CountItems(); }
48 event_listener* ListenerAt(int32 index) const
49 { return fListeners.ItemAt(index); }
50
51 private:
52 bool _RemoveTemporaryListener(event_listener* listener, int32 index);
53
54 BObjectList<event_listener> fListeners;
55 BMessenger fMessenger;
56};
57
58class EventFilter {
59 public:
60 virtual ~EventFilter() {};
61 virtual filter_result Filter(BMessage* event, EventTarget** _target,
62 int32* _viewToken = NULL, BMessage* latestMouseMoved = NULL) = 0;
63 virtual void RemoveTarget(EventTarget* target);
64};
65
66class EventDispatcher : public BLocker {
67 public:
68 EventDispatcher();
69 ~EventDispatcher();
70
71 status_t SetTo(EventStream* stream);
72 status_t InitCheck();
73
74 void RemoveTarget(EventTarget& target);
75
76 bool AddListener(EventTarget& target, int32 token,
77 uint32 eventMask, uint32 options);
78 bool AddTemporaryListener(EventTarget& target,
79 int32 token, uint32 eventMask, uint32 options);
80 void RemoveListener(EventTarget& target, int32 token);
81 void RemoveTemporaryListener(EventTarget& target, int32 token);
82
83 void SetMouseFilter(EventFilter* filter);
84 void SetKeyboardFilter(EventFilter* filter);
85
86 void GetMouse(BPoint& where, int32& buttons);
87 void SendFakeMouseMoved(EventTarget& target, int32 viewToken);
88 bigtime_t IdleTime();
89
90 bool HasCursorThread();
91 void SetHWInterface(HWInterface* interface);
92
93 void SetDragMessage(BMessage& message, ServerBitmap* bitmap,
94 const BPoint& offsetFromCursor);
95 // the message should be delivered on the next
96 // "mouse up".
97 // if the mouse is not pressed, it should
98 // be delivered to the "current" target right away.
99
100 void SetDesktop(Desktop* desktop);
101
102 private:
103 status_t _Run();
104 void _Unset();
105
106 void _SendFakeMouseMoved(BMessage* message);
107 bool _SendMessage(BMessenger& messenger, BMessage* message,
108 float importance);
109
110 bool _AddTokens(BMessage* message, EventTarget* target,
111 uint32 eventMask, BMessage* nextMouseMoved = NULL,
112 int32* _viewToken = NULL);
113 void _RemoveTokens(BMessage* message);
114 void _SetFeedFocus(BMessage* message);
115 void _UnsetFeedFocus(BMessage* message);
116
117 void _SetMouseTarget(const BMessenger* messenger);
118 void _UnsetLastMouseTarget();
119
120 bool _AddListener(EventTarget& target, int32 token,
121 uint32 eventMask, uint32 options, bool temporary);
122 void _RemoveTemporaryListeners();
123
124 void _DeliverDragMessage();
125
126 void _EventLoop();
127 void _CursorLoop();
128
129 static status_t _event_looper(void* dispatcher);
130 static status_t _cursor_looper(void* dispatcher);
131
132 private:
133 EventStream* fStream;
134 thread_id fThread;
135 thread_id fCursorThread;
136
137 EventTarget* fPreviousMouseTarget;
138 EventTarget* fFocus;
139 bool fSuspendFocus;
140
141 ObjectDeleter <EventFilter>
142 fMouseFilter;
143 ObjectDeleter<EventFilter>
144 fKeyboardFilter;
145
146 BObjectList<EventTarget> fTargets;
147
148 BMessage* fNextLatestMouseMoved;
149 BPoint fLastCursorPosition;
150 int32 fLastButtons;
151 bigtime_t fLastUpdate;
152
153 BMessage fDragMessage;
154 bool fDraggingMessage;
155 BPoint fDragOffset;
156
157 BLocker fCursorLock;
158 HWInterface* fHWInterface;
159 Desktop* fDesktop;
160};
161
162#endif /* EVENT_DISPATCHER_H */