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 73 // Screen and drawing related methods 74 75 Screen* ScreenAt(int32 index) const 76 { return fActiveScreen; } 77 Screen* ActiveScreen() const 78 { return fActiveScreen; } 79 80 CursorManager& GetCursorManager() { return fCursorManager; } 81 82 void SetCursor(ServerCursor* cursor); 83 ServerCursorReference Cursor() const; 84 void SetLastMouseState(const BPoint& position, 85 int32 buttons); 86 // for use by the mouse filter only 87 // both mouse position calls require 88 // the Desktop object to be locked 89 // already 90 void GetLastMouseState(BPoint* position, 91 int32* buttons) const; 92 // for use by ServerWindow 93 94 void ScreenChanged(Screen* screen, bool makeDefault); 95 96 void ScreenRemoved(Screen* screen) {} 97 void ScreenAdded(Screen* screen) {} 98 bool ReleaseScreen(Screen* screen) { return false; } 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 116 // Window methods 117 118 void ActivateWindow(Window* window); 119 void SendWindowBehind(Window* window, 120 Window* behindOf = NULL); 121 122 void ShowWindow(Window* window); 123 void HideWindow(Window* window); 124 125 void MoveWindowBy(Window* window, float x, float y, 126 int32 workspace = -1); 127 void ResizeWindowBy(Window* window, float x, 128 float y); 129 bool SetWindowTabLocation(Window* window, 130 float location); 131 bool SetWindowDecoratorSettings(Window* window, 132 const BMessage& settings); 133 134 void SetWindowWorkspaces(Window* window, 135 uint32 workspaces); 136 137 void AddWindow(Window* window); 138 void RemoveWindow(Window* window); 139 140 bool AddWindowToSubset(Window* subset, 141 Window* window); 142 void RemoveWindowFromSubset(Window* subset, 143 Window* window); 144 145 void SetWindowLook(Window* window, window_look look); 146 void SetWindowFeel(Window* window, window_feel feel); 147 void SetWindowFlags(Window* window, uint32 flags); 148 void SetWindowTitle(Window* window, 149 const char* title); 150 151 Window* FocusWindow() const { return fFocus; } 152 Window* FrontWindow() const { return fFront; } 153 Window* BackWindow() const { return fBack; } 154 155 Window* WindowAt(BPoint where); 156 157 Window* MouseEventWindow() const 158 { return fMouseEventWindow; } 159 void SetMouseEventWindow(Window* window); 160 161 void SetViewUnderMouse(const Window* window, 162 int32 viewToken); 163 int32 ViewUnderMouse(const Window* window); 164 165 void SetFocusWindow(Window* window = NULL); 166 EventTarget* KeyboardEventTarget(); 167 168 Window* FindWindowByClientToken(int32 token, 169 team_id teamID); 170 171 #if USE_MULTI_LOCKER 172 bool LockSingleWindow() 173 { return fWindowLock.ReadLock(); } 174 void UnlockSingleWindow() 175 { fWindowLock.ReadUnlock(); } 176 177 bool LockAllWindows() 178 { return fWindowLock.WriteLock(); } 179 void UnlockAllWindows() 180 { fWindowLock.WriteUnlock(); } 181 #else // USE_MULTI_LOCKER 182 bool LockSingleWindow() 183 { return fWindowLock.Lock(); } 184 void UnlockSingleWindow() 185 { fWindowLock.Unlock(); } 186 187 bool LockAllWindows() 188 { return fWindowLock.Lock(); } 189 void UnlockAllWindows() 190 { fWindowLock.Unlock(); } 191 #endif // USE_MULTI_LOCKER 192 193 void MarkDirty(BRegion& region); 194 void Redraw(); 195 196 BRegion& BackgroundRegion() 197 { return fBackgroundRegion; } 198 199 void RedrawBackground(); 200 void StoreWorkspaceConfiguration(int32 index); 201 202 void AddWorkspacesView(WorkspacesView* view); 203 void RemoveWorkspacesView(WorkspacesView* view); 204 205 void MinimizeApplication(team_id team); 206 void BringApplicationToFront(team_id team); 207 void WindowAction(int32 windowToken, int32 action); 208 209 void WriteWindowList(team_id team, 210 BPrivate::LinkSender& sender); 211 void WriteWindowInfo(int32 serverToken, 212 BPrivate::LinkSender& sender); 213 void WriteApplicationOrder(int32 workspace, 214 BPrivate::LinkSender& sender); 215 void WriteWindowOrder(int32 workspace, 216 BPrivate::LinkSender& sender); 217 218 private: 219 void _LaunchInputServer(); 220 void _SetWorkspace(int32 index); 221 void _ShowWindow(Window* window, 222 bool affectsOtherWindows = true); 223 void _HideWindow(Window* window); 224 225 void _UpdateSubsetWorkspaces(Window* window, 226 int32 previousIndex = -1, 227 int32 newIndex = -1); 228 void _ChangeWindowWorkspaces(Window* window, 229 uint32 oldWorkspaces, uint32 newWorkspaces); 230 void _BringWindowsToFront(WindowList& windows, 231 int32 list, bool wereVisible); 232 status_t _ActivateApp(team_id team); 233 void _SendFakeMouseMoved(Window* window = NULL); 234 235 void _RebuildClippingForAllWindows( 236 BRegion& stillAvailableOnScreen); 237 void _TriggerWindowRedrawing( 238 BRegion& newDirtyRegion); 239 void _SetBackground(BRegion& background); 240 241 void _UpdateFloating(int32 previousWorkspace = -1, 242 int32 nextWorkspace = -1, 243 Window* mouseEventWindow = NULL); 244 void _UpdateBack(); 245 void _UpdateFront(bool updateFloating = true); 246 void _UpdateFronts(bool updateFloating = true); 247 bool _WindowHasModal(Window* window); 248 249 void _WindowChanged(Window* window); 250 void _WindowRemoved(Window* window); 251 252 void _GetLooperName(char* name, size_t size); 253 void _PrepareQuit(); 254 void _DispatchMessage(int32 code, 255 BPrivate::LinkReceiver &link); 256 257 WindowList& _CurrentWindows(); 258 WindowList& _Windows(int32 index); 259 260 private: 261 friend class DesktopSettings; 262 friend class LockedDesktopSettings; 263 264 uid_t fUserID; 265 ::VirtualScreen fVirtualScreen; 266 DesktopSettingsPrivate* fSettings; 267 port_id fMessagePort; 268 ::EventDispatcher fEventDispatcher; 269 port_id fInputPort; 270 area_id fSharedReadOnlyArea; 271 server_read_only_memory* fServerReadOnlyMemory; 272 273 BLocker fApplicationsLock; 274 BObjectList<ServerApp> fApplications; 275 276 sem_id fShutdownSemaphore; 277 int32 fShutdownCount; 278 279 ::Workspace::Private fWorkspaces[kMaxWorkspaces]; 280 int32 fCurrentWorkspace; 281 282 WindowList fAllWindows; 283 WindowList fSubsetWindows; 284 WindowList fFocusList; 285 286 BObjectList<WorkspacesView> fWorkspacesViews; 287 BLocker fWorkspacesLock; 288 289 Screen* fActiveScreen; 290 291 CursorManager fCursorManager; 292 293 #if USE_MULTI_LOCKER 294 MultiLocker fWindowLock; 295 #else 296 BLocker fWindowLock; 297 #endif 298 299 BRegion fBackgroundRegion; 300 BRegion fScreenRegion; 301 302 Window* fMouseEventWindow; 303 const Window* fWindowUnderMouse; 304 int32 fViewUnderMouse; 305 BPoint fLastMousePosition; 306 int32 fLastMouseButtons; 307 308 Window* fFocus; 309 Window* fFront; 310 Window* fBack; 311 }; 312 313 #endif // DESKTOP_H 314