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