1 /* 2 * Copyright 2001-2008, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Adrian Oanca <adioanca@cotty.iren.ro> 7 * Stephan Aßmus <superstippi@gmx.de> 8 * Axel Dörfler, axeld@pinc-software.de 9 * Andrej Spielmann, <andrej.spielmann@seh.ox.ac.uk> 10 */ 11 #ifndef DESKTOP_H 12 #define DESKTOP_H 13 14 15 #include "CursorManager.h" 16 #include "DesktopSettings.h" 17 #include "EventDispatcher.h" 18 #include "MessageLooper.h" 19 #include "Screen.h" 20 #include "ScreenManager.h" 21 #include "ServerCursor.h" 22 #include "VirtualScreen.h" 23 #include "WindowList.h" 24 #include "Workspace.h" 25 #include "WorkspacePrivate.h" 26 27 #include <ObjectList.h> 28 29 #include <Autolock.h> 30 #include <InterfaceDefs.h> 31 #include <List.h> 32 #include <Menu.h> 33 #include <Region.h> 34 #include <Window.h> 35 36 #define USE_MULTI_LOCKER 1 37 38 #if USE_MULTI_LOCKER 39 # include "MultiLocker.h" 40 #else 41 # include <Locker.h> 42 #endif 43 44 class BMessage; 45 46 class DrawingEngine; 47 class HWInterface; 48 class ServerApp; 49 class Window; 50 class WorkspacesView; 51 struct server_read_only_memory; 52 53 namespace BPrivate { 54 class LinkSender; 55 }; 56 57 class Desktop : public MessageLooper, public ScreenOwner { 58 public: 59 Desktop(uid_t userID); 60 virtual ~Desktop(); 61 62 status_t Init(); 63 64 uid_t UserID() const { return fUserID; } 65 virtual port_id MessagePort() const { return fMessagePort; } 66 area_id SharedReadOnlyArea() const 67 { return fSharedReadOnlyArea; } 68 69 ::EventDispatcher& EventDispatcher() { return fEventDispatcher; } 70 71 void BroadcastToAllApps(int32 code); 72 void BroadcastToAllWindows(int32 code); 73 74 // Screen and drawing related methods 75 76 Screen* ScreenAt(int32 index) const 77 { return fActiveScreen; } 78 Screen* ActiveScreen() const 79 { return fActiveScreen; } 80 81 CursorManager& GetCursorManager() { return fCursorManager; } 82 83 void SetCursor(ServerCursor* cursor); 84 ServerCursorReference Cursor() const; 85 void SetLastMouseState(const BPoint& position, 86 int32 buttons, Window* windowUnderMouse); 87 // for use by the mouse filter only 88 // both mouse position calls require 89 // the Desktop object to be locked 90 // already 91 void GetLastMouseState(BPoint* position, 92 int32* buttons) const; 93 // for use by ServerWindow 94 void ScreenChanged(Screen* screen, bool makeDefault); 95 void ScreenRemoved(Screen* screen) {} 96 void ScreenAdded(Screen* screen) {} 97 bool ReleaseScreen(Screen* screen) { return false; } 98 status_t StoreConfiguration(int32 workspace); 99 100 const ::VirtualScreen& VirtualScreen() const { return fVirtualScreen; } 101 DrawingEngine* GetDrawingEngine() const 102 { return fVirtualScreen.DrawingEngine(); } 103 ::HWInterface* HWInterface() const 104 { return fVirtualScreen.HWInterface(); } 105 106 // Workspace methods 107 108 void SetWorkspaceAsync(int32 index); 109 void SetWorkspace(int32 index); 110 int32 CurrentWorkspace() 111 { return fCurrentWorkspace; } 112 Workspace::Private& WorkspaceAt(int32 index) 113 { return fWorkspaces[index]; } 114 status_t SetWorkspacesCount(int32 newCount); 115 BRect WorkspaceFrame(int32 index) const; 116 117 // Window methods 118 119 void ActivateWindow(Window* window); 120 void SendWindowBehind(Window* window, 121 Window* behindOf = NULL); 122 123 void ShowWindow(Window* window); 124 void HideWindow(Window* window); 125 126 void MoveWindowBy(Window* window, float x, float y, 127 int32 workspace = -1); 128 void ResizeWindowBy(Window* window, float x, 129 float y); 130 bool SetWindowTabLocation(Window* window, 131 float location); 132 bool SetWindowDecoratorSettings(Window* window, 133 const BMessage& settings); 134 135 void SetWindowWorkspaces(Window* window, 136 uint32 workspaces); 137 138 void AddWindow(Window* window); 139 void RemoveWindow(Window* window); 140 141 bool AddWindowToSubset(Window* subset, 142 Window* window); 143 void RemoveWindowFromSubset(Window* subset, 144 Window* window); 145 146 void FontsChanged(Window* window); 147 148 void SetWindowLook(Window* window, window_look look); 149 void SetWindowFeel(Window* window, window_feel feel); 150 void SetWindowFlags(Window* window, uint32 flags); 151 void SetWindowTitle(Window* window, 152 const char* title); 153 154 Window* FocusWindow() const { return fFocus; } 155 Window* FrontWindow() const { return fFront; } 156 Window* BackWindow() const { return fBack; } 157 158 Window* WindowAt(BPoint where); 159 160 Window* MouseEventWindow() const 161 { return fMouseEventWindow; } 162 void SetMouseEventWindow(Window* window); 163 164 void SetViewUnderMouse(const Window* window, 165 int32 viewToken); 166 int32 ViewUnderMouse(const Window* window); 167 168 void SetFocusWindow(Window* window = NULL); 169 EventTarget* KeyboardEventTarget(); 170 void SetFocusLocked(const Window* window); 171 172 Window* FindWindowByClientToken(int32 token, 173 team_id teamID); 174 EventTarget* FindTarget(BMessenger& messenger); 175 176 #if USE_MULTI_LOCKER 177 bool LockSingleWindow() 178 { return fWindowLock.ReadLock(); } 179 void UnlockSingleWindow() 180 { fWindowLock.ReadUnlock(); } 181 182 bool LockAllWindows() 183 { return fWindowLock.WriteLock(); } 184 void UnlockAllWindows() 185 { fWindowLock.WriteUnlock(); } 186 #else // USE_MULTI_LOCKER 187 bool LockSingleWindow() 188 { return fWindowLock.Lock(); } 189 void UnlockSingleWindow() 190 { fWindowLock.Unlock(); } 191 192 bool LockAllWindows() 193 { return fWindowLock.Lock(); } 194 void UnlockAllWindows() 195 { fWindowLock.Unlock(); } 196 #endif // USE_MULTI_LOCKER 197 198 void MarkDirty(BRegion& region); 199 void Redraw(); 200 201 BRegion& BackgroundRegion() 202 { return fBackgroundRegion; } 203 204 void RedrawBackground(); 205 void StoreWorkspaceConfiguration(int32 index); 206 207 void AddWorkspacesView(WorkspacesView* view); 208 void RemoveWorkspacesView(WorkspacesView* view); 209 210 void MinimizeApplication(team_id team); 211 void BringApplicationToFront(team_id team); 212 void WindowAction(int32 windowToken, int32 action); 213 214 void WriteWindowList(team_id team, 215 BPrivate::LinkSender& sender); 216 void WriteWindowInfo(int32 serverToken, 217 BPrivate::LinkSender& sender); 218 void WriteApplicationOrder(int32 workspace, 219 BPrivate::LinkSender& sender); 220 void WriteWindowOrder(int32 workspace, 221 BPrivate::LinkSender& sender); 222 223 private: 224 void _LaunchInputServer(); 225 void _SetWorkspace(int32 index); 226 void _ShowWindow(Window* window, 227 bool affectsOtherWindows = true); 228 void _HideWindow(Window* window); 229 230 void _UpdateSubsetWorkspaces(Window* window, 231 int32 previousIndex = -1, 232 int32 newIndex = -1); 233 void _ChangeWindowWorkspaces(Window* window, 234 uint32 oldWorkspaces, uint32 newWorkspaces); 235 void _BringWindowsToFront(WindowList& windows, 236 int32 list, bool wereVisible); 237 Window* _LastFocusSubsetWindow(Window* window); 238 status_t _ActivateApp(team_id team); 239 void _SendFakeMouseMoved(Window* window = NULL); 240 241 void _RebuildClippingForAllWindows( 242 BRegion& stillAvailableOnScreen); 243 void _TriggerWindowRedrawing( 244 BRegion& newDirtyRegion); 245 void _SetBackground(BRegion& background); 246 void _RebuildAndRedrawAfterWindowChange( 247 Window* window, BRegion& dirty); 248 249 void _UpdateFloating(int32 previousWorkspace = -1, 250 int32 nextWorkspace = -1, 251 Window* mouseEventWindow = NULL); 252 void _UpdateBack(); 253 void _UpdateFront(bool updateFloating = true); 254 void _UpdateFronts(bool updateFloating = true); 255 bool _WindowHasModal(Window* window); 256 257 void _WindowChanged(Window* window); 258 void _WindowRemoved(Window* window); 259 260 void _GetLooperName(char* name, size_t size); 261 void _PrepareQuit(); 262 void _DispatchMessage(int32 code, 263 BPrivate::LinkReceiver &link); 264 265 WindowList& _CurrentWindows(); 266 WindowList& _Windows(int32 index); 267 268 private: 269 friend class DesktopSettings; 270 friend class LockedDesktopSettings; 271 272 uid_t fUserID; 273 ::VirtualScreen fVirtualScreen; 274 DesktopSettingsPrivate* fSettings; 275 port_id fMessagePort; 276 ::EventDispatcher fEventDispatcher; 277 port_id fInputPort; 278 area_id fSharedReadOnlyArea; 279 server_read_only_memory* fServerReadOnlyMemory; 280 281 BLocker fApplicationsLock; 282 BObjectList<ServerApp> fApplications; 283 284 sem_id fShutdownSemaphore; 285 int32 fShutdownCount; 286 287 ::Workspace::Private fWorkspaces[kMaxWorkspaces]; 288 int32 fCurrentWorkspace; 289 int32 fPreviousWorkspace; 290 291 WindowList fAllWindows; 292 WindowList fSubsetWindows; 293 WindowList fFocusList; 294 295 BObjectList<WorkspacesView> fWorkspacesViews; 296 BLocker fWorkspacesLock; 297 298 Screen* fActiveScreen; 299 300 CursorManager fCursorManager; 301 302 #if USE_MULTI_LOCKER 303 MultiLocker fWindowLock; 304 #else 305 BLocker fWindowLock; 306 #endif 307 308 BRegion fBackgroundRegion; 309 BRegion fScreenRegion; 310 311 Window* fMouseEventWindow; 312 const Window* fWindowUnderMouse; 313 const Window* fLockedFocusWindow; 314 int32 fViewUnderMouse; 315 BPoint fLastMousePosition; 316 int32 fLastMouseButtons; 317 318 Window* fFocus; 319 Window* fFront; 320 Window* fBack; 321 }; 322 323 #endif // DESKTOP_H 324