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