xref: /haiku/src/servers/app/Desktop.h (revision 2ae568931fcac7deb9f1e6ff4e47213fbfe4029b)
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 
22 #include <InterfaceDefs.h>
23 #include <List.h>
24 #include <Locker.h>
25 #include <Menu.h>
26 #include <Autolock.h>
27 #include <ObjectList.h>
28 
29 
30 class BMessage;
31 
32 class DrawingEngine;
33 class HWInterface;
34 class Layer;
35 class RootLayer;
36 class WindowLayer;
37 
38 namespace BPrivate {
39 	class LinkSender;
40 };
41 
42 
43 class Desktop : public MessageLooper, public ScreenOwner {
44  public:
45 	// startup methods
46 								Desktop(uid_t userID);
47 	virtual						~Desktop();
48 
49 			void				Init();
50 
51 			uid_t				UserID() const { return fUserID; }
52 	virtual port_id				MessagePort() const { return fMessagePort; }
53 
54 			::EventDispatcher&	EventDispatcher() { return fEventDispatcher; }
55 
56 			void				BroadcastToAllApps(int32 code);
57 
58 	// Methods for multiple monitors.
59 	inline	Screen*				ScreenAt(int32 index) const
60 									{ return fActiveScreen; }
61 	inline	Screen*				ActiveScreen() const
62 									{ return fActiveScreen; }
63 	inline	::RootLayer*		RootLayer() const { return fRootLayer; }
64 	inline	CursorManager&		GetCursorManager() { return fCursorManager; }
65 
66 			void				ScreenChanged(Screen* screen);
67 
68 	virtual void				ScreenRemoved(Screen* screen) {}
69 	virtual void				ScreenAdded(Screen* screen) {}
70 	virtual bool				ReleaseScreen(Screen* screen) { return false; }
71 
72 	const	::VirtualScreen&	VirtualScreen() const { return fVirtualScreen; }
73 	inline	DrawingEngine*		GetDrawingEngine() const
74 									{ return fVirtualScreen.DrawingEngine(); }
75 	inline	::HWInterface*		HWInterface() const
76 									{ return fVirtualScreen.HWInterface(); }
77 
78 	// Methods for layer(WindowLayer) manipulation.
79 			void				AddWindowLayer(WindowLayer *winBorder);
80 			void				RemoveWindowLayer(WindowLayer *winBorder);
81 			void				SetWindowLayerFeel(WindowLayer *winBorder,
82 												 uint32 feel);
83 			void				AddWindowLayerToSubset(WindowLayer *winBorder,
84 													 WindowLayer *toWindowLayer);
85 			void				RemoveWindowLayerFromSubset(WindowLayer *winBorder,
86 														  WindowLayer *fromWindowLayer);
87 
88 			WindowLayer*			FindWindowLayerByClientToken(int32 token, team_id teamID);
89 			//WindowLayer*		FindWindowLayerByServerToken(int32 token);
90 
91 			// get list of registed windows
92 			const BObjectList<WindowLayer>& WindowList() const;
93 
94 			void				WriteWindowList(team_id team, BPrivate::LinkSender& sender);
95 			void				WriteWindowInfo(int32 serverToken, BPrivate::LinkSender& sender);
96 
97  private:
98  			status_t			_ActivateApp(team_id team);
99 	virtual void				_GetLooperName(char* name, size_t size);
100 	virtual void				_PrepareQuit();
101 	virtual void				_DispatchMessage(int32 code, BPrivate::LinkReceiver &link);
102 
103  private:
104 			friend class DesktopSettings;
105 
106 			uid_t				fUserID;
107 			::VirtualScreen		fVirtualScreen;
108 			DesktopSettings::Private* fSettings;
109 			port_id				fMessagePort;
110 			::EventDispatcher	fEventDispatcher;
111 			port_id				fInputPort;
112 
113 			BLocker				fAppListLock;
114 			BList				fAppList;
115 
116 			sem_id				fShutdownSemaphore;
117 			int32				fShutdownCount;
118 
119 			BObjectList<WindowLayer> fWindowLayerList;
120 
121 			::RootLayer*		fRootLayer;
122 			Screen*				fActiveScreen;
123 
124 			CursorManager		fCursorManager;
125 };
126 
127 #endif	// _DESKTOP_H_
128