Release 980301
[wine/hacks.git] / programs / clock / winclock.c
blob4e7af5fd6af02c41589a2dcc71c844fd4b83ed3a
1 /*
2 * Clock (winclock.c)
4 * Copyright 1998 by Marcel Baur <mbaur@g26.ethz.ch>
6 * This file is based on rolex.c by Jim Peterson.
8 * I just managed to move the relevant parts into the Clock application
9 * and made it look like the original Windows one. You can find the original
10 * rolex.c in the wine /libtest directory.
12 * Original file header:
13 * >
14 * > rolex.c: Windows clock application for WINE (by Jim Peterson)
15 * >
16 * > This is a translation of a Turbo Pascal OWL application I made
17 * > once, so it's a little flaky (tons of globals, functions that
18 * > could have been in-lined, etc.). The source code should easily
19 * > compile with a standard Win32 C compiler.
20 * >
21 * > To try it out, type 'make rolex'.
22 * >
26 #include <math.h>
27 #include <string.h>
28 #include "winclock.h"
29 #include "windows.h"
30 #include "main.h"
32 COLORREF FaceColor = RGB(192,192,192);
33 COLORREF HandColor = RGB(0,0,0);
34 COLORREF EtchColor = RGB(0,0,0);
36 float Pi=3.1415926;
38 HandData OldSecond,OldHour,OldMinute;
40 int MiddleX(void) {
41 int X, diff;
43 X = (Globals.MaxX/2);
44 diff = (Globals.MaxX-Globals.MaxY);
45 if (diff>0) { X = (X-(diff/2)); }
46 return X;
49 int MiddleY(void) {
50 int Y, diff;
52 Y = (Globals.MaxY/2);
53 diff = (Globals.MaxX-Globals.MaxY);
54 if (diff<0) { Y = Y+(diff/2); }
55 return Y;
58 void DrawFace(HDC dc)
60 int MidX, MidY, t, DiffX, DiffY;
62 MidX = MiddleX();
63 MidY = MiddleY();
64 DiffX = (Globals.MaxX-MidX*2)/2;
65 DiffY = (Globals.MaxY-MidY*2)/2;
67 SelectObject(dc,CreateSolidBrush(FaceColor));
68 SelectObject(dc,CreatePen(PS_SOLID,1,EtchColor));
69 Ellipse(dc,DiffX,DiffY,2*MidX+DiffX,2*MidY+DiffY);
71 for(t=0; t<12; t++)
73 MoveToEx(dc,(MidX+DiffX)+sin(t*Pi/6)*0.9*MidX,(MidY+DiffY)-cos(t*Pi/6)*0.9*MidY,NULL);
74 LineTo(dc,(MidY+DiffX)+sin(t*Pi/6)*0.8*MidX,(MidY+DiffY)-cos(t*Pi/6)*0.8*MidY);
76 if(Globals.MaxX>64 && Globals.MaxY>64)
77 for(t=0; t<60; t++)
78 SetPixel(dc,(MidX+DiffX)+sin(t*Pi/30)*0.9*MidX,(MidY+DiffY)-cos(t*Pi/30)*0.9*MidY
79 ,EtchColor);
80 DeleteObject(SelectObject(dc,GetStockObject(NULL_BRUSH)));
81 DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN)));
82 memset(&OldSecond,0,sizeof(OldSecond));
83 memset(&OldMinute,0,sizeof(OldMinute));
84 memset(&OldHour,0,sizeof(OldHour));
87 void DrawHourHand(HDC dc)
89 MoveToEx(dc, OldHour.StartX, OldHour.StartY, NULL);
90 LineTo(dc, OldHour.EndX, OldHour.EndY);
93 void DrawMinuteHand(HDC dc)
95 MoveToEx(dc, OldMinute.StartX, OldMinute.StartY, NULL);
96 LineTo(dc, OldMinute.EndX, OldMinute.EndY);
99 void DrawSecondHand(HDC dc)
101 MoveToEx(dc, OldSecond.StartX, OldSecond.StartY, NULL);
102 LineTo(dc, OldSecond.EndX, OldSecond.EndY);
105 BOOL UpdateHourHand(HDC dc,int MidX,int MidY,int XExt,int YExt,WORD Pos)
107 int Sx, Sy, Ex, Ey;
108 BOOL rv;
110 rv = FALSE;
111 Sx = MidX; Sy = MidY;
112 Ex = MidX+sin(Pos*Pi/6000)*XExt;
113 Ey = MidY-cos(Pos*Pi/6000)*YExt;
114 rv = ( Sx!=OldHour.StartX || Ex!=OldHour.EndX ||
115 Sy!=OldHour.StartY || Ey!=OldHour.EndY );
116 if (Globals.bAnalog && rv)DrawHourHand(dc);
117 OldHour.StartX = Sx; OldHour.EndX = Ex;
118 OldHour.StartY = Sy; OldHour.EndY = Ey;
119 return rv;
122 BOOL UpdateMinuteHand(HDC dc,int MidX,int MidY,int XExt,int YExt,WORD Pos)
124 int Sx, Sy, Ex, Ey;
125 BOOL rv;
127 rv = FALSE;
128 Sx = MidX; Sy = MidY;
129 Ex = MidX+sin(Pos*Pi/30000)*XExt;
130 Ey = MidY-cos(Pos*Pi/30000)*YExt;
131 rv = ( Sx!=OldMinute.StartX || Ex!=OldMinute.EndX ||
132 Sy!=OldMinute.StartY || Ey!=OldMinute.EndY );
133 if (Globals.bAnalog && rv)DrawMinuteHand(dc);
134 OldMinute.StartX = Sx; OldMinute.EndX = Ex;
135 OldMinute.StartY = Sy; OldMinute.EndY = Ey;
136 return rv;
139 BOOL UpdateSecondHand(HDC dc,int MidX,int MidY,int XExt,int YExt,WORD Pos)
141 int Sx, Sy, Ex, Ey;
142 BOOL rv;
144 rv = FALSE;
146 if (Globals.bSeconds) {
147 Sx = MidX; Sy = MidY;
148 Ex = MidX+sin(Pos*Pi/3000)*XExt;
149 Ey = MidY-cos(Pos*Pi/3000)*YExt;
150 rv = ( Sx!=OldSecond.StartX || Ex!=OldSecond.EndX ||
151 Sy!=OldSecond.StartY || Ey!=OldSecond.EndY );
152 if (Globals.bAnalog && rv)DrawSecondHand(dc);
153 OldSecond.StartX = Sx; OldSecond.EndX = Ex;
154 OldSecond.StartY = Sy; OldSecond.EndY = Ey;
157 return rv;
160 void Idle(HDC idc)
162 SYSTEMTIME st;
163 WORD H, M, S, F;
164 int MidX, MidY, DiffX, DiffY;
165 HDC dc;
166 BOOL Redraw;
168 if(idc)
169 dc=idc;
170 else
171 dc=GetDC(Globals.hMainWnd);
172 if(!dc)return;
174 GetLocalTime(&st);
175 H = st.wHour;
176 M = st.wMinute;
177 S = st.wSecond;
178 F = st.wMilliseconds / 10;
179 F = F + S*100;
180 M = M*1000+F/6;
181 H = H*1000+M/60;
182 MidX = MiddleX();
183 MidY = MiddleY();
184 DiffX = (Globals.MaxX-MidX*2)/2;
185 DiffY = (Globals.MaxY-MidY*2)/2;
187 SelectObject(dc,CreatePen(PS_SOLID,1,FaceColor));
188 Redraw = FALSE;
189 if(UpdateHourHand(dc,MidX+DiffX,MidY+DiffY,MidX*0.5,MidY*0.5,H)) Redraw = TRUE;
190 if(UpdateMinuteHand(dc,MidX+DiffX,MidY+DiffY,MidX*0.65,MidY*0.65,M)) Redraw = TRUE;
191 if(UpdateSecondHand(dc,MidX+DiffX,MidY+DiffY,MidX*0.79,MidY*0.79,F)) Redraw = TRUE;
192 if (Globals.bAnalog)
194 DeleteObject(SelectObject(dc,CreatePen(PS_SOLID,1,HandColor)));
195 if(Redraw)
197 DrawSecondHand(dc);
198 DrawMinuteHand(dc);
199 DrawHourHand(dc);
201 DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN)));
203 if(!idc) ReleaseDC(Globals.hMainWnd,dc);
206 // class.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);