1ff89d51eSStephan Aßmus
2*727653f7SStephan Aßmus #include <math.h>
3ff89d51eSStephan Aßmus #include <stdio.h>
4*727653f7SStephan Aßmus #include <stdlib.h>
5ff89d51eSStephan Aßmus
6ff89d51eSStephan Aßmus #include <Message.h>
7ff89d51eSStephan Aßmus #include <MessageQueue.h>
8*727653f7SStephan Aßmus #include <MessageRunner.h>
9*727653f7SStephan Aßmus #include <Messenger.h>
10*727653f7SStephan Aßmus #include <Rect.h>
11ff89d51eSStephan Aßmus #include <String.h>
12ff89d51eSStephan Aßmus
13ff89d51eSStephan Aßmus #include "WindowLayer.h"
14ff89d51eSStephan Aßmus
15ff89d51eSStephan Aßmus #include "ClientLooper.h"
16ff89d51eSStephan Aßmus
17ff89d51eSStephan Aßmus #define SLOW_DRAWING 0
18ff89d51eSStephan Aßmus
19*727653f7SStephan Aßmus #define SPEED 2.0
20*727653f7SStephan Aßmus
21*727653f7SStephan Aßmus // random_number_between
22*727653f7SStephan Aßmus static float
random_number_between(float v1,float v2)23*727653f7SStephan Aßmus random_number_between(float v1, float v2)
24*727653f7SStephan Aßmus {
25*727653f7SStephan Aßmus if (v1 < v2)
26*727653f7SStephan Aßmus return v1 + fmod(rand() / 1000.0, (v2 - v1));
27*727653f7SStephan Aßmus else if (v2 < v1)
28*727653f7SStephan Aßmus return v2 + fmod(rand() / 1000.0, (v1 - v2));
29*727653f7SStephan Aßmus return v1;
30*727653f7SStephan Aßmus }
31*727653f7SStephan Aßmus
32*727653f7SStephan Aßmus // init_polygon
33*727653f7SStephan Aßmus static void
init_polygon(const BRect & b,point * polygon)34*727653f7SStephan Aßmus init_polygon(const BRect& b, point* polygon)
35*727653f7SStephan Aßmus {
36*727653f7SStephan Aßmus polygon[0].x = b.left;
37*727653f7SStephan Aßmus polygon[0].y = b.top;
38*727653f7SStephan Aßmus polygon[0].direction_x = random_number_between(-SPEED, SPEED);
39*727653f7SStephan Aßmus polygon[0].direction_y = random_number_between(-SPEED, SPEED);
40*727653f7SStephan Aßmus polygon[1].x = b.right;
41*727653f7SStephan Aßmus polygon[1].y = b.top;
42*727653f7SStephan Aßmus polygon[1].direction_x = random_number_between(-SPEED, SPEED);
43*727653f7SStephan Aßmus polygon[1].direction_y = random_number_between(-SPEED, SPEED);
44*727653f7SStephan Aßmus polygon[2].x = b.right;
45*727653f7SStephan Aßmus polygon[2].y = b.bottom;
46*727653f7SStephan Aßmus polygon[2].direction_x = random_number_between(-SPEED, SPEED);
47*727653f7SStephan Aßmus polygon[2].direction_y = random_number_between(-SPEED, SPEED);
48*727653f7SStephan Aßmus polygon[3].x = b.left;
49*727653f7SStephan Aßmus polygon[3].y = b.bottom;
50*727653f7SStephan Aßmus polygon[3].direction_x = random_number_between(-SPEED, SPEED);
51*727653f7SStephan Aßmus polygon[3].direction_y = random_number_between(-SPEED, SPEED);
52*727653f7SStephan Aßmus }
53*727653f7SStephan Aßmus
54*727653f7SStephan Aßmus // morph
55*727653f7SStephan Aßmus static inline void
morph(double * value,double * direction,double min,double max)56*727653f7SStephan Aßmus morph(double* value, double* direction, double min, double max)
57*727653f7SStephan Aßmus {
58*727653f7SStephan Aßmus *value += *direction;
59*727653f7SStephan Aßmus if (*value < min) {
60*727653f7SStephan Aßmus *value = min;
61*727653f7SStephan Aßmus *direction = -*direction;
62*727653f7SStephan Aßmus } else if (*value > max) {
63*727653f7SStephan Aßmus *value = max;
64*727653f7SStephan Aßmus *direction = -*direction;
65*727653f7SStephan Aßmus }
66*727653f7SStephan Aßmus }
67*727653f7SStephan Aßmus
68*727653f7SStephan Aßmus // morph_polygon
69*727653f7SStephan Aßmus static inline void
morph_polygon(const BRect & b,point * polygon)70*727653f7SStephan Aßmus morph_polygon(const BRect& b, point* polygon)
71*727653f7SStephan Aßmus {
72*727653f7SStephan Aßmus morph(&polygon[0].x, &polygon[0].direction_x, b.left, b.right);
73*727653f7SStephan Aßmus morph(&polygon[1].x, &polygon[1].direction_x, b.left, b.right);
74*727653f7SStephan Aßmus morph(&polygon[2].x, &polygon[2].direction_x, b.left, b.right);
75*727653f7SStephan Aßmus morph(&polygon[3].x, &polygon[3].direction_x, b.left, b.right);
76*727653f7SStephan Aßmus morph(&polygon[0].y, &polygon[0].direction_y, b.top, b.bottom);
77*727653f7SStephan Aßmus morph(&polygon[1].y, &polygon[1].direction_y, b.top, b.bottom);
78*727653f7SStephan Aßmus morph(&polygon[2].y, &polygon[2].direction_y, b.top, b.bottom);
79*727653f7SStephan Aßmus morph(&polygon[3].y, &polygon[3].direction_y, b.top, b.bottom);
80*727653f7SStephan Aßmus }
81*727653f7SStephan Aßmus
82*727653f7SStephan Aßmus
83*727653f7SStephan Aßmus
84ff89d51eSStephan Aßmus // constructor
ClientLooper(const char * name,WindowLayer * serverWindow)85ff89d51eSStephan Aßmus ClientLooper::ClientLooper(const char* name, WindowLayer* serverWindow)
864dd89c69SStephan Aßmus : BLooper("", B_DISPLAY_PRIORITY),
87ff89d51eSStephan Aßmus fServerWindow(serverWindow),
88ff89d51eSStephan Aßmus fViewCount(0)
89ff89d51eSStephan Aßmus {
90ff89d51eSStephan Aßmus BString clientName(name);
91ff89d51eSStephan Aßmus clientName << " client";
92ff89d51eSStephan Aßmus SetName(clientName.String());
93*727653f7SStephan Aßmus
94*727653f7SStephan Aßmus BMessenger messenger(this);
95*727653f7SStephan Aßmus fTicker = new BMessageRunner(messenger, new BMessage(MSG_TICK), 40000);
96*727653f7SStephan Aßmus
97*727653f7SStephan Aßmus init_polygon(BRect(0, 0, 100, 100), fPolygon);
98ff89d51eSStephan Aßmus }
99ff89d51eSStephan Aßmus
100ff89d51eSStephan Aßmus // destructor
~ClientLooper()101ff89d51eSStephan Aßmus ClientLooper::~ClientLooper()
102ff89d51eSStephan Aßmus {
103*727653f7SStephan Aßmus delete fTicker;
104ff89d51eSStephan Aßmus }
105ff89d51eSStephan Aßmus
106ff89d51eSStephan Aßmus // MessageReceived
107ff89d51eSStephan Aßmus void
MessageReceived(BMessage * message)108ff89d51eSStephan Aßmus ClientLooper::MessageReceived(BMessage* message)
109ff89d51eSStephan Aßmus {
110ff89d51eSStephan Aßmus switch (message->what) {
111ff89d51eSStephan Aßmus case MSG_UPDATE:
112ff89d51eSStephan Aßmus
113ff89d51eSStephan Aßmus fServerWindow->PostMessage(MSG_BEGIN_UPDATE);
114ff89d51eSStephan Aßmus
115ff89d51eSStephan Aßmus for (int32 i = 0; i < fViewCount; i++) {
116ff89d51eSStephan Aßmus // the client is slow
117f5552ed0SStephan Aßmus // snooze(40000L);
118ff89d51eSStephan Aßmus // send the command to redraw a view
119*727653f7SStephan Aßmus if (i == 5) {
120*727653f7SStephan Aßmus _DrawAnimatedLayer(i);
121*727653f7SStephan Aßmus } else {
122ff89d51eSStephan Aßmus BMessage command(MSG_DRAWING_COMMAND);
123ff89d51eSStephan Aßmus command.AddInt32("token", i);
124ff89d51eSStephan Aßmus fServerWindow->PostMessage(&command);
125ff89d51eSStephan Aßmus }
126*727653f7SStephan Aßmus }
127ff89d51eSStephan Aßmus
128ff89d51eSStephan Aßmus fServerWindow->PostMessage(MSG_END_UPDATE);
129ff89d51eSStephan Aßmus
130ff89d51eSStephan Aßmus break;
131ff89d51eSStephan Aßmus case MSG_VIEWS_ADDED: {
132ff89d51eSStephan Aßmus int32 count;
133ff89d51eSStephan Aßmus if (message->FindInt32("count", &count) >= B_OK) {
134ff89d51eSStephan Aßmus fViewCount += count;
135ff89d51eSStephan Aßmus }
136ff89d51eSStephan Aßmus break;
137ff89d51eSStephan Aßmus }
138ff89d51eSStephan Aßmus case MSG_VIEWS_REMOVED: {
139ff89d51eSStephan Aßmus int32 count;
140ff89d51eSStephan Aßmus if (message->FindInt32("count", &count) >= B_OK)
141ff89d51eSStephan Aßmus fViewCount -= count;
142ff89d51eSStephan Aßmus break;
143ff89d51eSStephan Aßmus }
1448c8275c2SStephan Aßmus
1458c8275c2SStephan Aßmus case MSG_WINDOW_HIDDEN:
1468c8275c2SStephan Aßmus // there is no way we're going to accept this
1478c8275c2SStephan Aßmus // discrimination for longer than 2 seconds!
1488c8275c2SStephan Aßmus snooze(2000000);
1498c8275c2SStephan Aßmus fServerWindow->PostMessage(MSG_SHOW);
1508c8275c2SStephan Aßmus break;
1518c8275c2SStephan Aßmus
152*727653f7SStephan Aßmus case MSG_TICK: {
153*727653f7SStephan Aßmus BMessage invalidate(MSG_INVALIDATE_VIEW);
154*727653f7SStephan Aßmus invalidate.AddInt32("token", 5);
155*727653f7SStephan Aßmus fServerWindow->PostMessage(&invalidate);
156*727653f7SStephan Aßmus
157*727653f7SStephan Aßmus morph_polygon(BRect(0, 0, 100, 100), fPolygon);
158*727653f7SStephan Aßmus break;
159*727653f7SStephan Aßmus }
160*727653f7SStephan Aßmus
161ff89d51eSStephan Aßmus default:
162ff89d51eSStephan Aßmus BLooper::MessageReceived(message);
163ff89d51eSStephan Aßmus break;
164ff89d51eSStephan Aßmus }
165ff89d51eSStephan Aßmus }
166*727653f7SStephan Aßmus
167*727653f7SStephan Aßmus // _DrawAnimatedLayer
168*727653f7SStephan Aßmus void
_DrawAnimatedLayer(int32 token)169*727653f7SStephan Aßmus ClientLooper::_DrawAnimatedLayer(int32 token)
170*727653f7SStephan Aßmus {
171*727653f7SStephan Aßmus BMessage message(MSG_DRAW_POLYGON);
172*727653f7SStephan Aßmus message.AddInt32("token", token);
173*727653f7SStephan Aßmus
174*727653f7SStephan Aßmus message.AddPoint("point", BPoint(fPolygon[0].x, fPolygon[0].y));
175*727653f7SStephan Aßmus message.AddPoint("point", BPoint(fPolygon[1].x, fPolygon[1].y));
176*727653f7SStephan Aßmus message.AddPoint("point", BPoint(fPolygon[2].x, fPolygon[2].y));
177*727653f7SStephan Aßmus message.AddPoint("point", BPoint(fPolygon[3].x, fPolygon[3].y));
178*727653f7SStephan Aßmus
179*727653f7SStephan Aßmus fServerWindow->PostMessage(&message);
180*727653f7SStephan Aßmus }
181*727653f7SStephan Aßmus
182