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