- Properly disable the second hand.
[wine] / programs / clock / main.c
1 /*
2  * Clock
3  *
4  * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
5  *
6  * Clock is partially based on
7  * - Program Manager by Ulrich Schmied
8  * - rolex.c by Jim Peterson
9  *
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with this library; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24  */
25
26 #include "config.h"
27
28 #include <stdio.h>
29
30 #include "windows.h"
31 #include "commdlg.h"
32
33 #include "main.h"
34 #include "license.h"
35 #include "language.h"
36 #include "winclock.h"
37
38 #define INITIAL_WINDOW_SIZE 200
39 #define TIMER_ID 1
40
41 CLOCK_GLOBALS Globals;
42
43 /***********************************************************************
44  *
45  *           CLOCK_ResetTimer
46  */
47 static BOOL CLOCK_ResetTimer(void)
48 {
49     UINT period; /* milliseconds */
50
51     KillTimer(Globals.hMainWnd, TIMER_ID);
52
53     if (Globals.bSeconds)
54         if (Globals.bAnalog)
55             period = 50;
56         else
57             period = 500;
58     else
59         period = 1000;
60
61     if (!SetTimer (Globals.hMainWnd, TIMER_ID, period, NULL)) {
62         CHAR szApp[MAX_STRING_LEN];
63         LoadString(Globals.hInstance, IDS_CLOCK, szApp, sizeof(szApp));
64         MessageBox(0, "No available timers", szApp, MB_ICONEXCLAMATION | MB_OK);
65         return FALSE;
66     }
67     return TRUE;
68 }
69
70 /***********************************************************************
71  *
72  *           CLOCK_MenuCommand
73  *
74  *  All handling of main menu events
75  */
76
77 int CLOCK_MenuCommand (WPARAM wParam)
78 {
79     CHAR szApp[MAX_STRING_LEN];
80     CHAR szAppRelease[MAX_STRING_LEN];
81     switch (wParam) {
82         /* switch to analog */
83         case IDM_ANALOG: {
84             Globals.bAnalog = TRUE;
85             LANGUAGE_UpdateMenuCheckmarks();
86             CLOCK_ResetTimer();
87             InvalidateRect(Globals.hMainWnd, NULL, FALSE);
88             break;
89         }
90             /* switch to digital */
91         case IDM_DIGITAL: {
92             Globals.bAnalog = FALSE;
93             LANGUAGE_UpdateMenuCheckmarks();
94             CLOCK_ResetTimer();
95             InvalidateRect(Globals.hMainWnd, NULL, FALSE);
96             break;
97         }
98             /* change font */
99         case IDM_FONT: {
100             MAIN_FileChooseFont();
101             break;
102         }
103             /* hide title bar */
104         case IDM_NOTITLE: {
105             Globals.bWithoutTitle = !Globals.bWithoutTitle;
106             LANGUAGE_UpdateWindowCaption();
107             LANGUAGE_UpdateMenuCheckmarks();
108             break;
109         }
110             /* always on top */
111         case IDM_ONTOP: {
112             Globals.bAlwaysOnTop = !Globals.bAlwaysOnTop;
113             LANGUAGE_UpdateMenuCheckmarks();
114             break;
115         }
116             /* show or hide seconds */
117         case IDM_SECONDS: {
118             Globals.bSeconds = !Globals.bSeconds;
119             LANGUAGE_UpdateMenuCheckmarks();
120             CLOCK_ResetTimer();
121             InvalidateRect(Globals.hMainWnd, NULL, FALSE);
122             break;
123         }
124             /* show or hide date */
125         case IDM_DATE: {
126             Globals.bDate = !Globals.bDate;
127             LANGUAGE_UpdateMenuCheckmarks();
128             LANGUAGE_UpdateWindowCaption();
129             break;
130         }
131             /* show license */
132         case IDM_LICENSE: {
133             WineLicense(Globals.hMainWnd);
134             break;
135         }
136             /* show warranties */
137         case IDM_NOWARRANTY: {
138             WineWarranty(Globals.hMainWnd);
139             break;
140         }
141             /* show "about" box */
142         case IDM_ABOUT: {
143             LoadString(Globals.hInstance, IDS_CLOCK, szApp, sizeof(szApp));
144             lstrcpy(szAppRelease,szApp);
145             lstrcat(szAppRelease,"\n" PACKAGE_STRING);
146             ShellAbout(Globals.hMainWnd, szApp, szAppRelease, 0);
147             break;
148         }
149     }
150     return 0;
151 }
152
153 VOID MAIN_FileChooseFont(VOID)
154 {
155     CHOOSEFONT font;
156     LOGFONT      lf;
157     
158     font.lStructSize     = sizeof(font);
159     font.hwndOwner       = Globals.hMainWnd;
160     font.hDC             = NULL;
161     font.lpLogFont       = &lf;
162     font.iPointSize      = 0;
163     font.Flags           = 0;
164     font.rgbColors       = 0;
165     font.lCustData       = 0;
166     font.lpfnHook        = 0;
167     font.lpTemplateName  = 0;
168     font.hInstance       = Globals.hInstance;
169 /*    font.lpszStyle       = LF_FACESIZE; */
170     font.nFontType       = 0;
171     font.nSizeMin        = 0;
172     font.nSizeMax        = 144;
173     
174     if (ChooseFont(&font)) {
175         /* do nothing yet */
176     }
177 }
178
179 /***********************************************************************
180  *
181  *           CLOCK_WndProc
182  */
183
184 LRESULT WINAPI CLOCK_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
185 {
186     switch (msg) {
187       
188         case WM_CREATE: {
189             break;
190         }
191
192         case WM_RBUTTONUP: {
193             Globals.bWithoutTitle = !Globals.bWithoutTitle;
194             LANGUAGE_UpdateMenuCheckmarks();
195             LANGUAGE_UpdateWindowCaption();
196             UpdateWindow (Globals.hMainWnd);
197             break;
198         }
199
200         case WM_PAINT: {
201             PAINTSTRUCT ps;
202             HDC context;
203             
204             context = BeginPaint(hWnd, &ps);
205             if(Globals.bAnalog)
206                 AnalogClock(context, Globals.MaxX, Globals.MaxY, Globals.bSeconds);
207             else
208                 DigitalClock(context, Globals.MaxX, Globals.MaxY, Globals.bSeconds);
209             EndPaint(hWnd, &ps);
210             break;
211         }
212
213         case WM_SIZE: {
214             Globals.MaxX = LOWORD(lParam);
215             Globals.MaxY = HIWORD(lParam);
216             break;
217         }
218
219         case WM_COMMAND: {
220             CLOCK_MenuCommand(wParam);
221             break;
222         }
223             
224         case WM_TIMER: {
225             /* Could just invalidate what has changed,
226              * but it doesn't really seem worth the effort
227              */
228             InvalidateRect(Globals.hMainWnd, NULL, FALSE);
229             break;
230         }
231
232         case WM_DESTROY: {
233             PostQuitMessage (0);
234             break;
235         }
236
237         default:
238             return DefWindowProc (hWnd, msg, wParam, lParam);
239     }
240     return 0;
241 }
242
243
244 /***********************************************************************
245  *
246  *           WinMain
247  */
248
249 int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE prev, LPSTR cmdline, int show)
250 {
251     MSG      msg;
252     WNDCLASS class;
253     
254     char szClassName[] = "CLClass";  /* To make sure className >= 0x10000 */
255     char szWinName[]   = "Clock";
256     
257     /* Setup Globals */
258     Globals.bAnalog         = TRUE;
259     Globals.bSeconds        = TRUE;
260     Globals.lpszIniFile     = "clock.ini";
261     Globals.lpszIcoFile     = "clock.ico";
262     
263     Globals.hInstance       = hInstance;
264     Globals.hMainIcon       = ExtractIcon(Globals.hInstance,
265                                           Globals.lpszIcoFile, 0);
266     
267     if (!Globals.hMainIcon)
268         Globals.hMainIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
269     
270     if (!prev){
271         class.style         = CS_HREDRAW | CS_VREDRAW;
272         class.lpfnWndProc   = CLOCK_WndProc;
273         class.cbClsExtra    = 0;
274         class.cbWndExtra    = 0;
275         class.hInstance     = Globals.hInstance;
276         class.hIcon         = LoadIcon (0, IDI_APPLICATION);
277         class.hCursor       = LoadCursor (0, IDC_ARROW);
278         class.hbrBackground = GetStockObject (GRAY_BRUSH);
279         class.lpszMenuName  = 0;
280         class.lpszClassName = szClassName;
281     }
282     
283     if (!RegisterClass (&class)) return FALSE;
284     
285     Globals.MaxX = Globals.MaxY = INITIAL_WINDOW_SIZE;
286     Globals.hMainWnd = CreateWindow (szClassName, szWinName, WS_OVERLAPPEDWINDOW,
287                                      CW_USEDEFAULT, CW_USEDEFAULT,
288                                      Globals.MaxX, Globals.MaxY, 0,
289                                      0, Globals.hInstance, 0);
290
291     if (!CLOCK_ResetTimer())
292         return FALSE;
293
294     LANGUAGE_LoadMenus();
295     SetMenu(Globals.hMainWnd, Globals.hMainMenu);
296     
297     LANGUAGE_UpdateMenuCheckmarks();
298     
299     ShowWindow (Globals.hMainWnd, show);
300     UpdateWindow (Globals.hMainWnd);
301     
302     while (GetMessage(&msg, 0, 0, 0)) {
303         TranslateMessage(&msg);
304         DispatchMessage(&msg);
305     }
306
307     KillTimer(Globals.hMainWnd, TIMER_ID);
308
309     return 0;
310 }