xref: /haiku/src/servers/app/Desktop.h (revision 90200dfec13f22e03b6a5572c51b8ba63c0c5bb0)
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