1 /* 2 * Copyright 2001-2006, 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 */ 10 #ifndef DESKTOP_H 11 #define DESKTOP_H 12 13 14 #include "CursorManager.h" 15 #include "EventDispatcher.h" 16 #include "ScreenManager.h" 17 #include "ServerScreen.h" 18 #include "VirtualScreen.h" 19 #include "DesktopSettings.h" 20 #include "MessageLooper.h" 21 #include "WindowList.h" 22 #include "Workspace.h" 23 #include "WorkspacePrivate.h" 24 25 #include <ObjectList.h> 26 27 #include <Autolock.h> 28 #include <InterfaceDefs.h> 29 #include <List.h> 30 #include <Menu.h> 31 #include <Region.h> 32 #include <Window.h> 33 34 #define USE_MULTI_LOCKER 1 35 36 #if USE_MULTI_LOCKER 37 # include "MultiLocker.h" 38 #else 39 # include <Locker.h> 40 #endif 41 42 class BMessage; 43 44 class DrawingEngine; 45 class HWInterface; 46 class ServerApp; 47 class WorkspacesLayer; 48 struct server_read_only_memory; 49 50 namespace BPrivate { 51 class LinkSender; 52 }; 53 54 class Desktop : public MessageLooper, public ScreenOwner { 55 public: 56 Desktop(uid_t userID); 57 virtual ~Desktop(); 58 59 status_t Init(); 60 61 uid_t UserID() const { return fUserID; } 62 virtual port_id MessagePort() const { return fMessagePort; } 63 area_id SharedReadOnlyArea() const { return fSharedReadOnlyArea; } 64 65 ::EventDispatcher& EventDispatcher() { return fEventDispatcher; } 66 67 void BroadcastToAllApps(int32 code); 68 69 // Screen and drawing related methods 70 71 Screen* ScreenAt(int32 index) const 72 { return fActiveScreen; } 73 Screen* ActiveScreen() const 74 { return fActiveScreen; } 75 76 CursorManager& GetCursorManager() { return fCursorManager; } 77 78 void SetCursor(ServerCursor* cursor); 79 ServerCursor* Cursor() const; 80 81 void ScreenChanged(Screen* screen, bool makeDefault); 82 83 void ScreenRemoved(Screen* screen) {} 84 void ScreenAdded(Screen* screen) {} 85 bool ReleaseScreen(Screen* screen) { return false; } 86 87 const ::VirtualScreen& VirtualScreen() const { return fVirtualScreen; } 88 DrawingEngine* GetDrawingEngine() const 89 { return fVirtualScreen.DrawingEngine(); } 90 ::HWInterface* HWInterface() const 91 { return fVirtualScreen.HWInterface(); } 92 93 // Workspace methods 94 95 void SetWorkspace(int32 index); 96 int32 CurrentWorkspace() 97 { return fCurrentWorkspace; } 98 Workspace::Private& WorkspaceAt(int32 index) 99 { return fWorkspaces[index]; } 100 status_t SetWorkspacesCount(int32 newCount); 101 102 // WindowLayer methods 103 104 void ActivateWindow(WindowLayer* window); 105 void SendWindowBehind(WindowLayer* window, 106 WindowLayer* behindOf = NULL); 107 108 void ShowWindow(WindowLayer* window); 109 void HideWindow(WindowLayer* window); 110 111 void MoveWindowBy(WindowLayer* window, float x, float y, 112 int32 workspace = -1); 113 void ResizeWindowBy(WindowLayer* window, float x, float y); 114 bool SetWindowTabLocation(WindowLayer* window, float location); 115 bool SetWindowDecoratorSettings(WindowLayer* window, 116 const BMessage& settings); 117 118 void SetWindowWorkspaces(WindowLayer* window, 119 uint32 workspaces); 120 121 void AddWindow(WindowLayer* window); 122 void RemoveWindow(WindowLayer* window); 123 124 bool AddWindowToSubset(WindowLayer* subset, 125 WindowLayer* window); 126 void RemoveWindowFromSubset(WindowLayer* subset, 127 WindowLayer* window); 128 129 void SetWindowLook(WindowLayer* window, window_look look); 130 void SetWindowFeel(WindowLayer* window, window_feel feel); 131 void SetWindowFlags(WindowLayer* window, uint32 flags); 132 void SetWindowTitle(WindowLayer* window, const char* title); 133 134 WindowLayer* FocusWindow() const { return fFocus; } 135 WindowLayer* FrontWindow() const { return fFront; } 136 WindowLayer* BackWindow() const { return fBack; } 137 138 WindowLayer* WindowAt(BPoint where); 139 140 WindowLayer* MouseEventWindow() const { return fMouseEventWindow; } 141 void SetMouseEventWindow(WindowLayer* window); 142 143 void SetViewUnderMouse(const WindowLayer* window, int32 viewToken); 144 int32 ViewUnderMouse(const WindowLayer* window); 145 146 void SetFocusWindow(WindowLayer* window); 147 EventTarget* KeyboardEventTarget(); 148 149 WindowLayer* FindWindowLayerByClientToken(int32 token, team_id teamID); 150 //WindowLayer* FindWindowLayerByServerToken(int32 token); 151 152 #if USE_MULTI_LOCKER 153 bool LockSingleWindow() { return fWindowLock.ReadLock(); } 154 void UnlockSingleWindow() { fWindowLock.ReadUnlock(); } 155 156 bool LockAllWindows() { return fWindowLock.WriteLock(); } 157 void UnlockAllWindows() { fWindowLock.WriteUnlock(); } 158 #else // USE_MULTI_LOCKER 159 bool LockSingleWindow() { return fWindowLock.Lock(); } 160 void UnlockSingleWindow() { fWindowLock.Unlock(); } 161 162 bool LockAllWindows() { return fWindowLock.Lock(); } 163 void UnlockAllWindows() { fWindowLock.Unlock(); } 164 #endif // USE_MULTI_LOCKER 165 166 void MarkDirty(BRegion& region); 167 168 BRegion& BackgroundRegion() 169 { return fBackgroundRegion; } 170 171 void RedrawBackground(); 172 void StoreWorkspaceConfiguration(int32 index); 173 174 void MinimizeApplication(team_id team); 175 void BringApplicationToFront(team_id team); 176 void WindowAction(int32 windowToken, int32 action); 177 178 void WriteWindowList(team_id team, 179 BPrivate::LinkSender& sender); 180 void WriteWindowInfo(int32 serverToken, 181 BPrivate::LinkSender& sender); 182 183 private: 184 void _LaunchInputServer(); 185 void _SetWorkspace(int32 index); 186 void _ShowWindow(WindowLayer* window, 187 bool affectsOtherWindows = true); 188 void _HideWindow(WindowLayer* window); 189 190 void _UpdateSubsetWorkspaces(WindowLayer* window, 191 int32 previousIndex = -1, 192 int32 newIndex = -1); 193 void _ChangeWindowWorkspaces(WindowLayer* window, 194 uint32 oldWorkspaces, uint32 newWorkspaces); 195 void _BringWindowsToFront(WindowList& windows, 196 int32 list, bool wereVisible); 197 status_t _ActivateApp(team_id team); 198 void _SendFakeMouseMoved(WindowLayer* window = NULL); 199 200 void _RebuildClippingForAllWindows(BRegion& stillAvailableOnScreen); 201 void _TriggerWindowRedrawing(BRegion& newDirtyRegion); 202 void _SetBackground(BRegion& background); 203 204 void _UpdateFloating(int32 previousWorkspace = -1, 205 int32 nextWorkspace = -1, 206 WindowLayer* mouseEventWindow = NULL); 207 void _UpdateBack(); 208 void _UpdateFront(bool updateFloating = true); 209 void _UpdateFronts(bool updateFloating = true); 210 bool _WindowHasModal(WindowLayer* window); 211 212 void _WindowChanged(WindowLayer* window); 213 214 void _GetLooperName(char* name, size_t size); 215 void _PrepareQuit(); 216 void _DispatchMessage(int32 code, 217 BPrivate::LinkReceiver &link); 218 219 WindowList& _CurrentWindows(); 220 WindowList& _Windows(int32 index); 221 222 private: 223 friend class DesktopSettings; 224 friend class LockedDesktopSettings; 225 226 uid_t fUserID; 227 ::VirtualScreen fVirtualScreen; 228 DesktopSettingsPrivate* fSettings; 229 port_id fMessagePort; 230 ::EventDispatcher fEventDispatcher; 231 port_id fInputPort; 232 area_id fSharedReadOnlyArea; 233 server_read_only_memory* fServerReadOnlyMemory; 234 235 BLocker fApplicationsLock; 236 BObjectList<ServerApp> fApplications; 237 238 sem_id fShutdownSemaphore; 239 int32 fShutdownCount; 240 241 ::Workspace::Private fWorkspaces[kMaxWorkspaces]; 242 int32 fCurrentWorkspace; 243 244 WindowList fAllWindows; 245 WindowList fSubsetWindows; 246 WorkspacesLayer* fWorkspacesLayer; 247 248 Screen* fActiveScreen; 249 250 CursorManager fCursorManager; 251 252 #if USE_MULTI_LOCKER 253 MultiLocker fWindowLock; 254 #else 255 BLocker fWindowLock; 256 #endif 257 258 BRegion fBackgroundRegion; 259 BRegion fScreenRegion; 260 261 bool fFocusFollowsMouse; 262 263 WindowLayer* fMouseEventWindow; 264 const WindowLayer* fWindowUnderMouse; 265 int32 fViewUnderMouse; 266 267 WindowLayer* fFocus; 268 WindowLayer* fFront; 269 WindowLayer* fBack; 270 }; 271 272 #endif // DESKTOP_H 273