xref: /haiku/src/tests/servers/app/newerClipping/Desktop.h (revision 1214ef1b2100f2b3299fc9d8d6142e46f70a4c3f)
1 
2 #ifndef DESKTOP_H
3 #define DESKTOP_H
4 
5 #include <List.h>
6 #include <Region.h>
7 #include <View.h>
8 #include <Window.h>
9 
10 #define SHOW_GLOBAL_DIRTY_REGION 0
11 #define SHOW_WINDOW_CONTENT_DIRTY_REGION 0
12 
13 #define MULTI_LOCKER 1
14 
15 #if MULTI_LOCKER
16 #  include "MultiLocker.h"
17 #else
18 #  include <Locker.h>
19 #endif
20 
21 class DrawingEngine;
22 class DrawView;
23 class WindowLayer;
24 class ViewLayer;
25 
26 enum {
27 	MSG_ADD_WINDOW		= 'addw',
28 	MSG_DRAW			= 'draw',
29 
30 	MSG_MARK_CLEAN		= 'mcln',
31 
32 	MSG_QUIT			= 'quit',
33 };
34 
35 class Desktop : public BLooper {
36  public:
37 								Desktop(DrawView* drawView,
38 										DrawingEngine* engine);
39 	virtual						~Desktop();
40 
41 			// functions for the DrawView
42 			void				MouseDown(BPoint where, uint32 buttons,
43 										  int32 clicks);
44 			void				MouseUp(BPoint where);
45 			void				MouseMoved(BPoint where, uint32 code,
46 										   const BMessage* dragMessage);
47 
48 	virtual	void				MessageReceived(BMessage* message);
49 
50 			void				SetMasterClipping(BRegion* clipping);
51 			void				SetOffset(int32 x, int32 y);
52 
53 			bool				AddWindow(WindowLayer* window);
54 			bool				RemoveWindow(WindowLayer* window);
55 			int32				IndexOf(WindowLayer* window) const;
56 			int32				CountWindows() const;
57 			bool				HasWindow(WindowLayer* window) const;
58 
59 			WindowLayer*		WindowAt(int32 index) const;
60 			WindowLayer*		WindowAtFast(int32 index) const;
61 			WindowLayer*		WindowAt(const BPoint& where) const;
62 			WindowLayer*		TopWindow() const;
63 			WindowLayer*		BottomWindow() const;
64 
65 			// doing something with the windows
66 			void				MoveWindowBy(WindowLayer* window, int32 x, int32 y);
67 			void				ResizeWindowBy(WindowLayer* window, int32 x, int32 y);
68 
69 			void				ShowWindow(WindowLayer* window);
70 			void				HideWindow(WindowLayer* window);
71 			void				SetWindowHidden(WindowLayer* window, bool hidden);
72 
73 			void				BringToFront(WindowLayer* window);
74 			void				SendToBack(WindowLayer* window);
75 
76 			void				SetFocusWindow(WindowLayer* window);
77 
78 #if MULTI_LOCKER
79 			bool				ReadLockClipping() { return fClippingLock.ReadLock(); }
80 			void				ReadUnlockClipping() { fClippingLock.ReadUnlock(); }
81 
82 			bool				LockClipping() { return fClippingLock.WriteLock(); }
83 			void				UnlockClipping() { fClippingLock.WriteUnlock(); }
84 #else // BLocker
85 			bool				ReadLockClipping() { return fClippingLock.Lock(); }
86 			void				ReadUnlockClipping() { fClippingLock.Unlock(); }
87 
88 			bool				LockClipping() { return fClippingLock.Lock(); }
89 			void				UnlockClipping() { fClippingLock.Unlock(); }
90 #endif
91 
92 			void				MarkDirty(BRegion* region);
93 
94 			DrawingEngine*		GetDrawingEngine() const
95 									{ return fDrawingEngine; }
96 
97 			BRegion&			BackgroundRegion()
98 									{ return fBackgroundRegion; }
99 
100 			void				WindowDied(WindowLayer* window);
101 
102 private:
103 			void				_RebuildClippingForAllWindows(BRegion* stillAvailableOnScreen);
104 			void				_TriggerWindowRedrawing(BRegion* newDirtyRegion);
105 			void				_SetBackground(BRegion* background);
106 
107 			bool				fTracking;
108 			BPoint				fLastMousePos;
109 			WindowLayer*		fClickedWindow;
110 			ViewLayer*			fScrollingView;
111 			bool				fResizing;
112 			bigtime_t			fClickTime;
113 			bool				fIs2ndButton;
114 
115 #if MULTI_LOCKER
116 			MultiLocker			fClippingLock;
117 #else
118 			BLocker				fClippingLock;
119 #endif
120 			BRegion				fBackgroundRegion;
121 
122 			BRegion				fMasterClipping;
123 			int32				fXOffset;
124 			int32				fYOffset;
125 
126 			DrawView*			fDrawView;
127 			DrawingEngine*		fDrawingEngine;
128 
129 			BList				fWindows;
130 
131 			bool				fFocusFollowsMouse;
132 			WindowLayer*		fFocusWindow;
133 };
134 
135 #endif // DESKTOP_H
136 
137