xref: /haiku/headers/os/interface/Window.h (revision 4a55cc230cf7566cadcbb23b1928eefff8aea9a2)
1 /*
2  * Copyright 2001-2015, Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef	_WINDOW_H
6 #define	_WINDOW_H
7 
8 
9 #include <Looper.h>
10 #include <StorageDefs.h>
11 #include <View.h>
12 
13 
14 class BButton;
15 class BMenuBar;
16 class BMenuItem;
17 class BMessage;
18 class BMessageRunner;
19 class BMessenger;
20 class BView;
21 
22 namespace BPrivate {
23 	class PortLink;
24 };
25 
26 
27 enum window_type {
28 	B_UNTYPED_WINDOW					= 0,
29 	B_TITLED_WINDOW						= 1,
30 	B_MODAL_WINDOW						= 3,
31 	B_DOCUMENT_WINDOW					= 11,
32 	B_BORDERED_WINDOW					= 20,
33 	B_FLOATING_WINDOW					= 21
34 };
35 
36 enum window_look {
37 	B_BORDERED_WINDOW_LOOK				= 20,
38 	B_NO_BORDER_WINDOW_LOOK				= 19,
39 	B_TITLED_WINDOW_LOOK				= 1,
40 	B_DOCUMENT_WINDOW_LOOK				= 11,
41 	B_MODAL_WINDOW_LOOK					= 3,
42 	B_FLOATING_WINDOW_LOOK				= 7
43 };
44 
45 enum window_feel {
46 	B_NORMAL_WINDOW_FEEL				= 0,
47 	B_MODAL_SUBSET_WINDOW_FEEL			= 2,
48 	B_MODAL_APP_WINDOW_FEEL				= 1,
49 	B_MODAL_ALL_WINDOW_FEEL				= 3,
50 	B_FLOATING_SUBSET_WINDOW_FEEL		= 5,
51 	B_FLOATING_APP_WINDOW_FEEL			= 4,
52 	B_FLOATING_ALL_WINDOW_FEEL			= 6
53 };
54 
55 enum window_alignment {
56 	B_BYTE_ALIGNMENT	= 0,
57 	B_PIXEL_ALIGNMENT	= 1
58 };
59 
60 // window flags
61 enum {
62 	B_NOT_MOVABLE						= 0x00000001,
63 	B_NOT_CLOSABLE						= 0x00000020,
64 	B_NOT_ZOOMABLE						= 0x00000040,
65 	B_NOT_MINIMIZABLE					= 0x00004000,
66 	B_NOT_RESIZABLE						= 0x00000002,
67 	B_NOT_H_RESIZABLE					= 0x00000004,
68 	B_NOT_V_RESIZABLE					= 0x00000008,
69 	B_AVOID_FRONT						= 0x00000080,
70 	B_AVOID_FOCUS						= 0x00002000,
71 	B_WILL_ACCEPT_FIRST_CLICK			= 0x00000010,
72 	B_OUTLINE_RESIZE					= 0x00001000,
73 	B_NO_WORKSPACE_ACTIVATION			= 0x00000100,
74 	B_NOT_ANCHORED_ON_ACTIVATE			= 0x00020000,
75 	B_ASYNCHRONOUS_CONTROLS				= 0x00080000,
76 	B_QUIT_ON_WINDOW_CLOSE				= 0x00100000,
77 	B_SAME_POSITION_IN_ALL_WORKSPACES	= 0x00200000,
78 	B_AUTO_UPDATE_SIZE_LIMITS			= 0x00400000,
79 	B_CLOSE_ON_ESCAPE					= 0x00800000,
80 	B_NO_SERVER_SIDE_WINDOW_MODIFIERS	= 0x00000200
81 };
82 
83 #define B_CURRENT_WORKSPACE				0
84 #define B_ALL_WORKSPACES				0xffffffff
85 
86 // MoveOnScreen() flags
87 enum {
88 	B_DO_NOT_RESIZE_TO_FIT				= 0x0001,
89 	B_MOVE_IF_PARTIALLY_OFFSCREEN		= 0x0002
90 };
91 
92 
93 class BWindow : public BLooper {
94 public:
95 								BWindow(BRect frame, const char* title,
96 									window_type type, uint32 flags,
97 									uint32 workspace = B_CURRENT_WORKSPACE);
98 								BWindow(BRect frame, const char* title,
99 									window_look look, window_feel feel,
100 									uint32 flags, uint32 workspace
101 										= B_CURRENT_WORKSPACE);
102 	virtual						~BWindow();
103 
104 								BWindow(BMessage* archive);
105 	static	BArchivable*		Instantiate(BMessage* archive);
106 	virtual	status_t			Archive(BMessage* archive,
107 									bool deep = true) const;
108 
109 	virtual	void				Quit();
110 			void				Close() { Quit(); }
111 
112 			void				AddChild(BView* child, BView* before = NULL);
113 			void				AddChild(BLayoutItem* child);
114 			bool				RemoveChild(BView* child);
115 			int32				CountChildren() const;
116 			BView*				ChildAt(int32 index) const;
117 
118 	virtual	void				DispatchMessage(BMessage* message,
119 									BHandler* handler);
120 	virtual	void				MessageReceived(BMessage* message);
121 	virtual	void				FrameMoved(BPoint newPosition);
122 	virtual void				WorkspacesChanged(uint32 oldWorkspaces,
123 									uint32 newWorkspaces);
124 	virtual void				WorkspaceActivated(int32 workspace,
125 									bool state);
126 	virtual	void				FrameResized(float newWidth, float newHeight);
127 	virtual void				Minimize(bool minimize);
128 	virtual	void				Zoom(BPoint origin, float width, float height);
129 			void				Zoom();
130 			void				SetZoomLimits(float maxWidth, float maxHeight);
131 	virtual void				ScreenChanged(BRect screenSize,
132 									color_space depth);
133 
134 			void				SetPulseRate(bigtime_t rate);
135 			bigtime_t			PulseRate() const;
136 
137 			void				AddShortcut(uint32 key, uint32 modifiers,
138 									BMessage* message);
139 			void				AddShortcut(uint32 key, uint32 modifiers,
140 									BMessage* message, BHandler* target);
141 			bool				HasShortcut(uint32 key, uint32 modifiers);
142 			void				RemoveShortcut(uint32 key, uint32 modifiers);
143 
144 			void				SetDefaultButton(BButton* button);
145 			BButton*			DefaultButton() const;
146 
147 	virtual	void				MenusBeginning();
148 	virtual	void				MenusEnded();
149 
150 			bool				NeedsUpdate() const;
151 			void				UpdateIfNeeded();
152 
153 			BView*				FindView(const char* viewName) const;
154 			BView*				FindView(BPoint) const;
155 			BView*				CurrentFocus() const;
156 
157 			void				Activate(bool = true);
158 	virtual	void				WindowActivated(bool focus);
159 
160 			void				ConvertToScreen(BPoint* point) const;
161 			BPoint				ConvertToScreen(BPoint point) const;
162 			void				ConvertFromScreen(BPoint* point) const;
163 			BPoint				ConvertFromScreen(BPoint point) const;
164 			void				ConvertToScreen(BRect* rect) const;
165 			BRect				ConvertToScreen(BRect rect) const;
166 			void				ConvertFromScreen(BRect* rect) const;
167 			BRect				ConvertFromScreen(BRect rect) const;
168 
169 			void				MoveBy(float dx, float dy);
170 			void				MoveTo(BPoint);
171 			void				MoveTo(float x, float y);
172 			void				ResizeBy(float dx, float dy);
173 			void				ResizeTo(float width, float height);
174 			void				ResizeToPreferred();
175 
176 			void				CenterIn(const BRect& rect);
177 			void				CenterOnScreen();
178 			void				CenterOnScreen(screen_id id);
179 			void				MoveOnScreen(uint32 flags = 0);
180 
181 	virtual	void				Show();
182 	virtual	void				Hide();
183 			bool				IsHidden() const;
184 			bool				IsMinimized() const;
185 
186 			void				Flush() const;
187 			void				Sync() const;
188 
189 			status_t			SendBehind(const BWindow* window);
190 
191 			void				DisableUpdates();
192 			void				EnableUpdates();
193 
194 			void				BeginViewTransaction();
195 									// referred as OpenViewTransaction()
196 									// in BeBook
197 			void				EndViewTransaction();
198 									// referred as CommitViewTransaction()
199 									// in BeBook
200 			bool				InViewTransaction() const;
201 
202 			BRect				Bounds() const;
203 			BRect				Frame() const;
204 			BRect				DecoratorFrame() const;
205 			BSize				Size() const;
206 			const char*			Title() const;
207 			void				SetTitle(const char* title);
208 			bool				IsFront() const;
209 			bool				IsActive() const;
210 
211 			void				SetKeyMenuBar(BMenuBar* bar);
212 			BMenuBar*			KeyMenuBar() const;
213 
214 			void				SetSizeLimits(float minWidth, float maxWidth,
215 									float minHeight, float maxHeight);
216 			void				GetSizeLimits(float* minWidth, float* maxWidth,
217 									float* minHeight, float* maxHeight);
218 			void				UpdateSizeLimits();
219 
220 			status_t			SetDecoratorSettings(const BMessage& settings);
221 			status_t			GetDecoratorSettings(BMessage* settings) const;
222 
223 			uint32				Workspaces() const;
224 			void				SetWorkspaces(uint32);
225 
226 			BView*				LastMouseMovedView() const;
227 
228 	virtual BHandler*			ResolveSpecifier(BMessage* message,
229 									int32 index, BMessage* specifier,
230 									int32 what, const char* property);
231 	virtual status_t			GetSupportedSuites(BMessage* data);
232 
233 			status_t			AddToSubset(BWindow* window);
234 			status_t			RemoveFromSubset(BWindow* window);
235 
236 	virtual status_t			Perform(perform_code code, void* data);
237 
238 			status_t			SetType(window_type type);
239 			window_type			Type() const;
240 
241 			status_t			SetLook(window_look look);
242 			window_look			Look() const;
243 
244 			status_t			SetFeel(window_feel feel);
245 			window_feel			Feel() const;
246 
247 			status_t			SetFlags(uint32);
248 			uint32				Flags() const;
249 
250 			bool				IsModal() const;
251 			bool				IsFloating() const;
252 
253 			status_t			SetWindowAlignment(window_alignment mode,
254 									int32 h, int32 hOffset = 0,
255 									int32 width = 0, int32 widthOffset = 0,
256 									int32 v = 0, int32 vOffset = 0,
257 									int32 height = 0, int32 heightOffset = 0);
258 			status_t			GetWindowAlignment(
259 									window_alignment* mode = NULL,
260 									int32* h = NULL, int32* hOffset = NULL,
261 									int32* width = NULL,
262 									int32* widthOffset = NULL,
263 									int32* v = NULL, int32* vOffset = NULL,
264 									int32* height = NULL,
265 									int32* heightOffset = NULL) const;
266 
267 	virtual	bool				QuitRequested();
268 	virtual thread_id			Run();
269 
270 	virtual	void				SetLayout(BLayout* layout);
271 			BLayout*			GetLayout() const;
272 
273 			void				InvalidateLayout(bool descendants = false);
274 			void				Layout(bool force);
275 			bool				IsOffscreenWindow() const;
276 private:
277 	// FBC padding and forbidden methods
278 	virtual	void				_ReservedWindow2();
279 	virtual	void				_ReservedWindow3();
280 	virtual	void				_ReservedWindow4();
281 	virtual	void				_ReservedWindow5();
282 	virtual	void				_ReservedWindow6();
283 	virtual	void				_ReservedWindow7();
284 	virtual	void				_ReservedWindow8();
285 
286 								BWindow();
287 								BWindow(BWindow&);
288 			BWindow&			operator=(BWindow&);
289 
290 private:
291 	typedef BLooper inherited;
292 	struct unpack_cookie;
293 	class Shortcut;
294 
295 	friend class BAlert;
296 	friend class BApplication;
297 	friend class BBitmap;
298 	friend class BView;
299 	friend class BMenuItem;
300 	friend class BWindowScreen;
301 	friend class BDirectWindow;
302 	friend class BFilePanel;
303 	friend class BWindowStack;
304 
305 	friend void _set_menu_sem_(BWindow* w, sem_id sem);
306 	friend status_t _safe_get_server_token_(const BLooper*, int32*);
307 
308 								BWindow(BRect frame, int32 bitmapToken);
309 			void				_InitData(BRect frame, const char* title,
310 									window_look look, window_feel feel,
311 									uint32 flags, uint32 workspace,
312 									int32 bitmapToken = -1);
313 
314 	virtual	void				task_looper();
315 
316 			BPoint				AlertPosition(const BRect& frame);
317 	virtual BMessage*			ConvertToMessage(void* raw, int32 code);
318 
319 			void				AddShortcut(uint32 key, uint32 modifiers,
320 									BMenuItem* item);
321 			BHandler*			_DetermineTarget(BMessage* message,
322 									BHandler* target);
323 			bool				_IsFocusMessage(BMessage* message);
324 			bool				_UnpackMessage(unpack_cookie& state,
325 									BMessage** _message, BHandler** _target,
326 									bool* _usePreferred);
327 			void				_SanitizeMessage(BMessage* message,
328 									BHandler* target, bool usePreferred);
329 			bool				_StealMouseMessage(BMessage* message,
330 									bool& deleteMessage);
331 			uint32				_TransitForMouseMoved(BView* view,
332 									BView* viewUnderMouse) const;
333 
334 			bool				InUpdate();
335 			void				_DequeueAll();
336 			window_type			_ComposeType(window_look look,
337 									window_feel feel) const;
338 			void				_DecomposeType(window_type type,
339 									window_look* look,
340 									window_feel* feel) const;
341 
342 			void				SetIsFilePanel(bool yes);
343 			bool				IsFilePanel() const;
344 
345 			void				_CreateTopView();
346 			void				_AdoptResize();
347 			void				_SetFocus(BView* focusView,
348 									bool notifyIputServer = false);
349 			void				_SetName(const char* title);
350 
351 			Shortcut*			_FindShortcut(uint32 key, uint32 modifiers);
352 			BView*				_FindView(BView* view, BPoint point) const;
353 			BView*				_FindView(int32 token);
354 			BView*				_LastViewChild(BView* parent);
355 
356 			BView*				_FindNextNavigable(BView* focus, uint32 flags);
357 			BView*				_FindPreviousNavigable(BView* focus,
358 									uint32 flags);
359 			void				_Switcher(int32 rawKey, uint32 modifiers,
360 									bool repeat);
361 			bool				_HandleKeyDown(BMessage* event);
362 			bool				_HandleUnmappedKeyDown(BMessage* event);
363 			void				_KeyboardNavigation();
364 
365 			void				_GetDecoratorSize(float* _borderWidth,
366 									float* _tabHeight) const;
367 			void				_SendShowOrHideMessage();
368 			void				_PropagateMessageToChildViews(BMessage*);
369 
370 private:
371 			char*				fTitle;
372 			int32				_unused0;
373 			bool				fInTransaction;
374 			bool				fActive;
375 			short				fShowLevel;
376 			uint32				fFlags;
377 
378 			BView*				fTopView;
379 			BView*				fFocus;
380 			BView*				fLastMouseMovedView;
381 			uint32				_unused1;
382 			BMenuBar*			fKeyMenuBar;
383 			BButton*			fDefaultButton;
384 			BList				fShortcuts;
385 			int32				fTopViewToken;
386 			bool				fUpdateRequested;
387 			bool				fOffscreen;
388 			bool				fIsFilePanel;
389 			bool				_unused4;
390 			bigtime_t			fPulseRate;
391 			bool				_unused5;
392 			bool				fMinimized;
393 			bool				fNoQuitShortcut;
394 			bool				_unused6;
395 			sem_id				fMenuSem;
396 			float				fMaxZoomHeight;
397 			float				fMaxZoomWidth;
398 			float				fMinHeight;
399 			float				fMinWidth;
400 			float				fMaxHeight;
401 			float				fMaxWidth;
402 			BRect				fFrame;
403 			window_look			fLook;
404 			window_feel			fFeel;
405 			int32				fLastViewToken;
406 			::BPrivate::PortLink* fLink;
407 			BMessageRunner*		fPulseRunner;
408 			BRect				fPreviousFrame;
409 
410 			uint32				_reserved[9];
411 };
412 
413 
414 #endif // _WINDOW_H
415