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 0 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 49 namespace BPrivate { 50 class LinkSender; 51 }; 52 53 class Desktop : public MessageLooper, public ScreenOwner { 54 public: 55 Desktop(uid_t userID); 56 virtual ~Desktop(); 57 58 void Init(); 59 60 uid_t UserID() const { return fUserID; } 61 virtual port_id MessagePort() const { return fMessagePort; } 62 63 ::EventDispatcher& EventDispatcher() { return fEventDispatcher; } 64 65 void BroadcastToAllApps(int32 code); 66 67 // Screen and drawing related methods 68 69 Screen* ScreenAt(int32 index) const 70 { return fActiveScreen; } 71 Screen* ActiveScreen() const 72 { return fActiveScreen; } 73 74 CursorManager& GetCursorManager() { return fCursorManager; } 75 76 void SetCursor(ServerCursor* cursor); 77 ServerCursor* Cursor() const; 78 79 void ScreenChanged(Screen* screen, bool makeDefault); 80 81 void ScreenRemoved(Screen* screen) {} 82 void ScreenAdded(Screen* screen) {} 83 bool ReleaseScreen(Screen* screen) { return false; } 84 85 const ::VirtualScreen& VirtualScreen() const { return fVirtualScreen; } 86 DrawingEngine* GetDrawingEngine() const 87 { return fVirtualScreen.DrawingEngine(); } 88 ::HWInterface* HWInterface() const 89 { return fVirtualScreen.HWInterface(); } 90 91 // Workspace methods 92 93 void SetWorkspace(int32 index); 94 int32 CurrentWorkspace() 95 { return fCurrentWorkspace; } 96 Workspace::Private& WorkspaceAt(int32 index) 97 { return fWorkspaces[index]; } 98 void UpdateWorkspaces(); 99 100 // WindowLayer methods 101 102 void ActivateWindow(WindowLayer* window); 103 void SendWindowBehind(WindowLayer* window, 104 WindowLayer* behindOf = NULL); 105 106 void ShowWindow(WindowLayer* window); 107 void HideWindow(WindowLayer* window); 108 109 void MoveWindowBy(WindowLayer* window, float x, float y); 110 void ResizeWindowBy(WindowLayer* window, float x, float y); 111 112 void SetWindowWorkspaces(WindowLayer* window, 113 uint32 workspaces); 114 115 void AddWindow(WindowLayer* window); 116 void RemoveWindow(WindowLayer* window); 117 118 bool AddWindowToSubset(WindowLayer* subset, 119 WindowLayer* window); 120 void RemoveWindowFromSubset(WindowLayer* subset, 121 WindowLayer* window); 122 123 void SetWindowLook(WindowLayer* window, window_look look); 124 void SetWindowFeel(WindowLayer* window, window_feel feel); 125 void SetWindowFlags(WindowLayer* window, uint32 flags); 126 void SetWindowTitle(WindowLayer* window, const char* title); 127 128 WindowLayer* FocusWindow() const { return fFocus; } 129 WindowLayer* FrontWindow() const { return fFront; } 130 WindowLayer* BackWindow() const { return fBack; } 131 132 WindowLayer* WindowAt(BPoint where); 133 134 WindowLayer* MouseEventWindow() const { return fMouseEventWindow; } 135 void SetMouseEventWindow(WindowLayer* window); 136 137 void SetFocusWindow(WindowLayer* window); 138 139 WindowLayer* FindWindowLayerByClientToken(int32 token, team_id teamID); 140 //WindowLayer* FindWindowLayerByServerToken(int32 token); 141 142 #if USE_MULTI_LOCKER 143 bool LockSingleWindow() { return fWindowLock.ReadLock(); } 144 void UnlockSingleWindow() { fWindowLock.ReadUnlock(); } 145 146 bool LockAllWindows() { return fWindowLock.WriteLock(); } 147 void UnlockAllWindows() { fWindowLock.WriteUnlock(); } 148 #else // USE_MULTI_LOCKER 149 bool LockSingleWindow() { return fWindowLock.Lock(); } 150 void UnlockSingleWindow() { fWindowLock.Unlock(); } 151 152 bool LockAllWindows() { return fWindowLock.Lock(); } 153 void UnlockAllWindows() { fWindowLock.Unlock(); } 154 #endif // USE_MULTI_LOCKER 155 156 void MarkDirty(BRegion& region); 157 158 BRegion& BackgroundRegion() 159 { return fBackgroundRegion; } 160 161 void RedrawBackground(); 162 163 void MinimizeApplication(team_id team); 164 void BringApplicationToFront(team_id team); 165 void WindowAction(int32 windowToken, int32 action); 166 167 void WriteWindowList(team_id team, 168 BPrivate::LinkSender& sender); 169 void WriteWindowInfo(int32 serverToken, 170 BPrivate::LinkSender& sender); 171 172 private: 173 void _ShowWindow(WindowLayer* window, 174 bool affectsOtherWindows = true); 175 void _HideWindow(WindowLayer* window); 176 177 void _UpdateSubsetWorkspaces(WindowLayer* window); 178 void _ChangeWindowWorkspaces(WindowLayer* window, 179 uint32 oldWorkspaces, uint32 newWorkspaces); 180 void _BringWindowsToFront(WindowList& windows, 181 int32 list, bool wereVisible); 182 status_t _ActivateApp(team_id team); 183 184 void _RebuildClippingForAllWindows(BRegion& stillAvailableOnScreen); 185 void _TriggerWindowRedrawing(BRegion& newDirtyRegion); 186 void _SetBackground(BRegion& background); 187 188 void _UpdateFloating(int32 previousWorkspace = -1, 189 int32 nextWorkspace = -1); 190 void _UpdateBack(); 191 void _UpdateFront(bool updateFloating = true); 192 void _UpdateFronts(bool updateFloating = true); 193 bool _WindowHasModal(WindowLayer* window); 194 195 void _WindowChanged(WindowLayer* window); 196 197 void _GetLooperName(char* name, size_t size); 198 void _PrepareQuit(); 199 void _DispatchMessage(int32 code, 200 BPrivate::LinkReceiver &link); 201 202 WindowList& _CurrentWindows(); 203 WindowList& _Windows(int32 index); 204 205 private: 206 friend class DesktopSettings; 207 208 uid_t fUserID; 209 ::VirtualScreen fVirtualScreen; 210 DesktopSettings::Private* fSettings; 211 port_id fMessagePort; 212 ::EventDispatcher fEventDispatcher; 213 port_id fInputPort; 214 215 BLocker fApplicationsLock; 216 BObjectList<ServerApp> fApplications; 217 218 sem_id fShutdownSemaphore; 219 int32 fShutdownCount; 220 221 ::Workspace::Private fWorkspaces[32]; 222 int32 fCurrentWorkspace; 223 224 WindowList fAllWindows; 225 WindowList fSubsetWindows; 226 WorkspacesLayer* fWorkspacesLayer; 227 228 Screen* fActiveScreen; 229 230 CursorManager fCursorManager; 231 232 #if USE_MULTI_LOCKER 233 MultiLocker fWindowLock; 234 #else 235 BLocker fWindowLock; 236 #endif 237 238 BRegion fBackgroundRegion; 239 BRegion fScreenRegion; 240 241 bool fFocusFollowsMouse; 242 243 WindowLayer* fMouseEventWindow; 244 WindowLayer* fFocus; 245 WindowLayer* fFront; 246 WindowLayer* fBack; 247 }; 248 249 #endif // DESKTOP_H 250