xref: /haiku/src/servers/app/ServerApp.h (revision a127b88ecbfab58f64944c98aa47722a18e363b2)
1 /*
2  * Copyright 2001-2013, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		DarkWyrm <bpmagic@columbus.rr.com>
7  *		Adrian Oanca <adioanca@cotty.iren.ro>
8  *		Stephan Aßmus <superstippi@gmx.de>
9  *		Stefano Ceccherini (burton666@libero.it)
10  *		Axel Dörfler, axeld@pinc-software.de
11  */
12 #ifndef SERVER_APP_H
13 #define SERVER_APP_H
14 
15 
16 #include "AppFontManager.h"
17 #include "ClientMemoryAllocator.h"
18 #include "MessageLooper.h"
19 #include "ServerFont.h"
20 
21 #include <ObjectList.h>
22 #include <TokenSpace.h>
23 
24 #include <Messenger.h>
25 #include <String.h>
26 
27 
28 class AreaPool;
29 class BMessage;
30 class BList;
31 class Desktop;
32 class DrawingEngine;
33 class ServerPicture;
34 class ServerCursor;
35 class ServerBitmap;
36 class ServerWindow;
37 
38 namespace BPrivate {
39 	class PortLink;
40 };
41 
42 
43 class ServerApp : public MessageLooper {
44 public:
45 								ServerApp(Desktop* desktop,
46 									port_id clientAppPort,
47 									port_id clientLooperPort,
48 									team_id clientTeamID, int32 handlerID,
49 									const char* signature);
50 	virtual						~ServerApp();
51 
52 			status_t			InitCheck();
53 
54 	virtual	void				Quit();
55 			void				Quit(sem_id shutdownSemaphore);
56 
57 	virtual	port_id				MessagePort() const { return fMessagePort; }
58 
59 	/*!
60 		\brief Determines whether the application is the active one
61 		\return true if active, false if not.
62 	*/
63 			bool				IsActive() const { return fIsActive; }
64 			void				Activate(bool value);
65 
66 			void				SendMessageToClient(BMessage* message) const;
67 
68 			void				SetCurrentCursor(ServerCursor* cursor);
69 			ServerCursor*		CurrentCursor() const;
70 
71 			team_id				ClientTeam() const { return fClientTeam; }
72 
73 			const char*			Signature() const
74 									{ return fSignature.String(); }
75 			const char*			SignatureLeaf() const
76 									{ return fSignature.String() + 12; }
77 
78 			bool				AddWindow(ServerWindow* window);
79 			void				RemoveWindow(ServerWindow* window);
80 			bool				InWorkspace(int32 index) const;
81 			uint32				Workspaces() const;
82 			int32				InitialWorkspace() const
83 									{ return fInitialWorkspace; }
84 
85 			ServerBitmap*		GetBitmap(int32 token) const;
86 
87 			ServerPicture*		CreatePicture(
88 									const ServerPicture* original = NULL);
89 			ServerPicture*		GetPicture(int32 token) const;
90 			bool				AddPicture(ServerPicture* picture);
91 			void				RemovePicture(ServerPicture* picture);
92 
93 			Desktop*			GetDesktop() const { return fDesktop; }
94 
95 			const ServerFont&	PlainFont() const { return fPlainFont; }
96 
97 			BPrivate::BTokenSpace& ViewTokens() { return fViewTokens; }
98 
99 			void				NotifyDeleteClientArea(area_id serverArea);
100 			AppFontManager*		FontManager() { return fAppFontManager; }
101 
102 private:
103 	virtual	void				_GetLooperName(char* name, size_t size);
104 	virtual	void				_DispatchMessage(int32 code,
105 									BPrivate::LinkReceiver& link);
106 	virtual	void				_MessageLooper();
107 			status_t			_CreateWindow(int32 code,
108 									BPrivate::LinkReceiver& link,
109 									port_id& clientReplyPort);
110 
111 			bool				_HasWindowUnderMouse();
112 
113 			bool				_AddBitmap(ServerBitmap* bitmap);
114 			void				_DeleteBitmap(ServerBitmap* bitmap);
115 			ServerBitmap*		_FindBitmap(int32 token) const;
116 
117 			ServerPicture*		_FindPicture(int32 token) const;
118 
119 private:
120 	typedef std::map<int32, BReference<ServerBitmap> > BitmapMap;
121 	typedef std::map<int32, BReference<ServerPicture> > PictureMap;
122 
123 			port_id				fMessagePort;
124 			port_id				fClientReplyPort;
125 									// our BApplication's event port
126 
127 			BMessenger			fHandlerMessenger;
128 			port_id				fClientLooperPort;
129 			int32				fClientToken;
130 									// To send a BMessage to the client
131 									// (port + token)
132 
133 			Desktop*			fDesktop;
134 			BString				fSignature;
135 			team_id				fClientTeam;
136 
137 			ServerFont			fPlainFont;
138 			ServerFont			fBoldFont;
139 			ServerFont			fFixedFont;
140 
141 	mutable	BLocker				fWindowListLock;
142 			BObjectList<ServerWindow> fWindowList;
143 			BPrivate::BTokenSpace fViewTokens;
144 
145 			int32				fInitialWorkspace;
146 			uint32				fTemporaryDisplayModeChange;
147 
148 			// NOTE: Bitmaps and Pictures are stored globally, but ServerApps
149 			// remember which ones they own so that they can destroy them when
150 			// they quit.
151 	mutable	BLocker				fMapLocker;
152 			BitmapMap			fBitmapMap;
153 			PictureMap			fPictureMap;
154 
155 			BReference<ServerCursor>
156 								fAppCursor;
157 			BReference<ServerCursor>
158 								fViewCursor;
159 			int32				fCursorHideLevel;
160 									// 0 = cursor visible
161 
162 			bool				fIsActive;
163 
164 			BReference<ClientMemoryAllocator> fMemoryAllocator;
165 
166 			AppFontManager*		fAppFontManager;
167 };
168 
169 
170 #endif	// SERVER_APP_H
171