1
2#include <stdio.h>
3#include <stdlib.h>
4#include <string.h>
5
6#include <Application.h>
7#include <Box.h>
8#include <OS.h>
9#include <Screen.h>
10#include <Window.h>
11
12
13static BRect* sFrames = NULL;
14static uint32 sNumFrames = 0;
15
16
17class TestApp : public BApplication {
18public:
19								TestApp(uint32 numWindows, bool views);
20	virtual						~TestApp();
21
22	virtual	void				ReadyToRun();
23
24private:
25			void				_CreateFrames(uint32 numWindows);
26			int32				_WindowCreator();
27			static int32		_ThreadStarter(void* data);
28
29private:
30			uint32				fFrameNum;
31			BRect				fScreenFrame;
32			uint32				fNumWindows;
33			uint32				fMaxWindows;
34			bool				fTestViews;
35};
36
37
38class TestWindow : public BWindow {
39public:
40						TestWindow(BRect frame, bool createView);
41	virtual				~TestWindow();
42};
43
44
45TestApp::TestApp(uint32 numWindows, bool views)
46	:
47	BApplication("application/x.vnd-Haiku.window-creation"),
48	fScreenFrame(),
49	fNumWindows(0),
50	fMaxWindows(numWindows),
51	fTestViews(views)
52
53{
54	fScreenFrame = BScreen().Frame();
55	_CreateFrames(numWindows);
56}
57
58
59TestApp::~TestApp()
60{
61	delete[] sFrames;
62}
63
64
65void
66TestApp::ReadyToRun()
67{
68	thread_id thread = spawn_thread(_ThreadStarter, "Window creator",
69		B_NORMAL_PRIORITY, this);
70	resume_thread(thread);
71}
72
73
74void
75TestApp::_CreateFrames(uint32 numWindows)
76{
77	BRect frame(0, 0, 50, 50);
78	uint32 numHorizontal = (fScreenFrame.IntegerWidth() + 1)
79		/ (frame.IntegerWidth() + 1);
80	uint32 numVertical = (fScreenFrame.IntegerHeight() + 1)
81		/ (frame.IntegerHeight() + 1);
82	sNumFrames = numHorizontal * numVertical;
83	sFrames = new BRect[sNumFrames];
84	for (uint32 i = 0; i < sNumFrames; i++) {
85		sFrames[i] = frame;
86		frame.OffsetBy(50, 0);
87		if (!fScreenFrame.Contains(frame))
88			frame.OffsetTo(0, frame.bottom + 1);
89	}
90}
91
92
93int32
94TestApp::_WindowCreator()
95{
96	bigtime_t startTime = system_time();
97
98	while (fNumWindows < fMaxWindows) {
99		if (fFrameNum >= sNumFrames)
100			fFrameNum = 0;
101
102		BWindow* window = new TestWindow(sFrames[fFrameNum++], fTestViews);
103		window->Show();
104		fNumWindows++;
105	}
106
107	bigtime_t endTime = system_time();
108
109	printf("Test completed. %ld windows created in %lld usecs.\n", fNumWindows,
110		endTime - startTime);
111
112	PostMessage(B_QUIT_REQUESTED);
113	return B_OK;
114}
115
116
117int32
118TestApp::_ThreadStarter(void* data)
119{
120	return static_cast<TestApp*>(data)->_WindowCreator();
121}
122
123
124TestWindow::TestWindow(BRect frame, bool views)
125	:
126	BWindow(frame, "Test", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS)
127{
128	if (views)
129		AddChild(new BBox(Bounds()));
130}
131
132
133TestWindow::~TestWindow()
134{
135}
136
137
138int
139main(int argc, char** argv)
140{
141	uint32 numWindows = 10;
142	bool testViews = false;
143	if (argc > 1)
144		numWindows = atoi(argv[1]);
145
146	if (argc > 2) {
147		if (!strcmp(argv[2], "views"))
148			testViews = true;
149	}
150
151	TestApp app(numWindows, testViews);
152	app.Run();
153
154	return 0;
155}
156