xref: /haiku/src/servers/app/DesktopListener.cpp (revision 32a2294fdc40a8ef9e3360aa85d0b7efb0c930b9)
1 /*
2  * Copyright 2010, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Clemens Zeidler <haiku@clemens-zeidler.de>
7  */
8 
9 
10 #include "DesktopListener.h"
11 
12 
13 DesktopListener::~DesktopListener()
14 {
15 
16 }
17 
18 
19 DesktopObservable::DesktopObservable()
20 	:
21 	fWeAreInvoking(false)
22 {
23 
24 }
25 
26 
27 void
28 DesktopObservable::RegisterListener(DesktopListener* listener, Desktop* desktop)
29 {
30 	fDesktopListenerList.Add(listener);
31 	listener->ListenerRegistered(desktop);
32 }
33 
34 
35 void
36 DesktopObservable::UnregisterListener(DesktopListener* listener)
37 {
38 	fDesktopListenerList.Remove(listener);
39 	listener->ListenerUnregistered();
40 }
41 
42 
43 const DesktopListenerDLList&
44 DesktopObservable::GetDesktopListenerList()
45 {
46 	return fDesktopListenerList;
47 }
48 
49 
50 bool
51 DesktopObservable::MessageForListener(Window* sender,
52 	BPrivate::ServerLink& link)
53 {
54 	int32 identifier;
55 	link.Read<int32>(&identifier);
56 	for (DesktopListener* listener = fDesktopListenerList.First();
57 		listener != NULL; listener = fDesktopListenerList.GetNext(listener)) {
58 		if (listener->Identifier() == identifier) {
59 			if (!listener->HandleMessage(sender, link))
60 				break;
61 			return true;
62 		}
63 	}
64 	return false;
65 }
66 
67 
68 void
69 DesktopObservable::NotifyWindowAdded(Window* window)
70 {
71 	if (fWeAreInvoking)
72 		return;
73 	InvokeGuard invokeGuard(fWeAreInvoking);
74 
75 	for (DesktopListener* listener = fDesktopListenerList.First();
76 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
77 		listener->WindowAdded(window);
78 }
79 
80 
81 void
82 DesktopObservable::NotifyWindowRemoved(Window* window)
83 {
84 	if (fWeAreInvoking)
85 		return;
86 	InvokeGuard invokeGuard(fWeAreInvoking);
87 
88 	for (DesktopListener* listener = fDesktopListenerList.First();
89 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
90 		listener->WindowRemoved(window);
91 }
92 
93 
94 void
95 DesktopObservable::NotifyKeyPressed(uint32 what, int32 key, int32 modifiers)
96 {
97 	if (fWeAreInvoking)
98 		return;
99 	InvokeGuard invokeGuard(fWeAreInvoking);
100 
101 	for (DesktopListener* listener = fDesktopListenerList.First();
102 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
103 		listener->KeyPressed(what, key, modifiers);
104 }
105 
106 
107 void
108 DesktopObservable::NotifyMouseEvent(BMessage* message)
109 {
110 	if (fWeAreInvoking)
111 		return;
112 	InvokeGuard invokeGuard(fWeAreInvoking);
113 
114 	for (DesktopListener* listener = fDesktopListenerList.First();
115 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
116 		listener->MouseEvent(message);
117 }
118 
119 
120 void
121 DesktopObservable::NotifyMouseDown(Window* window, BMessage* message,
122 	const BPoint& where)
123 {
124 	if (fWeAreInvoking)
125 		return;
126 	InvokeGuard invokeGuard(fWeAreInvoking);
127 
128 	for (DesktopListener* listener = fDesktopListenerList.First();
129 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
130 		listener->MouseDown(window, message, where);
131 }
132 
133 
134 void
135 DesktopObservable::NotifyMouseUp(Window* window, BMessage* message,
136 	const BPoint& where)
137 {
138 	if (fWeAreInvoking)
139 		return;
140 	InvokeGuard invokeGuard(fWeAreInvoking);
141 
142 	for (DesktopListener* listener = fDesktopListenerList.First();
143 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
144 		listener->MouseUp(window, message, where);
145 }
146 
147 
148 void
149 DesktopObservable::NotifyMouseMoved(Window* window, BMessage* message,
150 	const BPoint& where)
151 {
152 	if (fWeAreInvoking)
153 		return;
154 	InvokeGuard invokeGuard(fWeAreInvoking);
155 
156 	for (DesktopListener* listener = fDesktopListenerList.First();
157 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
158 		listener->MouseMoved(window, message, where);
159 }
160 
161 
162 void
163 DesktopObservable::NotifyWindowMoved(Window* window)
164 {
165 	if (fWeAreInvoking)
166 		return;
167 	InvokeGuard invokeGuard(fWeAreInvoking);
168 
169 	for (DesktopListener* listener = fDesktopListenerList.First();
170 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
171 		listener->WindowMoved(window);
172 }
173 
174 
175 void
176 DesktopObservable::NotifyWindowResized(Window* window)
177 {
178 	if (fWeAreInvoking)
179 		return;
180 	InvokeGuard invokeGuard(fWeAreInvoking);
181 
182 	for (DesktopListener* listener = fDesktopListenerList.First();
183 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
184 		listener->WindowResized(window);
185 }
186 
187 
188 void
189 DesktopObservable::NotifyWindowActitvated(Window* window)
190 {
191 	if (fWeAreInvoking)
192 		return;
193 	InvokeGuard invokeGuard(fWeAreInvoking);
194 
195 	for (DesktopListener* listener = fDesktopListenerList.First();
196 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
197 		listener->WindowActitvated(window);
198 }
199 
200 
201 void
202 DesktopObservable::NotifyWindowSentBehind(Window* window, Window* behindOf)
203 {
204 	if (fWeAreInvoking)
205 		return;
206 	InvokeGuard invokeGuard(fWeAreInvoking);
207 
208 	for (DesktopListener* listener = fDesktopListenerList.First();
209 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
210 		listener->WindowSentBehind(window, behindOf);
211 }
212 
213 
214 void
215 DesktopObservable::NotifyWindowWorkspacesChanged(Window* window,
216 	uint32 workspaces)
217 {
218 	if (fWeAreInvoking)
219 		return;
220 	InvokeGuard invokeGuard(fWeAreInvoking);
221 
222 	for (DesktopListener* listener = fDesktopListenerList.First();
223 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
224 		listener->WindowWorkspacesChanged(window, workspaces);
225 }
226 
227 
228 void
229 DesktopObservable::NotifyWindowMinimized(Window* window, bool minimize)
230 {
231 	if (fWeAreInvoking)
232 		return;
233 	InvokeGuard invokeGuard(fWeAreInvoking);
234 
235 	for (DesktopListener* listener = fDesktopListenerList.First();
236 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
237 		listener->WindowMinimized(window, minimize);
238 }
239 
240 
241 void
242 DesktopObservable::NotifyWindowTabLocationChanged(Window* window,
243 	float location)
244 {
245 	if (fWeAreInvoking)
246 		return;
247 	InvokeGuard invokeGuard(fWeAreInvoking);
248 
249 	for (DesktopListener* listener = fDesktopListenerList.First();
250 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
251 		listener->WindowTabLocationChanged(window, location);
252 }
253 
254 
255 bool
256 DesktopObservable::SetDecoratorSettings(Window* window,
257 	const BMessage& settings)
258 {
259 	if (fWeAreInvoking)
260 		return false;
261 	InvokeGuard invokeGuard(fWeAreInvoking);
262 
263 	bool changed = false;
264 	for (DesktopListener* listener = fDesktopListenerList.First();
265 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
266 		changed = changed | listener->SetDecoratorSettings(window, settings);
267 
268 	return changed;
269 }
270 
271 
272 void
273 DesktopObservable::GetDecoratorSettings(Window* window, BMessage& settings)
274 {
275 	if (fWeAreInvoking)
276 		return;
277 	InvokeGuard invokeGuard(fWeAreInvoking);
278 
279 	for (DesktopListener* listener = fDesktopListenerList.First();
280 		listener != NULL; listener = fDesktopListenerList.GetNext(listener))
281 		listener->GetDecoratorSettings(window, settings);
282 }
283 
284 
285 DesktopObservable::InvokeGuard::InvokeGuard(bool& invoking)
286 	:
287 	fInvoking(invoking)
288 {
289 	fInvoking = true;
290 }
291 
292 
293 DesktopObservable::InvokeGuard::~InvokeGuard()
294 {
295 	fInvoking = false;
296 }
297