[clock07] Implement remaining menu items
Richard Cohen
richard at daijobu.co.uk
Mon Dec 8 06:20:07 CST 2003
Unfortunately 'Always on Top', 'L button drag' & ''No titlebar' don't
work except in desktop mode, but I checked that the code works fine on XP
Deleted language.c,h
Changelog
+ Implement 'Choose font', 'No title', 'Always on Top'
+ Paint to offscreen bitmap to eliminate flicker
+ Put 'Always on top' on the main menu not the system menu
+ Date format should be DATE_LONGDATE
+ L button drag to move
+ Cosmetic adjustments
-------------- next part --------------
diff -u -r programs/clock/clock_res.h programs/clock/clock_res.h
--- programs/clock/clock_res.h 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/clock_res.h 2003-12-08 11:25:47.000000000 +0000
@@ -31,4 +31,3 @@
#define IDM_ONTOP 0x113
#define IDS_CLOCK 0x10C
-#define IDS_ONTOP 0x10D
diff -u -r programs/clock/Da.rc programs/clock/Da.rc
--- programs/clock/Da.rc 2003-12-03 15:35:26.000000000 +0000
+++ programs/clock/Da.rc 2003-12-08 11:34:11.000000000 +0000
@@ -31,6 +31,8 @@
MENUITEM SEPARATOR
MENUITEM "Se&kunder", IDM_SECONDS
MENUITEM "Da&to", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Altid øverst", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Licens...", IDM_LICENSE
@@ -42,5 +44,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
{
IDS_CLOCK, "Ur"
-IDS_ONTOP, "&Altid øverst"
}
diff -u -r programs/clock/De.rc programs/clock/De.rc
--- programs/clock/De.rc 2003-12-03 15:35:26.000000000 +0000
+++ programs/clock/De.rc 2003-12-08 11:34:11.000000000 +0000
@@ -31,6 +31,8 @@
MENUITEM SEPARATOR
MENUITEM "&Sekunden", IDM_SECONDS
MENUITEM "&Datum", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Immer im Vordergrund", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Lizenz...", IDM_LICENSE
@@ -42,5 +44,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT
{
IDS_CLOCK, "Uhr"
-IDS_ONTOP, "&Immer im Vordergrund"
}
diff -u -r programs/clock/En.rc programs/clock/En.rc
--- programs/clock/En.rc 2003-12-03 15:35:26.000000000 +0000
+++ programs/clock/En.rc 2003-12-08 11:34:11.000000000 +0000
@@ -33,6 +33,8 @@
MENUITEM SEPARATOR
MENUITEM "&Seconds", IDM_SECONDS
MENUITEM "&Date", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Always on Top", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&License...", IDM_LICENSE
@@ -44,5 +46,4 @@
STRINGTABLE DISCARDABLE
{
IDS_CLOCK, "Clock"
-IDS_ONTOP, "&Always on Top"
}
diff -u -r programs/clock/Es.rc programs/clock/Es.rc
--- programs/clock/Es.rc 2003-12-03 15:35:26.000000000 +0000
+++ programs/clock/Es.rc 2003-12-08 11:34:11.000000000 +0000
@@ -33,6 +33,8 @@
MENUITEM SEPARATOR
MENUITEM "&Segundos", IDM_SECONDS
MENUITEM "Fe&cha", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "Siempre &visible", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Licencia...", IDM_LICENSE
@@ -44,5 +46,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_SPANISH, SUBLANG_DEFAULT
{
IDS_CLOCK, "Reloj"
-IDS_ONTOP, "Siempre &visible"
}
diff -u -r programs/clock/Fi.rc programs/clock/Fi.rc
--- programs/clock/Fi.rc 2003-12-03 15:35:26.000000000 +0000
+++ programs/clock/Fi.rc 2003-12-08 11:34:11.000000000 +0000
@@ -31,6 +31,8 @@
MENUITEM SEPARATOR
MENUITEM "&Sekunnit", IDM_SECONDS
MENUITEM "&Päivämäärä", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Aina päällimmäisenä", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Lisenssi...", IDM_LICENSE
@@ -42,5 +44,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT
{
IDS_CLOCK, "Kello"
-IDS_ONTOP, "&Aina päällimmäisenä"
}
diff -u -r programs/clock/Fr.rc programs/clock/Fr.rc
--- programs/clock/Fr.rc 2003-12-03 15:35:26.000000000 +0000
+++ programs/clock/Fr.rc 2003-12-08 11:34:11.000000000 +0000
@@ -33,6 +33,8 @@
MENUITEM SEPARATOR
MENUITEM "&Secondes", IDM_SECONDS
MENUITEM "&Date", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Toujours visible", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Licence...", IDM_LICENSE
@@ -44,5 +46,4 @@
STRINGTABLE DISCARDABLE
{
IDS_CLOCK, "Horloge"
-IDS_ONTOP, "&Toujours visible"
}
diff -u -r programs/clock/Hu.rc programs/clock/Hu.rc
--- programs/clock/Hu.rc 2003-12-03 15:35:26.000000000 +0000
+++ programs/clock/Hu.rc 2003-12-08 11:34:11.000000000 +0000
@@ -32,6 +32,8 @@
MENUITEM SEPARATOR
MENUITEM "&Másodperc", IDM_SECONDS
MENUITEM "&Dátum", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Mindig legfelül", IDM_ONTOP
}
POPUP "Inf&ormáció" {
MENUITEM "&Licenc...", IDM_LICENSE
@@ -43,5 +45,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
{
IDS_CLOCK, "Óra"
-IDS_ONTOP, "&Mindig legfelül"
}
diff -u -r programs/clock/It.rc programs/clock/It.rc
--- programs/clock/It.rc 2003-12-03 15:35:26.000000000 +0000
+++ programs/clock/It.rc 2003-12-08 11:34:11.000000000 +0000
@@ -34,6 +34,8 @@
MENUITEM SEPARATOR
MENUITEM "&Secondi", IDM_SECONDS
MENUITEM "&Data", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Sempre in primo piano", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Licenza...", IDM_LICENSE
@@ -45,5 +47,4 @@
STRINGTABLE DISCARDABLE
{
IDS_CLOCK, "Orologio"
-IDS_ONTOP, "&Sempre in primo piano"
}
Only in programs/clock/: language.c
Only in programs/clock/: language.h
diff -u -r programs/clock/main.c programs/clock/main.c
--- programs/clock/main.c 2003-12-03 15:35:28.000000000 +0000
+++ programs/clock/main.c 2003-12-08 11:45:03.000000000 +0000
@@ -23,8 +23,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#include "config.h"
-
#include <stdio.h>
#include "windows.h"
@@ -32,7 +30,6 @@
#include "main.h"
#include "license.h"
-#include "language.h"
#include "winclock.h"
#define INITIAL_WINDOW_SIZE 200
@@ -40,6 +37,54 @@
CLOCK_GLOBALS Globals;
+static VOID CLOCK_UpdateMenuCheckmarks(VOID)
+{
+ HMENU hPropertiesMenu;
+ hPropertiesMenu = GetSubMenu(Globals.hMainMenu, 0);
+ if (!hPropertiesMenu)
+ return;
+
+ if(Globals.bAnalog) {
+
+ /* analog clock */
+ CheckMenuRadioItem(hPropertiesMenu, IDM_ANALOG, IDM_DIGITAL, IDM_ANALOG, MF_CHECKED);
+ EnableMenuItem(hPropertiesMenu, IDM_FONT, MF_GRAYED);
+ }
+ else
+ {
+ /* digital clock */
+ CheckMenuRadioItem(hPropertiesMenu, IDM_ANALOG, IDM_DIGITAL, IDM_DIGITAL, MF_CHECKED);
+ EnableMenuItem(hPropertiesMenu, IDM_FONT, 0);
+ }
+
+ CheckMenuItem(hPropertiesMenu, IDM_NOTITLE, (Globals.bWithoutTitle ? MF_CHECKED : MF_UNCHECKED));
+
+ CheckMenuItem(hPropertiesMenu, IDM_ONTOP, (Globals.bAlwaysOnTop ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(hPropertiesMenu, IDM_SECONDS, (Globals.bSeconds ? MF_CHECKED : MF_UNCHECKED));
+ CheckMenuItem(hPropertiesMenu, IDM_DATE, (Globals.bDate ? MF_CHECKED : MF_UNCHECKED));
+}
+
+static VOID CLOCK_UpdateWindowCaption(VOID)
+{
+ CHAR szCaption[MAX_STRING_LEN];
+ int chars = 0;
+
+ /* Set frame caption */
+ if (Globals.bDate) {
+ chars = GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, NULL, NULL,
+ szCaption, sizeof(szCaption));
+ if (chars) {
+ --chars;
+ szCaption[chars++] = ' ';
+ szCaption[chars++] = '-';
+ szCaption[chars++] = ' ';
+ szCaption[chars] = '\0';
+ }
+ }
+ LoadString(0, IDS_CLOCK, szCaption + chars, sizeof(szCaption) - chars);
+ SetWindowText(Globals.hMainWnd, szCaption);
+}
+
/***********************************************************************
*
* CLOCK_ResetTimer
@@ -69,12 +114,90 @@
/***********************************************************************
*
+ * CLOCK_ResetFont
+ */
+static VOID CLOCK_ResetFont(VOID)
+{
+ HFONT newfont;
+ HDC dc = GetDC(Globals.hMainWnd);
+ newfont = SizeFont(dc, Globals.MaxX, Globals.MaxY, Globals.bSeconds, &Globals.logfont);
+ if (newfont) {
+ DeleteObject(Globals.hFont);
+ Globals.hFont = newfont;
+ }
+
+ ReleaseDC(Globals.hMainWnd, dc);
+}
+
+
+/***********************************************************************
+ *
+ * CLOCK_ChooseFont
+ */
+static VOID CLOCK_ChooseFont(VOID)
+{
+ LOGFONT lf;
+ CHOOSEFONT cf;
+ memset(&cf, 0, sizeof(cf));
+ lf = Globals.logfont;
+ cf.lStructSize = sizeof(cf);
+ cf.hwndOwner = Globals.hMainWnd;
+ cf.lpLogFont = &lf;
+ cf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT;
+ if (ChooseFont(&cf)) {
+ Globals.logfont = lf;
+ CLOCK_ResetFont();
+ }
+}
+
+/***********************************************************************
+ *
+ * CLOCK_ToggleTitle
+ */
+static VOID CLOCK_ToggleTitle(VOID)
+{
+ /* Also shows/hides the menu */
+ LONG style = GetWindowLong(Globals.hMainWnd, GWL_STYLE);
+ if ((Globals.bWithoutTitle = !Globals.bWithoutTitle)) {
+ style = (style & ~WS_OVERLAPPEDWINDOW) | WS_POPUP|WS_THICKFRAME;
+ SetMenu(Globals.hMainWnd, 0);
+ }
+ else {
+ style = (style & ~(WS_POPUP|WS_THICKFRAME)) | WS_OVERLAPPEDWINDOW;
+ SetMenu(Globals.hMainWnd, Globals.hMainMenu);
+ }
+ SetWindowLong(Globals.hMainWnd, GWL_STYLE, style);
+ SetWindowPos(Globals.hMainWnd, 0,0,0,0,0,
+ SWP_DRAWFRAME|SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER);
+
+ CLOCK_UpdateMenuCheckmarks();
+ CLOCK_UpdateWindowCaption();
+}
+
+/***********************************************************************
+ *
+ * CLOCK_ToggleOnTop
+ */
+static VOID CLOCK_ToggleOnTop(VOID)
+{
+ if ((Globals.bAlwaysOnTop = !Globals.bAlwaysOnTop)) {
+ SetWindowPos(Globals.hMainWnd, HWND_TOPMOST, 0,0,0,0,
+ SWP_NOMOVE|SWP_NOSIZE);
+ }
+ else {
+ SetWindowPos(Globals.hMainWnd, HWND_NOTOPMOST, 0,0,0,0,
+ SWP_NOMOVE|SWP_NOSIZE);
+ }
+ CLOCK_UpdateMenuCheckmarks();
+}
+/***********************************************************************
+ *
* CLOCK_MenuCommand
*
* All handling of main menu events
*/
-int CLOCK_MenuCommand (WPARAM wParam)
+static int CLOCK_MenuCommand (WPARAM wParam)
{
CHAR szApp[MAX_STRING_LEN];
CHAR szAppRelease[MAX_STRING_LEN];
@@ -82,7 +205,7 @@
/* switch to analog */
case IDM_ANALOG: {
Globals.bAnalog = TRUE;
- LANGUAGE_UpdateMenuCheckmarks();
+ CLOCK_UpdateMenuCheckmarks();
CLOCK_ResetTimer();
InvalidateRect(Globals.hMainWnd, NULL, FALSE);
break;
@@ -90,42 +213,42 @@
/* switch to digital */
case IDM_DIGITAL: {
Globals.bAnalog = FALSE;
- LANGUAGE_UpdateMenuCheckmarks();
+ CLOCK_UpdateMenuCheckmarks();
CLOCK_ResetTimer();
+ CLOCK_ResetFont();
InvalidateRect(Globals.hMainWnd, NULL, FALSE);
break;
}
/* change font */
case IDM_FONT: {
- MAIN_FileChooseFont();
+ CLOCK_ChooseFont();
break;
}
/* hide title bar */
case IDM_NOTITLE: {
- Globals.bWithoutTitle = !Globals.bWithoutTitle;
- LANGUAGE_UpdateWindowCaption();
- LANGUAGE_UpdateMenuCheckmarks();
+ CLOCK_ToggleTitle();
break;
}
/* always on top */
case IDM_ONTOP: {
- Globals.bAlwaysOnTop = !Globals.bAlwaysOnTop;
- LANGUAGE_UpdateMenuCheckmarks();
+ CLOCK_ToggleOnTop();
break;
}
/* show or hide seconds */
case IDM_SECONDS: {
Globals.bSeconds = !Globals.bSeconds;
- LANGUAGE_UpdateMenuCheckmarks();
+ CLOCK_UpdateMenuCheckmarks();
CLOCK_ResetTimer();
+ if (!Globals.bAnalog)
+ CLOCK_ResetFont();
InvalidateRect(Globals.hMainWnd, NULL, FALSE);
break;
}
/* show or hide date */
case IDM_DATE: {
Globals.bDate = !Globals.bDate;
- LANGUAGE_UpdateMenuCheckmarks();
- LANGUAGE_UpdateWindowCaption();
+ CLOCK_UpdateMenuCheckmarks();
+ CLOCK_UpdateWindowCaption();
break;
}
/* show license */
@@ -142,7 +265,6 @@
case IDM_ABOUT: {
LoadString(Globals.hInstance, IDS_CLOCK, szApp, sizeof(szApp));
lstrcpy(szAppRelease,szApp);
- lstrcat(szAppRelease,"\n" PACKAGE_STRING);
ShellAbout(Globals.hMainWnd, szApp, szAppRelease, 0);
break;
}
@@ -150,30 +272,47 @@
return 0;
}
-VOID MAIN_FileChooseFont(VOID)
+/***********************************************************************
+ *
+ * CLOCK_Paint
+ */
+static VOID CLOCK_Paint(HWND hWnd)
{
- CHOOSEFONT font;
- LOGFONT lf;
-
- font.lStructSize = sizeof(font);
- font.hwndOwner = Globals.hMainWnd;
- font.hDC = NULL;
- font.lpLogFont = &lf;
- font.iPointSize = 0;
- font.Flags = 0;
- font.rgbColors = 0;
- font.lCustData = 0;
- font.lpfnHook = 0;
- font.lpTemplateName = 0;
- font.hInstance = Globals.hInstance;
-/* font.lpszStyle = LF_FACESIZE; */
- font.nFontType = 0;
- font.nSizeMin = 0;
- font.nSizeMax = 144;
+ PAINTSTRUCT ps;
+ HDC dcMem, dc;
+ HBITMAP bmMem, bmOld;
+
+ dc = BeginPaint(hWnd, &ps);
+
+ /* Use an offscreen dc to avoid flicker */
+ dcMem = CreateCompatibleDC(dc);
+ bmMem = CreateCompatibleBitmap(dc, ps.rcPaint.right - ps.rcPaint.left,
+ ps.rcPaint.bottom - ps.rcPaint.top);
+
+ bmOld = SelectObject(dcMem, bmMem);
+
+ SetViewportOrgEx(dcMem, -ps.rcPaint.left, -ps.rcPaint.top, NULL);
+ /* Erase the background */
+ FillRect(dcMem, &ps.rcPaint, GetStockObject(LTGRAY_BRUSH));
+
+ if(Globals.bAnalog)
+ AnalogClock(dcMem, Globals.MaxX, Globals.MaxY, Globals.bSeconds);
+ else
+ DigitalClock(dcMem, Globals.MaxX, Globals.MaxY, Globals.bSeconds, Globals.hFont);
+
+ /* Blit the changes to the screen */
+ BitBlt(dc,
+ ps.rcPaint.left, ps.rcPaint.top,
+ ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top,
+ dcMem,
+ ps.rcPaint.left, ps.rcPaint.top,
+ SRCCOPY);
+
+ SelectObject(dcMem, bmOld);
+ DeleteObject(bmMem);
+ DeleteDC(dcMem);
- if (ChooseFont(&font)) {
- /* do nothing yet */
- }
+ EndPaint(hWnd, &ps);
}
/***********************************************************************
@@ -184,35 +323,30 @@
LRESULT WINAPI CLOCK_WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
-
- case WM_CREATE: {
- break;
- }
-
- case WM_RBUTTONUP: {
- Globals.bWithoutTitle = !Globals.bWithoutTitle;
- LANGUAGE_UpdateMenuCheckmarks();
- LANGUAGE_UpdateWindowCaption();
- UpdateWindow (Globals.hMainWnd);
+ /* L button drag moves the window */
+ case WM_NCHITTEST: {
+ LRESULT ret = DefWindowProc (hWnd, msg, wParam, lParam);
+ if (ret == HTCLIENT)
+ ret = HTCAPTION;
+ return ret;
+ }
+
+ case WM_NCLBUTTONDBLCLK:
+ case WM_LBUTTONDBLCLK: {
+ CLOCK_ToggleTitle();
break;
}
case WM_PAINT: {
- PAINTSTRUCT ps;
- HDC context;
-
- context = BeginPaint(hWnd, &ps);
- if(Globals.bAnalog)
- AnalogClock(context, Globals.MaxX, Globals.MaxY, Globals.bSeconds);
- else
- DigitalClock(context, Globals.MaxX, Globals.MaxY, Globals.bSeconds);
- EndPaint(hWnd, &ps);
+ CLOCK_Paint(hWnd);
break;
+
}
case WM_SIZE: {
Globals.MaxX = LOWORD(lParam);
Globals.MaxY = HIWORD(lParam);
+ CLOCK_ResetFont();
break;
}
@@ -255,27 +389,19 @@
char szWinName[] = "Clock";
/* Setup Globals */
+ memset(&Globals.hFont, 0, sizeof (Globals.hFont));
Globals.bAnalog = TRUE;
Globals.bSeconds = TRUE;
- Globals.lpszIniFile = "clock.ini";
- Globals.lpszIcoFile = "clock.ico";
-
- Globals.hInstance = hInstance;
- Globals.hMainIcon = ExtractIcon(Globals.hInstance,
- Globals.lpszIcoFile, 0);
-
- if (!Globals.hMainIcon)
- Globals.hMainIcon = LoadIcon(0, MAKEINTRESOURCE(DEFAULTICON));
if (!prev){
- class.style = CS_HREDRAW | CS_VREDRAW;
+ class.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
class.lpfnWndProc = CLOCK_WndProc;
class.cbClsExtra = 0;
class.cbWndExtra = 0;
- class.hInstance = Globals.hInstance;
+ class.hInstance = hInstance;
class.hIcon = LoadIcon (0, IDI_APPLICATION);
class.hCursor = LoadCursor (0, IDC_ARROW);
- class.hbrBackground = GetStockObject (GRAY_BRUSH);
+ class.hbrBackground = 0;
class.lpszMenuName = 0;
class.lpszClassName = szClassName;
}
@@ -286,15 +412,15 @@
Globals.hMainWnd = CreateWindow (szClassName, szWinName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
Globals.MaxX, Globals.MaxY, 0,
- 0, Globals.hInstance, 0);
+ 0, hInstance, 0);
if (!CLOCK_ResetTimer())
return FALSE;
- LANGUAGE_LoadMenus();
+ Globals.hMainMenu = LoadMenu(0, MAKEINTRESOURCE(MAIN_MENU));
SetMenu(Globals.hMainWnd, Globals.hMainMenu);
-
- LANGUAGE_UpdateMenuCheckmarks();
+ CLOCK_UpdateMenuCheckmarks();
+ CLOCK_UpdateWindowCaption();
ShowWindow (Globals.hMainWnd, show);
UpdateWindow (Globals.hMainWnd);
@@ -305,6 +431,7 @@
}
KillTimer(Globals.hMainWnd, TIMER_ID);
+ DeleteObject(Globals.hFont);
return 0;
}
diff -u -r programs/clock/main.h programs/clock/main.h
--- programs/clock/main.h 2003-12-03 15:35:28.000000000 +0000
+++ programs/clock/main.h 2003-12-08 09:56:18.000000000 +0000
@@ -25,18 +25,11 @@
typedef struct
{
+ LOGFONT logfont;
+ HFONT hFont;
HANDLE hInstance;
HWND hMainWnd;
- HICON hMainIcon;
- HICON hDefaultIcon;
HMENU hMainMenu;
- HMENU hPropertiesMenu;
- HMENU hLanguageMenu;
- HMENU hInfoMenu;
- HMENU hSystemMenu;
- HMENU hPopupMenu1;
- LPCSTR lpszIniFile;
- LPCSTR lpszIcoFile;
BOOL bAnalog;
BOOL bAlwaysOnTop;
@@ -49,6 +42,3 @@
} CLOCK_GLOBALS;
extern CLOCK_GLOBALS Globals;
-
-/* function prototypes */
-VOID MAIN_FileChooseFont(VOID);
diff -u -r programs/clock/Makefile.in programs/clock/Makefile.in
--- programs/clock/Makefile.in 2002-05-21 20:42:29.000000000 +0100
+++ programs/clock/Makefile.in 2003-12-08 10:13:32.000000000 +0000
@@ -9,7 +9,6 @@
LICENSELANG = En
C_SRCS = \
- language.c \
license.c \
main.c \
winclock.c \
diff -u -r programs/clock/Nl.rc programs/clock/Nl.rc
--- programs/clock/Nl.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Nl.rc 2003-12-08 11:34:11.000000000 +0000
@@ -32,6 +32,8 @@
MENUITEM SEPARATOR
MENUITEM "&Seconden", IDM_SECONDS
MENUITEM "Da&tum", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Altijd op de voorgrond", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Licentie...", IDM_LICENSE
@@ -43,5 +45,4 @@
STRINGTABLE DISCARDABLE
{
IDS_CLOCK, "Klok"
-IDS_ONTOP, "&Altijd op de voorgrond"
}
diff -u -r programs/clock/Pt.rc programs/clock/Pt.rc
--- programs/clock/Pt.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Pt.rc 2003-12-08 11:34:11.000000000 +0000
@@ -35,6 +35,8 @@
MENUITEM SEPARATOR
MENUITEM "&Segundos", IDM_SECONDS
MENUITEM "&Data", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Sempre visível", IDM_ONTOP
}
POPUP "&Informações" {
MENUITEM "&Licença...", IDM_LICENSE
@@ -46,5 +48,4 @@
STRINGTABLE DISCARDABLE
{
IDS_CLOCK, "Relógio"
-IDS_ONTOP, "&Sempre visível"
}
diff -u -r programs/clock/README programs/clock/README
--- programs/clock/README 2003-07-11 22:44:45.000000000 +0100
+++ programs/clock/README 2003-12-06 16:13:33.000000000 +0000
@@ -2,7 +2,4 @@
Clock for Wine
==============
- This is a first attempt to realize a desktop clock for Wine as done in
- Windows. It's an early release and some of the code is still broken.
-
Originally contributed by <mbaur at g26.ethz.ch>
diff -u -r programs/clock/Ru.rc programs/clock/Ru.rc
--- programs/clock/Ru.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Ru.rc 2003-12-08 11:34:11.000000000 +0000
@@ -30,6 +30,8 @@
MENUITEM SEPARATOR
MENUITEM "&Ñåêóíäû", IDM_SECONDS
MENUITEM "&Äàòà", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Ïîâåðõ âñåõ", IDM_ONTOP
}
POPUP "&Ñâåäåíèÿ" {
MENUITEM "&Ëèöåíçèÿ...", IDM_LICENSE
@@ -41,5 +43,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
{
IDS_CLOCK, "×àñû"
-IDS_ONTOP, "&Ïîâåðõ âñåõ"
}
diff -u -r programs/clock/Si.rc programs/clock/Si.rc
--- programs/clock/Si.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Si.rc 2003-12-08 11:34:11.000000000 +0000
@@ -30,6 +30,8 @@
MENUITEM SEPARATOR
MENUITEM "&Sekunde", IDM_SECONDS
MENUITEM "&Datum", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Vedno na vrhu", IDM_ONTOP
}
POPUP "Inf&ormacije " {
MENUITEM "&Licenèna pogodba...", IDM_LICENSE
@@ -41,5 +43,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
{
IDS_CLOCK, "Ura"
-IDS_ONTOP, "&Vedno na vrhu"
}
diff -u -r programs/clock/Sk.rc programs/clock/Sk.rc
--- programs/clock/Sk.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Sk.rc 2003-12-08 11:34:11.000000000 +0000
@@ -32,6 +32,8 @@
MENUITEM SEPARATOR
MENUITEM "&Sekundy", IDM_SECONDS
MENUITEM "&Dátum", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Vdy na vrchu", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Licencia...", IDM_LICENSE
@@ -43,5 +45,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
{
IDS_CLOCK, "Hodiny"
-IDS_ONTOP, "&Vdy na vrchu"
}
diff -u -r programs/clock/Sw.rc programs/clock/Sw.rc
--- programs/clock/Sw.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Sw.rc 2003-12-08 11:34:11.000000000 +0000
@@ -32,6 +32,8 @@
MENUITEM SEPARATOR
MENUITEM "&Sekunder", IDM_SECONDS
MENUITEM "&Datum", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "&Alltid överst", IDM_ONTOP
}
POPUP "Inf&o" {
MENUITEM "&Licens...", IDM_LICENSE
@@ -43,5 +45,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT
{
IDS_CLOCK, "Klockan"
-IDS_ONTOP, "&Alltid överst"
}
diff -u -r programs/clock/Th.rc programs/clock/Th.rc
--- programs/clock/Th.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Th.rc 2003-12-08 11:34:11.000000000 +0000
@@ -32,6 +32,8 @@
MENUITEM SEPARATOR
MENUITEM "ÇÔ¹Ò·Õ", IDM_SECONDS
MENUITEM "Çѹ·Õè", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "ÂÙº¹ÊØ´àÊÁÍ", IDM_ONTOP
}
POPUP "ÃÒÂÅÐàÍÕ´" {
MENUITEM "ãºÍ¹ØÒµ...", IDM_LICENSE
@@ -43,5 +45,4 @@
STRINGTABLE DISCARDABLE
{
IDS_CLOCK, "¹ÒÌÔ¡Ò"
-IDS_ONTOP, "ÂÙº¹ÊØ´àÊÁÍ"
}
diff -u -r programs/clock/TODO programs/clock/TODO
--- programs/clock/TODO 2003-07-11 22:44:45.000000000 +0100
+++ programs/clock/TODO 2003-12-08 11:54:24.000000000 +0000
@@ -1,17 +1,4 @@
+'L button move', 'No title bar' & 'Always on top' don't work unless Wine is in
+desktop mode
-Some ideas for improvements:
-============================
-
-- Make "Without Titlebar", Double-clicking the clock should reveal the caption
- again.
-
-- Font Handling of Digital Clock.
- (Does not work probably due to Winelib)
-
-- Complete translation for the following languages : Pt,Sk
-
-- Add new .rc resources for all languages you know. That's in fact very easy.
- Just clone the file En.rc, change the strings and submit it. You can find
- my email address in the README file.
-
-Please don't forget a ChangeLog entry.
+This is a problem in Wine, not in Clock
diff -u -r programs/clock/Wa.rc programs/clock/Wa.rc
--- programs/clock/Wa.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Wa.rc 2003-12-08 11:34:11.000000000 +0000
@@ -37,6 +37,8 @@
MENUITEM SEPARATOR
MENUITEM "&Segondes", IDM_SECONDS
MENUITEM "&Date", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "Todi &Visibe", IDM_ONTOP
}
POPUP "&Informåcion" {
MENUITEM "&Licinse...", IDM_LICENSE
@@ -48,7 +50,6 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_WALON, SUBLANG_DEFAULT
{
IDS_CLOCK, "Ôrlodje"
-IDS_ONTOP, "Todi &Visibe"
}
#endif /* LANG_WALON */
diff -u -r programs/clock/winclock.c programs/clock/winclock.c
--- programs/clock/winclock.c 2003-12-03 15:35:28.000000000 +0000
+++ programs/clock/winclock.c 2003-12-08 12:10:00.000000000 +0000
@@ -23,7 +23,6 @@
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-
#include "config.h"
#include "wine/port.h"
@@ -33,11 +32,18 @@
#include "windows.h"
#include "winclock.h"
-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;
+#define Black RGB(0,0,0)
+#define Gray RGB(128,128,128)
+#define LtGray RGB(192,192,192)
+#define White RGB(255,255,255)
+
+static const COLORREF FaceColor = LtGray;
+static const COLORREF HandColor = White;
+static const COLORREF TickColor = White;
+static const COLORREF ShadowColor = Black;
+static const COLORREF BackgroundColor = LtGray;
+
+static const int SHADOW_DEPTH = 2;
typedef struct
{
@@ -47,17 +53,25 @@
HandData HourHand, MinuteHand, SecondHand;
-static void DrawFace(HDC dc, const POINT* centre, int radius)
+static void DrawTicks(HDC dc, const POINT* centre, int radius)
{
int t;
- SelectObject(dc,CreateSolidBrush(FaceColor));
- SelectObject(dc,CreatePen(PS_SOLID,1,EtchColor));
- Ellipse(dc,
- centre->x - radius, centre->y - radius,
- centre->x + radius, centre->y + radius);
+ /* Minute divisions */
+ if (radius>64)
+ for(t=0; t<60; t++) {
+ MoveToEx(dc,
+ centre->x + sin(t*M_PI/30)*0.9*radius,
+ centre->y - cos(t*M_PI/30)*0.9*radius,
+ NULL);
+ LineTo(dc,
+ centre->x + sin(t*M_PI/30)*0.89*radius,
+ centre->y - cos(t*M_PI/30)*0.89*radius);
+ }
+ /* Hour divisions */
for(t=0; t<12; t++) {
+
MoveToEx(dc,
centre->x + sin(t*M_PI/6)*0.9*radius,
centre->y - cos(t*M_PI/6)*0.9*radius,
@@ -66,14 +80,20 @@
centre->x + sin(t*M_PI/6)*0.8*radius,
centre->y - cos(t*M_PI/6)*0.8*radius);
}
- if (radius>64)
- for(t=0; t<60; t++)
- SetPixel(dc,
- centre->x + sin(t*M_PI/30)*0.9*radius,
- centre->y - cos(t*M_PI/30)*0.9*radius,
- EtchColor);
- DeleteObject(SelectObject(dc,GetStockObject(NULL_BRUSH)));
- DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN)));
+}
+
+static void DrawFace(HDC dc, const POINT* centre, int radius)
+{
+ /* Ticks */
+ SelectObject(dc, CreatePen(PS_SOLID, 2, ShadowColor));
+ OffsetWindowOrgEx(dc, -SHADOW_DEPTH, -SHADOW_DEPTH, NULL);
+ DrawTicks(dc, centre, radius);
+ DeleteObject(SelectObject(dc, CreatePen(PS_SOLID, 2, TickColor)));
+ OffsetWindowOrgEx(dc, SHADOW_DEPTH, SHADOW_DEPTH, NULL);
+ DrawTicks(dc, centre, radius);
+
+ DeleteObject(SelectObject(dc, GetStockObject(NULL_BRUSH)));
+ DeleteObject(SelectObject(dc, GetStockObject(NULL_PEN)));
}
static void DrawHand(HDC dc,HandData* hand)
@@ -84,12 +104,32 @@
static void DrawHands(HDC dc, BOOL bSeconds)
{
- SelectObject(dc,CreatePen(PS_SOLID,1,HandColor));
- if (bSeconds)
+ if (bSeconds) {
+#if 0
+ SelectObject(dc, CreatePen(PS_SOLID, 1, ShadowColor));
+ OffsetWindowOrgEx(dc, -SHADOW_DEPTH, -SHADOW_DEPTH, NULL);
+ DrawHand(dc, &SecondHand);
+ DeleteObject(SelectObject(dc, CreatePen(PS_SOLID, 1, HandColor)));
+ OffsetWindowOrgEx(dc, SHADOW_DEPTH, SHADOW_DEPTH, NULL);
+#else
+ SelectObject(dc, CreatePen(PS_SOLID, 1, HandColor));
+#endif
DrawHand(dc, &SecondHand);
+ DeleteObject(SelectObject(dc, GetStockObject(NULL_PEN)));
+ }
+
+ SelectObject(dc, CreatePen(PS_SOLID, 4, ShadowColor));
+
+ OffsetWindowOrgEx(dc, -SHADOW_DEPTH, -SHADOW_DEPTH, NULL);
DrawHand(dc, &MinuteHand);
DrawHand(dc, &HourHand);
- DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN)));
+
+ DeleteObject(SelectObject(dc, CreatePen(PS_SOLID, 4, HandColor)));
+ OffsetWindowOrgEx(dc, SHADOW_DEPTH, SHADOW_DEPTH, NULL);
+ DrawHand(dc, &MinuteHand);
+ DrawHand(dc, &HourHand);
+
+ DeleteObject(SelectObject(dc, GetStockObject(NULL_PEN)));
}
static void PositionHand(const POINT* centre, double length, double angle, HandData* hand)
@@ -108,6 +148,7 @@
/* Adding the millisecond count makes the second hand move more smoothly */
GetLocalTime(&st);
+
second = st.wSecond + st.wMilliseconds/1000.0;
minute = st.wMinute + second/60.0;
hour = st.wHour % 12 + minute/60.0;
@@ -122,49 +163,79 @@
{
POINT centre;
int radius;
- radius = min(x, y)/2;
+
+ radius = min(x, y)/2 - SHADOW_DEPTH;
+ if (radius < 0)
+ return;
centre.x = x/2;
centre.y = y/2;
DrawFace(dc, ¢re, radius);
+
PositionHands(¢re, radius, bSeconds);
DrawHands(dc, bSeconds);
}
-void DigitalClock(HDC dc, int x, int y, BOOL bSeconds)
+
+HFONT SizeFont(HDC dc, int x, int y, BOOL bSeconds, const LOGFONT* font)
{
- CHAR szTime[255];
SIZE extent;
LOGFONT lf;
double xscale, yscale;
- HFONT oldFont;
+ HFONT oldFont, newFont;
+ CHAR szTime[255];
+ int chars;
- GetTimeFormat(LOCALE_USER_DEFAULT, bSeconds ? 0 : TIME_NOSECONDS, NULL,
- NULL, szTime, sizeof (szTime));
+ chars = GetTimeFormat(LOCALE_USER_DEFAULT, bSeconds ? 0 : TIME_NOSECONDS, NULL,
+ NULL, szTime, sizeof (szTime));
+ if (!chars)
+ return 0;
- memset(&lf, 0, sizeof (lf));
+ --chars;
+
+ lf = *font;
lf.lfHeight = -20;
- x -= 2 * ETCH_DEPTH;
- y -= 2 * ETCH_DEPTH;
+ x -= 2 * SHADOW_DEPTH;
+ y -= 2 * SHADOW_DEPTH;
oldFont = SelectObject(dc, CreateFontIndirect(&lf));
- GetTextExtentPoint(dc, szTime, strlen(szTime), &extent);
+ GetTextExtentPoint(dc, szTime, chars, &extent);
+ DeleteObject(SelectObject(dc, oldFont));
+
xscale = (double)x/extent.cx;
yscale = (double)y/extent.cy;
- lf.lfHeight *= min(xscale, yscale);
+ lf.lfHeight *= min(xscale, yscale);
+ newFont = CreateFontIndirect(&lf);
+
+ return newFont;
+}
- DeleteObject(SelectObject(dc, CreateFontIndirect(&lf)));
- GetTextExtentPoint(dc, szTime, strlen(szTime), &extent);
+void DigitalClock(HDC dc, int x, int y, BOOL bSeconds, HFONT font)
+{
+ SIZE extent;
+ HFONT oldFont;
+ CHAR szTime[255];
+ int chars;
- 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));
+ chars = GetTimeFormat(LOCALE_USER_DEFAULT, bSeconds ? 0 : TIME_NOSECONDS, NULL,
+ NULL, szTime, sizeof (szTime));
+ if (!chars)
+ return;
+ --chars;
+
+ oldFont = SelectObject(dc, font);
+ GetTextExtentPoint(dc, szTime, chars, &extent);
+
+ SetBkColor(dc, BackgroundColor);
+ SetTextColor(dc, ShadowColor);
+ TextOut(dc, (x - extent.cx)/2 + SHADOW_DEPTH, (y - extent.cy)/2 + SHADOW_DEPTH,
+ szTime, chars);
SetBkMode(dc, TRANSPARENT);
- SetTextColor(dc, FaceColor);
- TextOut(dc, (x - extent.cx)/2, (y - extent.cy)/2, szTime, strlen(szTime));
- DeleteObject(SelectObject(dc, oldFont));
+ SetTextColor(dc, HandColor);
+ TextOut(dc, (x - extent.cx)/2, (y - extent.cy)/2, szTime, chars);
+
+ SelectObject(dc, oldFont);
}
diff -u -r programs/clock/winclock.h programs/clock/winclock.h
--- programs/clock/winclock.h 2003-12-03 15:35:28.000000000 +0000
+++ programs/clock/winclock.h 2003-12-05 13:20:44.000000000 +0000
@@ -22,4 +22,5 @@
*/
void AnalogClock(HDC dc, int X, int Y, BOOL bSeconds);
-void DigitalClock(HDC dc, int X, int Y, BOOL bSeconds);
+HFONT SizeFont(HDC dc, int x, int y, BOOL bSeconds, const LOGFONT* font);
+void DigitalClock(HDC dc, int X, int Y, BOOL bSeconds, HFONT font);
diff -u -r programs/clock/Zh.rc programs/clock/Zh.rc
--- programs/clock/Zh.rc 2003-12-03 15:35:27.000000000 +0000
+++ programs/clock/Zh.rc 2003-12-08 11:34:11.000000000 +0000
@@ -30,6 +30,8 @@
MENUITEM SEPARATOR
MENUITEM "Ã루&£©", IDM_SECONDS
MENUITEM "ÈÕÆÚ£¨&D£©", IDM_DATE
+ MENUITEM SEPARATOR
+ MENUITEM "×ÜÊÇÔÚ×îÇ°Ã棨&A£©", IDM_ONTOP
}
POPUP "×ÊÁÏÐÅÏ¢£¨&O£©" {
MENUITEM "Óû§Ðí¿ÉÐÒ飨&L£©...", IDM_LICENSE
@@ -41,5 +43,4 @@
STRINGTABLE DISCARDABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
{
IDS_CLOCK, "ʱÖÓ"
-IDS_ONTOP, "×ÜÊÇÔÚ×îÇ°Ã棨&A£©"
}
More information about the wine-patches
mailing list