xref: /haiku/src/tests/servers/app/window_invalidation/WindowInvalidation.cpp (revision 572d609ff016534ddbfcd85119f3d884abf12fa3)
1e527d809SAxel Dörfler /*
2e527d809SAxel Dörfler  * Copyright 2009, Haiku Inc.
3e527d809SAxel Dörfler  * Distributed under the terms of the MIT License.
4e527d809SAxel Dörfler  *
5e527d809SAxel Dörfler  * Authors:
6e527d809SAxel Dörfler  *		Axel Dörfler, axeld@pinc-software.de
7e527d809SAxel Dörfler  */
8e527d809SAxel Dörfler 
9e527d809SAxel Dörfler 
10*572d609fSAxel Dörfler #include <stdlib.h>
11*572d609fSAxel Dörfler 
12e527d809SAxel Dörfler #include <Application.h>
13e527d809SAxel Dörfler #include <MessageRunner.h>
14e527d809SAxel Dörfler #include <Window.h>
15e527d809SAxel Dörfler #include <View.h>
16e527d809SAxel Dörfler 
17*572d609fSAxel Dörfler #include <WindowPrivate.h>
18e527d809SAxel Dörfler 
19e527d809SAxel Dörfler 
20e527d809SAxel Dörfler class ShowInvalidationView : public BView {
21e527d809SAxel Dörfler public:
22e527d809SAxel Dörfler 							ShowInvalidationView(BRect rect);
23e527d809SAxel Dörfler 	virtual					~ShowInvalidationView();
24e527d809SAxel Dörfler 
25e527d809SAxel Dörfler 	virtual void			Draw(BRect updateRect);
26e527d809SAxel Dörfler };
27e527d809SAxel Dörfler 
28e527d809SAxel Dörfler 
29e527d809SAxel Dörfler class ShowingWindow : public BWindow {
30e527d809SAxel Dörfler public:
31e527d809SAxel Dörfler 							ShowingWindow();
32e527d809SAxel Dörfler };
33e527d809SAxel Dörfler 
34e527d809SAxel Dörfler 
35e527d809SAxel Dörfler class ChangingWindow : public BWindow {
36e527d809SAxel Dörfler public:
37e527d809SAxel Dörfler 							ChangingWindow();
38e527d809SAxel Dörfler 	virtual					~ChangingWindow();
39e527d809SAxel Dörfler 
40e527d809SAxel Dörfler 	virtual void			MessageReceived(BMessage* message);
41e527d809SAxel Dörfler 
42e527d809SAxel Dörfler private:
43e527d809SAxel Dörfler 			BMessageRunner*	fRunner;
44e527d809SAxel Dörfler };
45e527d809SAxel Dörfler 
46e527d809SAxel Dörfler 
47e527d809SAxel Dörfler class Application : public BApplication {
48e527d809SAxel Dörfler public:
49e527d809SAxel Dörfler 							Application();
50e527d809SAxel Dörfler 
51e527d809SAxel Dörfler 	virtual void			ReadyToRun();
52e527d809SAxel Dörfler };
53e527d809SAxel Dörfler 
54e527d809SAxel Dörfler 
ShowInvalidationView(BRect rect)55e527d809SAxel Dörfler ShowInvalidationView::ShowInvalidationView(BRect rect)
56e527d809SAxel Dörfler 	:
57e527d809SAxel Dörfler 	BView(rect, "show invalidation", B_FOLLOW_ALL, B_WILL_DRAW)
58e527d809SAxel Dörfler {
59e527d809SAxel Dörfler 	SetViewColor(B_TRANSPARENT_COLOR);
60e527d809SAxel Dörfler }
61e527d809SAxel Dörfler 
62e527d809SAxel Dörfler 
~ShowInvalidationView()63e527d809SAxel Dörfler ShowInvalidationView::~ShowInvalidationView()
64e527d809SAxel Dörfler {
65e527d809SAxel Dörfler }
66e527d809SAxel Dörfler 
67e527d809SAxel Dörfler 
68e527d809SAxel Dörfler void
Draw(BRect updateRect)69e527d809SAxel Dörfler ShowInvalidationView::Draw(BRect updateRect)
70e527d809SAxel Dörfler {
71e527d809SAxel Dörfler 	SetHighColor(rand() % 256, rand() % 256, rand() % 256);
72e527d809SAxel Dörfler 	FillRect(updateRect);
73e527d809SAxel Dörfler }
74e527d809SAxel Dörfler 
75e527d809SAxel Dörfler 
76e527d809SAxel Dörfler //	#pragma mark -
77e527d809SAxel Dörfler 
78e527d809SAxel Dörfler 
ShowingWindow()79e527d809SAxel Dörfler ShowingWindow::ShowingWindow()
80e527d809SAxel Dörfler 	:
81e527d809SAxel Dörfler 	BWindow(BRect(150, 150, 450, 450), "WindowInvalidation-Test",
82e527d809SAxel Dörfler 		B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE)
83e527d809SAxel Dörfler {
84e527d809SAxel Dörfler 	BView* view = new ShowInvalidationView(Bounds());
85e527d809SAxel Dörfler 	AddChild(view);
86e527d809SAxel Dörfler }
87e527d809SAxel Dörfler 
88e527d809SAxel Dörfler 
89e527d809SAxel Dörfler //	#pragma mark -
90e527d809SAxel Dörfler 
91e527d809SAxel Dörfler 
ChangingWindow()92e527d809SAxel Dörfler ChangingWindow::ChangingWindow()
93e527d809SAxel Dörfler 	:
94e527d809SAxel Dörfler 	BWindow(BRect(150, 150, 400, 400), "WindowInvalidation-Test",
95e527d809SAxel Dörfler 		B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE)
96e527d809SAxel Dörfler {
97e527d809SAxel Dörfler 	BMessage message('actn');
98e527d809SAxel Dörfler 	fRunner = new BMessageRunner(this, &message, 25000);
99e527d809SAxel Dörfler }
100e527d809SAxel Dörfler 
101e527d809SAxel Dörfler 
~ChangingWindow()102e527d809SAxel Dörfler ChangingWindow::~ChangingWindow()
103e527d809SAxel Dörfler {
104e527d809SAxel Dörfler 	delete fRunner;
105e527d809SAxel Dörfler }
106e527d809SAxel Dörfler 
107e527d809SAxel Dörfler 
108e527d809SAxel Dörfler void
MessageReceived(BMessage * message)109e527d809SAxel Dörfler ChangingWindow::MessageReceived(BMessage* message)
110e527d809SAxel Dörfler {
111e527d809SAxel Dörfler 	if (message->what == 'actn') {
112*572d609fSAxel Dörfler 		switch (rand() % 4) {
113e527d809SAxel Dörfler 			case 0:
114e527d809SAxel Dörfler 			{
115e527d809SAxel Dörfler 				// resize window
116e527d809SAxel Dörfler 				BRect bounds;
117e527d809SAxel Dörfler 				do {
118e527d809SAxel Dörfler 					bounds = Bounds();
119e527d809SAxel Dörfler 					bounds.right += rand() % 21 - 10;
120e527d809SAxel Dörfler 					bounds.bottom += rand() % 21 - 10;
121e527d809SAxel Dörfler 				} while (bounds.Width() > 400 || bounds.Height() > 400
122e527d809SAxel Dörfler 					|| bounds.Width() < 50 || bounds.Height() < 50);
123e527d809SAxel Dörfler 
124e527d809SAxel Dörfler 				ResizeTo(bounds.Width() + 1, bounds.Height() + 1);
125e527d809SAxel Dörfler 				break;
126e527d809SAxel Dörfler 			}
127e527d809SAxel Dörfler 
128e527d809SAxel Dörfler 			case 1:
129e527d809SAxel Dörfler 			{
130e527d809SAxel Dörfler 				// move window
131e527d809SAxel Dörfler 				BPoint leftTop;
132e527d809SAxel Dörfler 				do {
133e527d809SAxel Dörfler 					leftTop = Frame().LeftTop();
134e527d809SAxel Dörfler 					leftTop.x += rand() % 21 - 10;
135e527d809SAxel Dörfler 					leftTop.y += rand() % 21 - 10;
136e527d809SAxel Dörfler 				} while (!BRect(100, 100, 200, 200).Contains(leftTop));
137e527d809SAxel Dörfler 
138e527d809SAxel Dörfler 				MoveTo(leftTop);
139e527d809SAxel Dörfler 				break;
140e527d809SAxel Dörfler 			}
141e527d809SAxel Dörfler 
142e527d809SAxel Dörfler 			case 2:
143e527d809SAxel Dörfler 			{
144e527d809SAxel Dörfler 				// set title
145e527d809SAxel Dörfler 				static const char* kChoices[]
146e527d809SAxel Dörfler 					= {"Window", "Invalidation", "Test", "Hooray"};
147e527d809SAxel Dörfler 
148e527d809SAxel Dörfler 				SetTitle(kChoices[rand() % (sizeof(kChoices) / sizeof(char*))]);
149e527d809SAxel Dörfler 				break;
150e527d809SAxel Dörfler 			}
151*572d609fSAxel Dörfler 
152*572d609fSAxel Dörfler 			case 3:
153*572d609fSAxel Dörfler 			{
154*572d609fSAxel Dörfler 				// change look
155*572d609fSAxel Dörfler 				static const window_look kLooks[]
156*572d609fSAxel Dörfler 					= {B_TITLED_WINDOW_LOOK, B_DOCUMENT_WINDOW_LOOK,
157*572d609fSAxel Dörfler 						B_FLOATING_WINDOW_LOOK, kLeftTitledWindowLook};
158*572d609fSAxel Dörfler 
159*572d609fSAxel Dörfler 				SetLook(kLooks[rand() % (sizeof(kLooks) / sizeof(kLooks[0]))]);
160*572d609fSAxel Dörfler 				break;
161*572d609fSAxel Dörfler 			}
162e527d809SAxel Dörfler 		}
163e527d809SAxel Dörfler 	} else
164e527d809SAxel Dörfler 		BWindow::MessageReceived(message);
165e527d809SAxel Dörfler }
166e527d809SAxel Dörfler 
167e527d809SAxel Dörfler 
168e527d809SAxel Dörfler //	#pragma mark -
169e527d809SAxel Dörfler 
170e527d809SAxel Dörfler 
Application()171e527d809SAxel Dörfler Application::Application()
172e527d809SAxel Dörfler 	:
173e527d809SAxel Dörfler 	BApplication("application/x-vnd.haiku-view_state")
174e527d809SAxel Dörfler {
175e527d809SAxel Dörfler }
176e527d809SAxel Dörfler 
177e527d809SAxel Dörfler 
178e527d809SAxel Dörfler void
ReadyToRun()179e527d809SAxel Dörfler Application::ReadyToRun()
180e527d809SAxel Dörfler {
181e527d809SAxel Dörfler 	BWindow* window = new ChangingWindow();
182e527d809SAxel Dörfler 	window->Show();
183e527d809SAxel Dörfler 
184e527d809SAxel Dörfler 	window = new ShowingWindow();
185e527d809SAxel Dörfler 	window->Show();
186e527d809SAxel Dörfler }
187e527d809SAxel Dörfler 
188e527d809SAxel Dörfler 
189e527d809SAxel Dörfler //	#pragma mark -
190e527d809SAxel Dörfler 
191e527d809SAxel Dörfler 
192e527d809SAxel Dörfler int
main(int argc,char ** argv)193e527d809SAxel Dörfler main(int argc, char** argv)
194e527d809SAxel Dörfler {
195e527d809SAxel Dörfler 	Application app;
196e527d809SAxel Dörfler 	app.Run();
197e527d809SAxel Dörfler 
198e527d809SAxel Dörfler 	return 0;
199e527d809SAxel Dörfler }
200