xref: /haiku/src/tests/servers/app/avoid_focus/AvoidFocus.cpp (revision c7bba5ca04588471b051cc4c830458b55e4f2fd8)
1 /*
2  * Copyright 2005, Haiku Inc.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Axel Dörfler, axeld@pinc-software.de
7  */
8 
9 
10 #include <Application.h>
11 #include <String.h>
12 #include <View.h>
13 #include <Window.h>
14 
15 #include <ctype.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 
19 
20 bool gAvoid = true;
21 
22 
23 class View : public BView {
24 	public:
25 		View(BRect rect);
26 		virtual ~View();
27 
28 		virtual void AttachedToWindow();
29 
30 		virtual void KeyDown(const char* bytes, int32 numBytes);
31 		virtual void KeyUp(const char* bytes, int32 numBytes);
32 
33 		virtual void MouseDown(BPoint where);
34 		virtual void MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage);
35 
36 		virtual void Draw(BRect updateRect);
37 		virtual void Pulse();
38 
39 	private:
40 		BString	fChar;
41 		bool	fPressed;
42 };
43 
44 
View(BRect rect)45 View::View(BRect rect)
46 	: BView(rect, "desktop view", B_FOLLOW_ALL, B_WILL_DRAW | B_PULSE_NEEDED)
47 {
48 	SetViewColor(255, 255, 255);
49 	SetHighColor(0, 0, 0);
50 	SetLowColor(ViewColor());
51 }
52 
53 
~View()54 View::~View()
55 {
56 }
57 
58 
59 void
AttachedToWindow()60 View::AttachedToWindow()
61 {
62 	MakeFocus(true);
63 	KeyDown("<>", 2);
64 	fPressed = false;
65 }
66 
67 
68 void
KeyDown(const char * bytes,int32 numBytes)69 View::KeyDown(const char* bytes, int32 numBytes)
70 {
71 	fChar = bytes;
72 	fPressed = true;
73 	SetHighColor(0, 0, 0);
74 	Window()->SetPulseRate(200000);
75 	Invalidate();
76 }
77 
78 
79 void
KeyUp(const char * bytes,int32 numBytes)80 View::KeyUp(const char* bytes, int32 numBytes)
81 {
82 	fPressed = false;
83 	Invalidate();
84 }
85 
86 
87 void
MouseDown(BPoint where)88 View::MouseDown(BPoint where)
89 {
90 	SetHighColor(0, 250, 0);
91 	Invalidate();
92 	Window()->SetPulseRate(150000);
93 }
94 
95 
96 void
MouseMoved(BPoint where,uint32 transit,const BMessage * dragMessage)97 View::MouseMoved(BPoint where, uint32 transit, const BMessage* dragMessage)
98 {
99 	if (transit == B_ENTERED_VIEW)
100 		SetHighColor(0, 150, 150);
101 	else
102 		SetHighColor(0, 0, 150);
103 
104 	Invalidate();
105 	Window()->SetPulseRate(10000);
106 }
107 
108 
109 void
Draw(BRect updateRect)110 View::Draw(BRect updateRect)
111 {
112 	BFont font;
113 	font.SetSize(200);
114 
115 	font_height fontHeight;
116 	font.GetHeight(&fontHeight);
117 
118 	SetFont(&font);
119 	MovePenTo(20, ceilf(20 + fontHeight.ascent));
120 
121 	DrawString(fChar.String());
122 }
123 
124 
125 void
Pulse()126 View::Pulse()
127 {
128 	if (fPressed)
129 		return;
130 
131 	rgb_color color = HighColor();
132 	SetHighColor(tint_color(color, B_LIGHTEN_2_TINT));
133 	Invalidate();
134 
135 	if (color.red > 253)
136 		Window()->SetPulseRate(0);
137 }
138 
139 
140 //	#pragma mark -
141 
142 
143 class Window : public BWindow {
144 	public:
145 		Window();
146 		virtual ~Window();
147 
148 		virtual bool QuitRequested();
149 };
150 
151 
Window()152 Window::Window()
153 	: BWindow(BRect(100, 100, 400, 400), "AvoidFocus-Test",
154 			B_TITLED_WINDOW, (gAvoid ? B_AVOID_FOCUS : 0) | B_ASYNCHRONOUS_CONTROLS)
155 {
156 	BView *view = new View(Bounds());
157 	AddChild(view);
158 }
159 
160 
~Window()161 Window::~Window()
162 {
163 }
164 
165 
166 bool
QuitRequested()167 Window::QuitRequested()
168 {
169 	be_app->PostMessage(B_QUIT_REQUESTED);
170 	return true;
171 }
172 
173 
174 //	#pragma mark -
175 
176 
177 class Application : public BApplication {
178 	public:
179 		Application();
180 
181 		virtual void ReadyToRun();
182 };
183 
184 
Application()185 Application::Application()
186 	: BApplication("application/x-vnd.haiku-avoid_focus")
187 {
188 }
189 
190 
191 void
ReadyToRun()192 Application::ReadyToRun()
193 {
194 	Window *window = new Window();
195 	window->Show();
196 }
197 
198 
199 //	#pragma mark -
200 
201 
202 int
main(int argc,char ** argv)203 main(int argc, char **argv)
204 {
205 	if (argc > 1 && (!strcmp(argv[1], "false") || (isdigit(argv[1][0]) && atoi(argv[1]) == 0)))
206 		gAvoid = false;
207 
208 	Application app;
209 
210 	app.Run();
211 	return 0;
212 }
213