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