xref: /haiku/src/tests/servers/app/newerClipping/main.cpp (revision e76d86d5dd9a32639a877abbd1ffb318c040c720)
1bef1ed93SStephan Aßmus 
2bef1ed93SStephan Aßmus #include <Application.h>
3*e76d86d5SStephan Aßmus #include <DirectWindow.h>
4bef1ed93SStephan Aßmus #include <View.h>
5bef1ed93SStephan Aßmus 
6bef1ed93SStephan Aßmus #include <stdio.h>
7bef1ed93SStephan Aßmus #include <stdlib.h>
8bef1ed93SStephan Aßmus 
9*e76d86d5SStephan Aßmus #include "AccelerantHWInterface.h"
10bef1ed93SStephan Aßmus #include "Desktop.h"
11*e76d86d5SStephan Aßmus #include "DirectWindowBuffer.h"
12bef1ed93SStephan Aßmus #include "DrawingEngine.h"
13*e76d86d5SStephan Aßmus #include "DrawView.h"
14bef1ed93SStephan Aßmus #include "ViewLayer.h"
15bef1ed93SStephan Aßmus #include "WindowLayer.h"
16bef1ed93SStephan Aßmus 
17bef1ed93SStephan Aßmus class App : public BApplication {
18bef1ed93SStephan Aßmus  public:
19bef1ed93SStephan Aßmus 						App();
20bef1ed93SStephan Aßmus 
21bef1ed93SStephan Aßmus 	virtual void		ReadyToRun();
22bef1ed93SStephan Aßmus };
23bef1ed93SStephan Aßmus 
24*e76d86d5SStephan Aßmus class Window : public BDirectWindow {
25bef1ed93SStephan Aßmus  public:
26bef1ed93SStephan Aßmus 								Window(const char* title);
270b78f37eSStephan Aßmus 	virtual						~Window();
28bef1ed93SStephan Aßmus 
29a825e403SStephan Aßmus 	virtual	bool				QuitRequested();
30a825e403SStephan Aßmus 
31*e76d86d5SStephan Aßmus 	virtual void				DirectConnected(direct_buffer_info* info);
32*e76d86d5SStephan Aßmus 
33bef1ed93SStephan Aßmus 			void				AddWindow(BRect frame, const char* name);
34bef1ed93SStephan Aßmus 			void				Test();
35bef1ed93SStephan Aßmus  private:
36bef1ed93SStephan Aßmus 		DrawView*				fView;
37bef1ed93SStephan Aßmus 		Desktop*				fDesktop;
38a825e403SStephan Aßmus 		bool					fQuit;
39*e76d86d5SStephan Aßmus 		DirectWindowBuffer		fBuffer;
40*e76d86d5SStephan Aßmus 		AccelerantHWInterface	fInterface;
41*e76d86d5SStephan Aßmus 		DrawingEngine			fEngine;
42*e76d86d5SStephan Aßmus 
43bef1ed93SStephan Aßmus };
44bef1ed93SStephan Aßmus 
450b78f37eSStephan Aßmus // constructor
46bef1ed93SStephan Aßmus App::App()
47bef1ed93SStephan Aßmus 	: BApplication("application/x-vnd.stippi.ClippingTest")
48bef1ed93SStephan Aßmus {
49bef1ed93SStephan Aßmus 	srand(real_time_clock_usecs());
50bef1ed93SStephan Aßmus }
51bef1ed93SStephan Aßmus 
520b78f37eSStephan Aßmus // ReadyToRun
53bef1ed93SStephan Aßmus void
54bef1ed93SStephan Aßmus App::ReadyToRun()
55bef1ed93SStephan Aßmus {
56bef1ed93SStephan Aßmus 	Window* win = new Window("clipping");
57bef1ed93SStephan Aßmus 	win->Show();
58bef1ed93SStephan Aßmus 
59bef1ed93SStephan Aßmus 	win->Test();
60bef1ed93SStephan Aßmus }
61bef1ed93SStephan Aßmus 
620b78f37eSStephan Aßmus // constructor
63bef1ed93SStephan Aßmus Window::Window(const char* title)
64*e76d86d5SStephan Aßmus 	: BDirectWindow(BRect(50, 50, 800, 650), title,
65*e76d86d5SStephan Aßmus 					B_TITLED_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL, B_ASYNCHRONOUS_CONTROLS),
66*e76d86d5SStephan Aßmus 	  fQuit(false),
67*e76d86d5SStephan Aßmus 	  fBuffer(),
68*e76d86d5SStephan Aßmus 	  fInterface(),
69*e76d86d5SStephan Aßmus 	  fEngine(&fInterface, &fBuffer)
70bef1ed93SStephan Aßmus {
71*e76d86d5SStephan Aßmus 	fInterface.Initialize();
72bef1ed93SStephan Aßmus 	fView = new DrawView(Bounds());
73bef1ed93SStephan Aßmus 	AddChild(fView);
74bef1ed93SStephan Aßmus 	fView->MakeFocus(true);
75*e76d86d5SStephan Aßmus 
76*e76d86d5SStephan Aßmus 	fDesktop = new Desktop(fView, &fEngine);
77*e76d86d5SStephan Aßmus 	fDesktop->Run();
78bef1ed93SStephan Aßmus }
79bef1ed93SStephan Aßmus 
800b78f37eSStephan Aßmus // destructor
81bef1ed93SStephan Aßmus Window::~Window()
82bef1ed93SStephan Aßmus {
83bef1ed93SStephan Aßmus 	fDesktop->Lock();
84bef1ed93SStephan Aßmus 	fDesktop->Quit();
85bef1ed93SStephan Aßmus }
86bef1ed93SStephan Aßmus 
87a825e403SStephan Aßmus // QuitRequested
88a825e403SStephan Aßmus bool
89a825e403SStephan Aßmus Window::QuitRequested()
90a825e403SStephan Aßmus {
91a825e403SStephan Aßmus 	if (!fQuit) {
92a825e403SStephan Aßmus 		fDesktop->PostMessage(MSG_QUIT);
93a825e403SStephan Aßmus 		fQuit = true;
94a825e403SStephan Aßmus 		return false;
95a825e403SStephan Aßmus 	}
96a825e403SStephan Aßmus 	return true;
97a825e403SStephan Aßmus }
98a825e403SStephan Aßmus 
99*e76d86d5SStephan Aßmus // DirectConnected
100*e76d86d5SStephan Aßmus void
101*e76d86d5SStephan Aßmus Window::DirectConnected(direct_buffer_info* info)
102*e76d86d5SStephan Aßmus {
103*e76d86d5SStephan Aßmus 	// TODO: for some reason, this deadlocks
104*e76d86d5SStephan Aßmus 	// on B_DIRECT_STOP... be aware
105*e76d86d5SStephan Aßmus 	fDesktop->LockClipping();
106*e76d86d5SStephan Aßmus 
107*e76d86d5SStephan Aßmus 	fEngine.Lock();
108*e76d86d5SStephan Aßmus 
109*e76d86d5SStephan Aßmus 	switch(info->buffer_state & B_DIRECT_MODE_MASK) {
110*e76d86d5SStephan Aßmus 		case B_DIRECT_START:
111*e76d86d5SStephan Aßmus 		case B_DIRECT_MODIFY:
112*e76d86d5SStephan Aßmus 			fBuffer.SetTo(info);
113*e76d86d5SStephan Aßmus 			fDesktop->SetOffset(info->window_bounds.left, info->window_bounds.top);
114*e76d86d5SStephan Aßmus 			break;
115*e76d86d5SStephan Aßmus 		case B_DIRECT_STOP:
116*e76d86d5SStephan Aßmus 			fBuffer.SetTo(NULL);
117*e76d86d5SStephan Aßmus 			break;
118*e76d86d5SStephan Aßmus 	}
119*e76d86d5SStephan Aßmus 
120*e76d86d5SStephan Aßmus 	fDesktop->SetMasterClipping(&fBuffer.WindowClipping());
121*e76d86d5SStephan Aßmus 
122*e76d86d5SStephan Aßmus 	fEngine.Unlock();
123*e76d86d5SStephan Aßmus 
124*e76d86d5SStephan Aßmus 	fDesktop->UnlockClipping();
125*e76d86d5SStephan Aßmus }
126*e76d86d5SStephan Aßmus 
127bef1ed93SStephan Aßmus // AddWindow
128bef1ed93SStephan Aßmus void
129bef1ed93SStephan Aßmus Window::AddWindow(BRect frame, const char* name)
130bef1ed93SStephan Aßmus {
131bef1ed93SStephan Aßmus 	WindowLayer* window = new WindowLayer(frame, name,
132bef1ed93SStephan Aßmus 										  fDesktop->GetDrawingEngine(),
133bef1ed93SStephan Aßmus 										  fDesktop);
1340b78f37eSStephan Aßmus 
1350b78f37eSStephan Aßmus 	// add a coupld children
1360b78f37eSStephan Aßmus 	frame.OffsetTo(B_ORIGIN);
1370b78f37eSStephan Aßmus 	frame.InsetBy(5.0, 5.0);
1380b78f37eSStephan Aßmus 	if (frame.IsValid()) {
1390b78f37eSStephan Aßmus 		ViewLayer* layer1 = new ViewLayer(frame, "View 1",
1400b78f37eSStephan Aßmus 										  B_FOLLOW_ALL,
1410b78f37eSStephan Aßmus 										  B_FULL_UPDATE_ON_RESIZE,
1420b78f37eSStephan Aßmus 										  (rgb_color){ 180, 180, 180, 255 });
1430b78f37eSStephan Aßmus 
1440b78f37eSStephan Aßmus 		frame.OffsetTo(B_ORIGIN);
1450b78f37eSStephan Aßmus 		frame.InsetBy(15.0, 15.0);
1460b78f37eSStephan Aßmus 		if (frame.IsValid()) {
1470b78f37eSStephan Aßmus 
148f5180663SStephan Aßmus 			BRect f = frame;
149f5180663SStephan Aßmus 			f.bottom = f.top + f.Height() / 3 - 3;
150f5180663SStephan Aßmus 			f.right = f.left + f.Width() / 3 - 3;
1510b78f37eSStephan Aßmus 
152f5180663SStephan Aßmus 			// top row of views
153f5180663SStephan Aßmus 			ViewLayer* layer;
154f5180663SStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP,
155f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
156f5180663SStephan Aßmus 			layer1->AddChild(layer);
1570b78f37eSStephan Aßmus 
158f5180663SStephan Aßmus 			f.OffsetBy(f.Width() + 6, 0);
1590b78f37eSStephan Aßmus 
160f5180663SStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP,
161f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
162f5180663SStephan Aßmus 			layer1->AddChild(layer);
1630b78f37eSStephan Aßmus 
164f5180663SStephan Aßmus 			f.OffsetBy(f.Width() + 6, 0);
165f5180663SStephan Aßmus 
166f5180663SStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP,
167f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
168f5180663SStephan Aßmus 			layer1->AddChild(layer);
169f5180663SStephan Aßmus 
170f5180663SStephan Aßmus 			// middle row of views
171f5180663SStephan Aßmus 			f = frame;
172f5180663SStephan Aßmus 			f.bottom = f.top + f.Height() / 3 - 3;
173f5180663SStephan Aßmus 			f.right = f.left + f.Width() / 3 - 3;
174f5180663SStephan Aßmus 			f.OffsetBy(0, f.Height() + 6);
175f5180663SStephan Aßmus 
176f5180663SStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_TOP_BOTTOM,
177f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
178f5180663SStephan Aßmus 			layer1->AddChild(layer);
179f5180663SStephan Aßmus 
180f5180663SStephan Aßmus 			f.OffsetBy(f.Width() + 6, 0);
181f5180663SStephan Aßmus 
182f5180663SStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_ALL,
183f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
184f5180663SStephan Aßmus 			layer1->AddChild(layer);
185f5180663SStephan Aßmus 
186f5180663SStephan Aßmus 			f.OffsetBy(f.Width() + 6, 0);
187f5180663SStephan Aßmus 
188f5180663SStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_TOP_BOTTOM,
189f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
190f5180663SStephan Aßmus 			layer1->AddChild(layer);
191f5180663SStephan Aßmus 
192f5180663SStephan Aßmus 			// bottom row of views
193f5180663SStephan Aßmus 			f = frame;
194f5180663SStephan Aßmus 			f.bottom = f.top + f.Height() / 3 - 3;
195f5180663SStephan Aßmus 			f.right = f.left + f.Width() / 3 - 3;
196f5180663SStephan Aßmus 			f.OffsetBy(0, 2 * f.Height() + 12);
197f5180663SStephan Aßmus 
198f5180663SStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM,
199f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
200f5180663SStephan Aßmus 			layer1->AddChild(layer);
201f5180663SStephan Aßmus 
202f5180663SStephan Aßmus 			f.OffsetBy(f.Width() + 6, 0);
203f5180663SStephan Aßmus 
204748533bbSStephan Aßmus //			layer = new ViewLayer(f, "View", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_BOTTOM,
205748533bbSStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM,
206f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
207f5180663SStephan Aßmus 			layer1->AddChild(layer);
208f5180663SStephan Aßmus 
209f5180663SStephan Aßmus 			f.OffsetBy(f.Width() + 6, 0);
210f5180663SStephan Aßmus 
211748533bbSStephan Aßmus //			layer = new ViewLayer(f, "View", B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM,
212748533bbSStephan Aßmus 			layer = new ViewLayer(f, "View", B_FOLLOW_LEFT | B_FOLLOW_BOTTOM,
213f5180663SStephan Aßmus 								  B_FULL_UPDATE_ON_RESIZE, (rgb_color){ 120, 120, 120, 255 });
214f5180663SStephan Aßmus 			layer1->AddChild(layer);
2150b78f37eSStephan Aßmus 		}
2160b78f37eSStephan Aßmus 
2170b78f37eSStephan Aßmus 		window->AddChild(layer1);
2180b78f37eSStephan Aßmus 	}
2190b78f37eSStephan Aßmus 
220bef1ed93SStephan Aßmus 	window->Run();
221bef1ed93SStephan Aßmus 
222bef1ed93SStephan Aßmus 	BMessage message(MSG_ADD_WINDOW);
223bef1ed93SStephan Aßmus 	message.AddPointer("window", (void*)window);
224bef1ed93SStephan Aßmus 	fDesktop->PostMessage(&message);
225bef1ed93SStephan Aßmus }
226bef1ed93SStephan Aßmus 
227bef1ed93SStephan Aßmus // Test
228bef1ed93SStephan Aßmus void
229bef1ed93SStephan Aßmus Window::Test()
230bef1ed93SStephan Aßmus {
231f5180663SStephan Aßmus 	BRect frame(20, 20, 330, 230);
2324dd89c69SStephan Aßmus //	AddWindow(frame, "Window 1");
2334dd89c69SStephan Aßmus //	AddWindow(frame, "Window 2");
234f5180663SStephan Aßmus 	for (int32 i = 0; i < 20; i++) {
235f5180663SStephan Aßmus 		BString name("Window ");
236f5180663SStephan Aßmus 		frame.OffsetBy(20, 15);
237f5180663SStephan Aßmus 		name << i + 1;
238f5180663SStephan Aßmus 		AddWindow(frame, name.String());
239f5180663SStephan Aßmus 	}
240f5180663SStephan Aßmus 
241d0e89d53SStephan Aßmus /*	frame.Set(10, 80, 320, 290);
242f5180663SStephan Aßmus 	for (int32 i = 20; i < 40; i++) {
243f5180663SStephan Aßmus 		BString name("Window ");
244f5180663SStephan Aßmus 		frame.OffsetBy(20, 15);
245f5180663SStephan Aßmus 		name << i + 1;
246f5180663SStephan Aßmus 		AddWindow(frame, name.String());
247f5180663SStephan Aßmus 	}
248d0e89d53SStephan Aßmus 
2494dd89c69SStephan Aßmus 	frame.Set(20, 140, 330, 230);
250f5180663SStephan Aßmus 	for (int32 i = 40; i < 60; i++) {
251f5180663SStephan Aßmus 		BString name("Window ");
252f5180663SStephan Aßmus 		frame.OffsetBy(20, 15);
253f5180663SStephan Aßmus 		name << i + 1;
254f5180663SStephan Aßmus 		AddWindow(frame, name.String());
255f5180663SStephan Aßmus 	}
256f5180663SStephan Aßmus 
257f5180663SStephan Aßmus 	frame.Set(20, 200, 330, 230);
258f5180663SStephan Aßmus 	for (int32 i = 60; i < 80; i++) {
259f5180663SStephan Aßmus 		BString name("Window ");
260f5180663SStephan Aßmus 		frame.OffsetBy(20, 15);
261f5180663SStephan Aßmus 		name << i + 1;
262f5180663SStephan Aßmus 		AddWindow(frame, name.String());
263f5180663SStephan Aßmus 	}
264f5180663SStephan Aßmus 
265f5180663SStephan Aßmus 	frame.Set(20, 260, 330, 230);
266f5180663SStephan Aßmus // 99 windows are ok, the 100th looper does not run anymore,
267f5180663SStephan Aßmus // I guess I'm hitting a BeOS limit (max loopers per app?)
268f5180663SStephan Aßmus 	for (int32 i = 80; i < 99; i++) {
269f5180663SStephan Aßmus 		BString name("Window ");
270f5180663SStephan Aßmus 		frame.OffsetBy(20, 15);
271f5180663SStephan Aßmus 		name << i + 1;
272f5180663SStephan Aßmus 		AddWindow(frame, name.String());
273f5180663SStephan Aßmus 	}*/
274bef1ed93SStephan Aßmus }
275bef1ed93SStephan Aßmus 
276bef1ed93SStephan Aßmus // main
277bef1ed93SStephan Aßmus int
278bef1ed93SStephan Aßmus main(int argc, const char* argv[])
279bef1ed93SStephan Aßmus {
280727653f7SStephan Aßmus 	srand((long int)system_time());
281727653f7SStephan Aßmus 
282bef1ed93SStephan Aßmus 	App app;
283bef1ed93SStephan Aßmus 	app.Run();
284bef1ed93SStephan Aßmus 	return 0;
285bef1ed93SStephan Aßmus }
286