Changelog + Properly disable the second hand + Remove unneeded #include "winnls", #define MIN + Get the digital clock working
Only in programs/clock.5/: fixup.sed diff -u -r programs/clock.5/main.c programs/clock/main.c --- programs/clock.5/main.c 2003-11-28 16:23:39.000000000 +0000 +++ programs/clock/main.c 2003-11-29 16:46:27.000000000 +0000 @@ -37,12 +37,37 @@ #define INITIAL_WINDOW_SIZE 200 #define TIMER_ID 1 -#define TIMER_PERIOD 50 /* milliseconds */ CLOCK_GLOBALS Globals; /*********************************************************************** * + * CLOCK_ResetTimer + */ +static BOOL CLOCK_ResetTimer(void) +{ + KillTimer(Globals.hMainWnd, TIMER_ID); + UINT period; /* milliseconds */ + + if (Globals.bSeconds) + if (Globals.bAnalog) + period = 50; + else + period = 500; + else + period = 1000; + + if (!SetTimer (Globals.hMainWnd, TIMER_ID, period, NULL)) { + CHAR szApp[MAX_STRING_LEN]; + LoadString(Globals.hInstance, IDS_CLOCK, szApp, sizeof(szApp)); + MessageBox(0, "No available timers", szApp, MB_ICONEXCLAMATION | MB_OK); + return FALSE; + } + return TRUE; +} + +/*********************************************************************** + * * CLOCK_MenuCommand * * All handling of main menu events @@ -57,14 +82,16 @@ case IDM_ANALOG: { Globals.bAnalog = TRUE; LANGUAGE_UpdateMenuCheckmarks(); - SendMessage(Globals.hMainWnd, WM_PAINT, 0, 0); + CLOCK_ResetTimer(); + InvalidateRect(Globals.hMainWnd, NULL, FALSE); break; } /* switch to digital */ case IDM_DIGITAL: { Globals.bAnalog = FALSE; LANGUAGE_UpdateMenuCheckmarks(); - SendMessage(Globals.hMainWnd, WM_PAINT, 0, 0); + CLOCK_ResetTimer(); + InvalidateRect(Globals.hMainWnd, NULL, FALSE); break; } /* change font */ @@ -89,7 +116,8 @@ case IDM_SECONDS: { Globals.bSeconds = !Globals.bSeconds; LANGUAGE_UpdateMenuCheckmarks(); - SendMessage(Globals.hMainWnd, WM_PAINT, 0, 0); + CLOCK_ResetTimer(); + InvalidateRect(Globals.hMainWnd, NULL, FALSE); break; } /* show or hide date */ @@ -174,9 +202,9 @@ context = BeginPaint(hWnd, &ps); if(Globals.bAnalog) - AnalogClock(context, Globals.MaxX, Globals.MaxY); + AnalogClock(context, Globals.MaxX, Globals.MaxY, Globals.bSeconds); else - DigitalClock(context, Globals.MaxX, Globals.MaxY); + DigitalClock(context, Globals.MaxX, Globals.MaxY, Globals.bSeconds); EndPaint(hWnd, &ps); break; } @@ -193,7 +221,7 @@ } case WM_TIMER: { - /* Could just invalidate the changed hands, + /* Could just invalidate what has changed, * but it doesn't really seem worth the effort */ InvalidateRect(Globals.hMainWnd, NULL, FALSE); @@ -212,7 +240,6 @@ } - /*********************************************************************** * * WinMain @@ -260,10 +287,8 @@ Globals.MaxX, Globals.MaxY, 0, 0, Globals.hInstance, 0); - if (!SetTimer (Globals.hMainWnd, TIMER_ID, TIMER_PERIOD, NULL)) { - MessageBox(0, "No available timers", szWinName, MB_ICONEXCLAMATION | MB_OK); + if (!CLOCK_ResetTimer()) return FALSE; - } LANGUAGE_LoadMenus(); SetMenu(Globals.hMainWnd, Globals.hMainMenu); @@ -278,5 +303,7 @@ DispatchMessage(&msg); } + KillTimer(Globals.hMainWnd, TIMER_ID); + return 0; } diff -u -r programs/clock.5/winclock.c programs/clock/winclock.c --- programs/clock.5/winclock.c 2003-08-02 07:52:02.000000000 +0100 +++ programs/clock/winclock.c 2003-11-29 15:56:14.000000000 +0000 @@ -31,15 +31,14 @@ #include <stdlib.h> #include <string.h> #include "windows.h" -#include "winnls.h" #include "winclock.h" -#define MIN(a,b) (((a)<(b))?(a):(b)) - -COLORREF FaceColor = RGB(192,192,192); -COLORREF HandColor = RGB(0,0,0); -COLORREF EtchColor = RGB(0,0,0); - +static COLORREF FaceColor = RGB(192,192,192); +static COLORREF HandColor = RGB(0,0,0); +static COLORREF EtchColor = RGB(0,0,0); +static COLORREF GRAY = RGB(128,128,128); +static const int ETCH_DEPTH = 2; + typedef struct { POINT Start; @@ -83,10 +82,11 @@ LineTo(dc, hand->End.x, hand->End.y); } -static void DrawHands(HDC dc) +static void DrawHands(HDC dc, BOOL bSeconds) { SelectObject(dc,CreatePen(PS_SOLID,1,HandColor)); - DrawHand(dc, &SecondHand); + if (bSeconds) + DrawHand(dc, &SecondHand); DrawHand(dc, &MinuteHand); DrawHand(dc, &HourHand); DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN))); @@ -99,7 +99,7 @@ hand->End.y = centre->y - cos(angle)*length; } -static void PositionHands(const POINT* centre, int radius) +static void PositionHands(const POINT* centre, int radius, BOOL bSeconds) { SYSTEMTIME st; double hour, minute, second; @@ -114,40 +114,57 @@ PositionHand(centre, radius * 0.5, hour/12 * 2*M_PI, &HourHand); PositionHand(centre, radius * 0.65, minute/60 * 2*M_PI, &MinuteHand); - PositionHand(centre, radius * 0.79, second/60 * 2*M_PI, &SecondHand); + if (bSeconds) + PositionHand(centre, radius * 0.79, second/60 * 2*M_PI, &SecondHand); } -void AnalogClock(HDC dc, int x, int y) +void AnalogClock(HDC dc, int x, int y, BOOL bSeconds) { POINT centre; int radius; - radius = MIN(x, y)/2; + radius = min(x, y)/2; centre.x = x/2; centre.y = y/2; DrawFace(dc, ¢re, radius); - PositionHands(¢re, radius); - DrawHands(dc); + PositionHands(¢re, radius, bSeconds); + DrawHands(dc, bSeconds); } -void DigitalClock(HDC dc, int X, int Y) +void DigitalClock(HDC dc, int x, int y, BOOL bSeconds) { - /* FIXME - this doesn't work very well */ CHAR szTime[255]; - static short xChar, yChar; - TEXTMETRIC tm; - SYSTEMTIME st; - - GetLocalTime(&st); - GetTimeFormat(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, &st, NULL, - szTime, sizeof szTime); - xChar = tm.tmAveCharWidth; - yChar = tm.tmHeight; - xChar = 100; - yChar = 100; - - SelectObject(dc,CreatePen(PS_SOLID,1,FaceColor)); - TextOut (dc, xChar, yChar, szTime, strlen (szTime)); - DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN))); + SIZE extent; + LOGFONT lf; + double xscale, yscale; + HFONT oldFont; + + GetTimeFormat(LOCALE_USER_DEFAULT, bSeconds ? 0 : TIME_NOSECONDS, NULL, + NULL, szTime, sizeof (szTime)); + + memset(&lf, 0, sizeof (lf)); + lf.lfHeight = -20; + + x -= 2 * ETCH_DEPTH; + y -= 2 * ETCH_DEPTH; + + oldFont = SelectObject(dc, CreateFontIndirect(&lf)); + GetTextExtentPoint(dc, szTime, strlen(szTime), &extent); + xscale = (double)x/extent.cx; + yscale = (double)y/extent.cy; + lf.lfHeight *= min(xscale, yscale); + + DeleteObject(SelectObject(dc, CreateFontIndirect(&lf))); + GetTextExtentPoint(dc, szTime, strlen(szTime), &extent); + + SetBkColor(dc, GRAY); /* to match the background brush */ + SetTextColor(dc, EtchColor); + TextOut(dc, (x - extent.cx)/2 + ETCH_DEPTH, (y - extent.cy)/2 + ETCH_DEPTH, + szTime, strlen(szTime)); + SetBkMode(dc, TRANSPARENT); + + SetTextColor(dc, FaceColor); + TextOut(dc, (x - extent.cx)/2, (y - extent.cy)/2, szTime, strlen(szTime)); + DeleteObject(SelectObject(dc, oldFont)); } diff -u -r programs/clock.5/winclock.h programs/clock/winclock.h --- programs/clock.5/winclock.h 2003-07-17 08:49:18.000000000 +0100 +++ programs/clock/winclock.h 2003-11-28 17:39:42.000000000 +0000 @@ -21,5 +21,5 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -void AnalogClock(HDC dc, int X, int Y); -void DigitalClock(HDC dc, int X, int Y); +void AnalogClock(HDC dc, int X, int Y, BOOL bSeconds); +void DigitalClock(HDC dc, int X, int Y, BOOL bSeconds);