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