xref: /haiku/src/servers/app/Desktop.h (revision 3dcbe9fc8879f2f88a0cd4fc57e504649a2362cd)
16a0a0a80SAxel Dörfler /*
2195e980eSAxel Dörfler  * Copyright 2001-2006, Haiku.
36a0a0a80SAxel Dörfler  * Distributed under the terms of the MIT License.
46a0a0a80SAxel Dörfler  *
56a0a0a80SAxel Dörfler  * Authors:
66a0a0a80SAxel Dörfler  *		Adrian Oanca <adioanca@cotty.iren.ro>
76a0a0a80SAxel Dörfler  *		Stephan Aßmus <superstippi@gmx.de>
86a0a0a80SAxel Dörfler  *		Axel Dörfler, axeld@pinc-software.de
96a0a0a80SAxel Dörfler  */
1027adb969SAxel Dörfler #ifndef DESKTOP_H
1127adb969SAxel Dörfler #define DESKTOP_H
1233bbe223SAxel Dörfler 
1308f35604SAxel Dörfler 
143ddebe7eSMichael Lotz #include "CursorManager.h"
1508f35604SAxel Dörfler #include "EventDispatcher.h"
16fd5bec1eSAxel Dörfler #include "ScreenManager.h"
17fd5bec1eSAxel Dörfler #include "ServerScreen.h"
18fd5bec1eSAxel Dörfler #include "VirtualScreen.h"
19ef8810f2SAxel Dörfler #include "DesktopSettings.h"
205f2edc0fSAxel Dörfler #include "MessageLooper.h"
21e83820edSAxel Dörfler #include "WindowList.h"
2227adb969SAxel Dörfler #include "Workspace.h"
235ca8477eSAxel Dörfler #include "WorkspacePrivate.h"
24fd5bec1eSAxel Dörfler 
25e83820edSAxel Dörfler #include <ObjectList.h>
26e83820edSAxel Dörfler 
27e83820edSAxel Dörfler #include <Autolock.h>
2833bbe223SAxel Dörfler #include <InterfaceDefs.h>
293dcb3b07SStephan Aßmus #include <List.h>
303dcb3b07SStephan Aßmus #include <Menu.h>
31e83820edSAxel Dörfler #include <Region.h>
3257be2866SAxel Dörfler #include <Window.h>
336a0a0a80SAxel Dörfler 
34e83820edSAxel Dörfler #define USE_MULTI_LOCKER 0
35e83820edSAxel Dörfler 
36e83820edSAxel Dörfler #if USE_MULTI_LOCKER
37e83820edSAxel Dörfler #  include "MultiLocker.h"
38e83820edSAxel Dörfler #else
39e83820edSAxel Dörfler #  include <Locker.h>
40e83820edSAxel Dörfler #endif
4133bbe223SAxel Dörfler 
423dcb3b07SStephan Aßmus class BMessage;
436a0a0a80SAxel Dörfler 
4458468dfeSStephan Aßmus class DrawingEngine;
453dcb3b07SStephan Aßmus class HWInterface;
46e83820edSAxel Dörfler class ServerApp;
47ce8c4d79SAxel Dörfler class WorkspacesLayer;
4833bbe223SAxel Dörfler 
496a0a0a80SAxel Dörfler namespace BPrivate {
506a0a0a80SAxel Dörfler 	class LinkSender;
516a0a0a80SAxel Dörfler };
526a0a0a80SAxel Dörfler 
535f2edc0fSAxel Dörfler class Desktop : public MessageLooper, public ScreenOwner {
5433bbe223SAxel Dörfler 	public:
5536deda69SAxel Dörfler 								Desktop(uid_t userID);
563dcb3b07SStephan Aßmus 		virtual					~Desktop();
573dcb3b07SStephan Aßmus 
583dcb3b07SStephan Aßmus 		void					Init();
5936deda69SAxel Dörfler 
6036deda69SAxel Dörfler 		uid_t					UserID() const { return fUserID; }
61770c05d6SAxel Dörfler 		virtual port_id			MessagePort() const { return fMessagePort; }
62770c05d6SAxel Dörfler 
63f7598223SAxel Dörfler 		::EventDispatcher&		EventDispatcher() { return fEventDispatcher; }
646c17d025SAxel Dörfler 
65770c05d6SAxel Dörfler 		void					BroadcastToAllApps(int32 code);
6633bbe223SAxel Dörfler 
6727adb969SAxel Dörfler 		// Screen and drawing related methods
6827adb969SAxel Dörfler 
6927adb969SAxel Dörfler 		Screen*					ScreenAt(int32 index) const
70fd5bec1eSAxel Dörfler 									{ return fActiveScreen; }
7127adb969SAxel Dörfler 		Screen*					ActiveScreen() const
7294fa2bd2SAdi Oanca 									{ return fActiveScreen; }
73e83820edSAxel Dörfler 
7427adb969SAxel Dörfler 		CursorManager&			GetCursorManager() { return fCursorManager; }
7533bbe223SAxel Dörfler 
76195e980eSAxel Dörfler 		void					SetCursor(ServerCursor* cursor);
77195e980eSAxel Dörfler 		ServerCursor*			Cursor() const;
78195e980eSAxel Dörfler 
798527f8ffSAxel Dörfler 		void					ScreenChanged(Screen* screen, bool makeDefault);
80df362433SAxel Dörfler 
8127adb969SAxel Dörfler 		void					ScreenRemoved(Screen* screen) {}
8227adb969SAxel Dörfler 		void					ScreenAdded(Screen* screen) {}
8327adb969SAxel Dörfler 		bool					ReleaseScreen(Screen* screen) { return false; }
843dcb3b07SStephan Aßmus 
85fd5bec1eSAxel Dörfler 		const ::VirtualScreen&	VirtualScreen() const { return fVirtualScreen; }
8627adb969SAxel Dörfler 		DrawingEngine*			GetDrawingEngine() const
8758468dfeSStephan Aßmus 									{ return fVirtualScreen.DrawingEngine(); }
8827adb969SAxel Dörfler 		::HWInterface*			HWInterface() const
89fd5bec1eSAxel Dörfler 									{ return fVirtualScreen.HWInterface(); }
9094fa2bd2SAdi Oanca 
9127adb969SAxel Dörfler 		// Workspace methods
9227adb969SAxel Dörfler 
9327adb969SAxel Dörfler 		void					SetWorkspace(int32 index);
9427adb969SAxel Dörfler 		int32					CurrentWorkspace()
9527adb969SAxel Dörfler 									{ return fCurrentWorkspace; }
965ca8477eSAxel Dörfler 		Workspace::Private&		WorkspaceAt(int32 index)
9727adb969SAxel Dörfler 									{ return fWorkspaces[index]; }
98e83820edSAxel Dörfler 		void					UpdateWorkspaces();
9927adb969SAxel Dörfler 
10027adb969SAxel Dörfler 		// WindowLayer methods
10127adb969SAxel Dörfler 
10227adb969SAxel Dörfler 		void					ActivateWindow(WindowLayer* window);
103e83820edSAxel Dörfler 		void					SendWindowBehind(WindowLayer* window,
104e83820edSAxel Dörfler 									WindowLayer* behindOf = NULL);
10527adb969SAxel Dörfler 
10615918e4fSAxel Dörfler 		void					ShowWindow(WindowLayer* window);
10715918e4fSAxel Dörfler 		void					HideWindow(WindowLayer* window);
10815918e4fSAxel Dörfler 
10919d801a6SAxel Dörfler 		void					MoveWindowBy(WindowLayer* window, float x, float y);
11019d801a6SAxel Dörfler 		void					ResizeWindowBy(WindowLayer* window, float x, float y);
11119d801a6SAxel Dörfler 
112a631158aSAxel Dörfler 		void					SetWindowWorkspaces(WindowLayer* window,
113a631158aSAxel Dörfler 									uint32 workspaces);
11427adb969SAxel Dörfler 
115a631158aSAxel Dörfler 		void					AddWindow(WindowLayer* window);
116a631158aSAxel Dörfler 		void					RemoveWindow(WindowLayer* window);
11757be2866SAxel Dörfler 
11834227d2cSAxel Dörfler 		bool					AddWindowToSubset(WindowLayer* subset,
11934227d2cSAxel Dörfler 									WindowLayer* window);
12034227d2cSAxel Dörfler 		void					RemoveWindowFromSubset(WindowLayer* subset,
12134227d2cSAxel Dörfler 									WindowLayer* window);
12234227d2cSAxel Dörfler 
12357be2866SAxel Dörfler 		void					SetWindowLook(WindowLayer* window, window_look look);
12457be2866SAxel Dörfler 		void					SetWindowFeel(WindowLayer* window, window_feel feel);
12557be2866SAxel Dörfler 		void					SetWindowFlags(WindowLayer* window, uint32 flags);
126939fb407SStephan Aßmus 		void					SetWindowTitle(WindowLayer* window, const char* title);
12733bbe223SAxel Dörfler 
128e83820edSAxel Dörfler 		WindowLayer*			FocusWindow() const { return fFocus; }
129e83820edSAxel Dörfler 		WindowLayer*			FrontWindow() const { return fFront; }
130e83820edSAxel Dörfler 		WindowLayer*			BackWindow() const { return fBack; }
131e83820edSAxel Dörfler 
132e83820edSAxel Dörfler 		WindowLayer*			WindowAt(BPoint where);
133e83820edSAxel Dörfler 
134e83820edSAxel Dörfler 		WindowLayer*			MouseEventWindow() const { return fMouseEventWindow; }
135e83820edSAxel Dörfler 		void					SetMouseEventWindow(WindowLayer* window);
136e83820edSAxel Dörfler 
137e83820edSAxel Dörfler 		void					SetFocusWindow(WindowLayer* window);
138e83820edSAxel Dörfler 
1394b813bf2SAxel Dörfler 		WindowLayer*			FindWindowLayerByClientToken(int32 token, team_id teamID);
1404b813bf2SAxel Dörfler 		//WindowLayer*			FindWindowLayerByServerToken(int32 token);
1416a0a0a80SAxel Dörfler 
142e83820edSAxel Dörfler #if USE_MULTI_LOCKER
14361fed21bSAxel Dörfler 		bool					LockSingleWindow() { return fWindowLock.ReadLock(); }
14461fed21bSAxel Dörfler 		void					UnlockSingleWindow() { fWindowLock.ReadUnlock(); }
145e83820edSAxel Dörfler 
14661fed21bSAxel Dörfler 		bool					LockAllWindows() { return fWindowLock.WriteLock(); }
14761fed21bSAxel Dörfler 		void					UnlockAllWindows() { fWindowLock.WriteUnlock(); }
148e83820edSAxel Dörfler #else // USE_MULTI_LOCKER
14961fed21bSAxel Dörfler 		bool					LockSingleWindow() { return fWindowLock.Lock(); }
15061fed21bSAxel Dörfler 		void					UnlockSingleWindow() { fWindowLock.Unlock(); }
151e83820edSAxel Dörfler 
15261fed21bSAxel Dörfler 		bool					LockAllWindows() { return fWindowLock.Lock(); }
15361fed21bSAxel Dörfler 		void					UnlockAllWindows() { fWindowLock.Unlock(); }
154e83820edSAxel Dörfler #endif // USE_MULTI_LOCKER
155e83820edSAxel Dörfler 
156e83820edSAxel Dörfler 		void					MarkDirty(BRegion& region);
157e83820edSAxel Dörfler 
158e83820edSAxel Dörfler 		BRegion&				BackgroundRegion()
159e83820edSAxel Dörfler 									{ return fBackgroundRegion; }
16033bbe223SAxel Dörfler 
161*3dcbe9fcSAxel Dörfler 		void					RedrawBackground();
162*3dcbe9fcSAxel Dörfler 
163f877af82SAxel Dörfler 		void					MinimizeApplication(team_id team);
164f877af82SAxel Dörfler 		void					BringApplicationToFront(team_id team);
165f877af82SAxel Dörfler 
16627adb969SAxel Dörfler 		void					WriteWindowList(team_id team,
16727adb969SAxel Dörfler 									BPrivate::LinkSender& sender);
16827adb969SAxel Dörfler 		void					WriteWindowInfo(int32 serverToken,
16927adb969SAxel Dörfler 									BPrivate::LinkSender& sender);
17033bbe223SAxel Dörfler 
17133bbe223SAxel Dörfler 	private:
172e83820edSAxel Dörfler 		void					_ShowWindow(WindowLayer* window,
173e83820edSAxel Dörfler 									bool affectsOtherWindows = true);
174e83820edSAxel Dörfler 		void					_HideWindow(WindowLayer* window);
175e83820edSAxel Dörfler 
17634227d2cSAxel Dörfler 		void					_UpdateSubsetWorkspaces(WindowLayer* window);
177a631158aSAxel Dörfler 		void					_ChangeWindowWorkspaces(WindowLayer* window,
178a631158aSAxel Dörfler 									uint32 oldWorkspaces, uint32 newWorkspaces);
179e83820edSAxel Dörfler 		void					_BringWindowsToFront(WindowList& windows,
180e83820edSAxel Dörfler 									int32 list, bool wereVisible);
18136deda69SAxel Dörfler  		status_t				_ActivateApp(team_id team);
182e83820edSAxel Dörfler 
183e83820edSAxel Dörfler 		void					_RebuildClippingForAllWindows(BRegion& stillAvailableOnScreen);
184e83820edSAxel Dörfler 		void					_TriggerWindowRedrawing(BRegion& newDirtyRegion);
185e83820edSAxel Dörfler 		void					_SetBackground(BRegion& background);
186e83820edSAxel Dörfler 
18734227d2cSAxel Dörfler 		void					_UpdateFloating(int32 previousWorkspace = -1,
18834227d2cSAxel Dörfler 									int32 nextWorkspace = -1);
189e83820edSAxel Dörfler 		void					_UpdateBack();
19034227d2cSAxel Dörfler 		void					_UpdateFront(bool updateFloating = true);
19134227d2cSAxel Dörfler 		void					_UpdateFronts(bool updateFloating = true);
19234227d2cSAxel Dörfler 		bool					_WindowHasModal(WindowLayer* window);
193e83820edSAxel Dörfler 
194ce8c4d79SAxel Dörfler 		void					_WindowChanged(WindowLayer* window);
195ce8c4d79SAxel Dörfler 
19627adb969SAxel Dörfler 		void					_GetLooperName(char* name, size_t size);
19727adb969SAxel Dörfler 		void					_PrepareQuit();
19827adb969SAxel Dörfler 		void					_DispatchMessage(int32 code,
19927adb969SAxel Dörfler 									BPrivate::LinkReceiver &link);
2005f2edc0fSAxel Dörfler 
201e83820edSAxel Dörfler 		WindowList&				_CurrentWindows();
20234227d2cSAxel Dörfler 		WindowList&				_Windows(int32 index);
203e83820edSAxel Dörfler 
2045f2edc0fSAxel Dörfler 	private:
205ef8810f2SAxel Dörfler 		friend class DesktopSettings;
206ef8810f2SAxel Dörfler 
20736deda69SAxel Dörfler 		uid_t					fUserID;
208fd5bec1eSAxel Dörfler 		::VirtualScreen			fVirtualScreen;
209ef8810f2SAxel Dörfler 		DesktopSettings::Private* fSettings;
2105f2edc0fSAxel Dörfler 		port_id					fMessagePort;
211f7598223SAxel Dörfler 		::EventDispatcher		fEventDispatcher;
2126c17d025SAxel Dörfler 		port_id					fInputPort;
213770c05d6SAxel Dörfler 
214e83820edSAxel Dörfler 		BLocker					fApplicationsLock;
215e83820edSAxel Dörfler 		BObjectList<ServerApp>	fApplications;
216770c05d6SAxel Dörfler 
217770c05d6SAxel Dörfler 		sem_id					fShutdownSemaphore;
218770c05d6SAxel Dörfler 		int32					fShutdownCount;
219770c05d6SAxel Dörfler 
2205ca8477eSAxel Dörfler 		::Workspace::Private	fWorkspaces[32];
22127adb969SAxel Dörfler 		int32					fCurrentWorkspace;
22227adb969SAxel Dörfler 
223e83820edSAxel Dörfler 		WindowList				fAllWindows;
22434227d2cSAxel Dörfler 		WindowList				fSubsetWindows;
225ce8c4d79SAxel Dörfler 		WorkspacesLayer*		fWorkspacesLayer;
22633bbe223SAxel Dörfler 
22733bbe223SAxel Dörfler 		Screen*					fActiveScreen;
2283ddebe7eSMichael Lotz 
2293ddebe7eSMichael Lotz 		CursorManager			fCursorManager;
230e83820edSAxel Dörfler 
231e83820edSAxel Dörfler #if USE_MULTI_LOCKER
232e83820edSAxel Dörfler 		MultiLocker				fWindowLock;
233e83820edSAxel Dörfler #else
234e83820edSAxel Dörfler 		BLocker					fWindowLock;
235e83820edSAxel Dörfler #endif
236e83820edSAxel Dörfler 
237e83820edSAxel Dörfler 		BRegion					fBackgroundRegion;
238e83820edSAxel Dörfler 		BRegion					fScreenRegion;
239e83820edSAxel Dörfler 
240e83820edSAxel Dörfler 		bool					fFocusFollowsMouse;
241e83820edSAxel Dörfler 
242e83820edSAxel Dörfler 		WindowLayer*			fMouseEventWindow;
243e83820edSAxel Dörfler 		WindowLayer*			fFocus;
244e83820edSAxel Dörfler 		WindowLayer*			fFront;
245e83820edSAxel Dörfler 		WindowLayer*			fBack;
24633bbe223SAxel Dörfler };
24733bbe223SAxel Dörfler 
24827adb969SAxel Dörfler #endif	// DESKTOP_H
249