From f9026f4e85bbef52fd036a01dbebda7a0f657f45 Mon Sep 17 00:00:00 2001 From: Richard Cohen Date: Wed, 22 Sep 2004 19:13:29 +0000 Subject: [PATCH] - Remove obsolete handling of WINE_STRICT/NULL_HANDLE. - Allow more characters for Window title (for Fr locale). - Hardcode the icon name - so that it's independent of locale. - Shorten the text in the About box so that it doesn't wrap. - Use HKCU instead of HKLM for saving stuff. - Save YPos properly. - use AdjustWindowRect instead of calculating the window size using GetSystemMetrics - Cope with the user moving the window offscreen and move it back. --- programs/winemine/De.rc | 2 +- programs/winemine/En.rc | 2 +- programs/winemine/Es.rc | 2 +- programs/winemine/Fr.rc | 2 +- programs/winemine/It.rc | 2 +- programs/winemine/Nl.rc | 2 +- programs/winemine/Pt.rc | 2 +- programs/winemine/Ru.rc | 2 +- programs/winemine/Si.rc | 2 +- programs/winemine/main.c | 141 ++++++++++++++++++++------------------- 10 files changed, 80 insertions(+), 79 deletions(-) diff --git a/programs/winemine/De.rc b/programs/winemine/De.rc index 0c900103aad..3f7ea7f6315 100644 --- a/programs/winemine/De.rc +++ b/programs/winemine/De.rc @@ -96,7 +96,7 @@ CAPTION " { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "Lizensiert unter den Bedingungen der LGPL", IDIGNORE, 35, 35, 135, 10 + LTEXT "Lizensiert unter der LGPL", IDIGNORE, 35, 35, 135, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "OK", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/En.rc b/programs/winemine/En.rc index b0a19c60dfe..3c8db345c85 100644 --- a/programs/winemine/En.rc +++ b/programs/winemine/En.rc @@ -97,7 +97,7 @@ CAPTION "About" { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "Licensed under the terms of the LGPL", IDIGNORE, 35, 35, 115, 10 + LTEXT "Licensed under the LGPL", IDIGNORE, 35, 35, 115, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "OK", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/Es.rc b/programs/winemine/Es.rc index 7c9fc51106f..bd69f58926f 100644 --- a/programs/winemine/Es.rc +++ b/programs/winemine/Es.rc @@ -96,7 +96,7 @@ CAPTION "Acerca de" { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "bajo la licencia de Wine", IDIGNORE, 35, 35, 115, 10 + LTEXT "bajo la licencia LGPL", IDIGNORE, 35, 35, 115, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "Aceptar", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/Fr.rc b/programs/winemine/Fr.rc index 5a6c4a60648..5407af0f28d 100644 --- a/programs/winemine/Fr.rc +++ b/programs/winemine/Fr.rc @@ -98,7 +98,7 @@ CAPTION " { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "sous la licence de Wine", IDIGNORE, 35, 35, 115, 10 + LTEXT "sous la licence LGPL", IDIGNORE, 35, 35, 115, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "OK", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/It.rc b/programs/winemine/It.rc index 74e51d4bb5a..bfc3728f795 100644 --- a/programs/winemine/It.rc +++ b/programs/winemine/It.rc @@ -98,7 +98,7 @@ CAPTION "Informazioni su WineMine" { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "Concesso in licenza secondo i termini della LGPL", IDIGNORE, 35, 35, 115, 10 + LTEXT "Concesso in licenza LGPL", IDIGNORE, 35, 35, 115, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "OK", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/Nl.rc b/programs/winemine/Nl.rc index 380a880663f..a3df2e7242e 100644 --- a/programs/winemine/Nl.rc +++ b/programs/winemine/Nl.rc @@ -95,7 +95,7 @@ CAPTION "About" { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "dit programma valt onder de Wine licentie", IDIGNORE, 35, 35, 115, 10 + LTEXT "dit programma valt onder de LGPL", IDIGNORE, 35, 35, 115, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "OK", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/Pt.rc b/programs/winemine/Pt.rc index 2fd40a43887..e78679ea786 100644 --- a/programs/winemine/Pt.rc +++ b/programs/winemine/Pt.rc @@ -96,7 +96,7 @@ CAPTION "Sobre" { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "conforme a licença do Wine", IDIGNORE, 35, 35, 115, 10 + LTEXT "conforme a licença LGPL", IDIGNORE, 35, 35, 115, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "OK", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/Ru.rc b/programs/winemine/Ru.rc index f54b5d2e9a9..16499585913 100644 --- a/programs/winemine/Ru.rc +++ b/programs/winemine/Ru.rc @@ -96,7 +96,7 @@ CAPTION "About" { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "ïîä ëèöåíçèåé Wine", IDIGNORE, 35, 35, 115, 10 + LTEXT "ïîä ëèöåíçèåé LGPL", IDIGNORE, 35, 35, 115, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "OK", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/Si.rc b/programs/winemine/Si.rc index 78e3380b4a3..2c6ae629367 100644 --- a/programs/winemine/Si.rc +++ b/programs/winemine/Si.rc @@ -96,7 +96,7 @@ CAPTION "O programu" { LTEXT "Winemine", IDIGNORE, 10, 10, 50, 10 LTEXT "Copyright 2000, Joshua Thielen", IDIGNORE, 35, 25, 115, 10 - LTEXT "under the Wine license", IDIGNORE, 35, 35, 115, 10 + LTEXT "under the LGPL", IDIGNORE, 35, 35, 115, 10 ICON "WINEMINE", IDIGNORE, 10, 25, 20, 20 DEFPUSHBUTTON "OK", IDOK, 50, 60, 60, 15 } diff --git a/programs/winemine/main.c b/programs/winemine/main.c index fed4a7fe793..13d29e441d0 100644 --- a/programs/winemine/main.c +++ b/programs/winemine/main.c @@ -22,17 +22,11 @@ #include #include #include +#include #include "main.h" #include "dialog.h" #include "resource.h" -/* Work around a Wine bug which defines handles as UINT rather than LPVOID */ -#ifdef WINE_STRICT -#define NULL_HANDLE NULL -#else -#define NULL_HANDLE 0 -#endif - #ifdef DUMB_DEBUG #include #define DEBUG(x) fprintf(stderr,x) @@ -40,13 +34,17 @@ #define DEBUG(x) #endif +static const DWORD wnd_style = WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX; +static const char* registry_key = "Software\\Wine\\WineMine"; + + int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmdshow ) { MSG msg; WNDCLASS wc; HWND hWnd; HACCEL haccel; - char appname[9]; + char appname[20]; LoadString( hInst, IDS_APPNAME, appname, sizeof(appname)); @@ -55,17 +53,17 @@ int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmd wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; - wc.hIcon = LoadIcon( hInst, appname ); - wc.hCursor = LoadCursor( NULL_HANDLE, IDI_APPLICATION ); + wc.hIcon = LoadIcon( hInst, "WINEMINE" ); + wc.hCursor = LoadCursor( 0, IDI_APPLICATION ); wc.hbrBackground = (HBRUSH) GetStockObject( BLACK_BRUSH ); wc.lpszMenuName = "MENU_WINEMINE"; wc.lpszClassName = appname; if (!RegisterClass(&wc)) exit(1); hWnd = CreateWindow( appname, appname, - WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX, + wnd_style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, - NULL_HANDLE, NULL_HANDLE, hInst, NULL ); + 0, 0, hInst, NULL ); if (!hWnd) exit(1); @@ -75,7 +73,7 @@ int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmd haccel = LoadAccelerators( hInst, MAKEINTRESOURCE(IDA_WINEMINE) ); SetTimer( hWnd, ID_TIMER, 1000, NULL ); - while( GetMessage(&msg, NULL_HANDLE, 0, 0) ) { + while( GetMessage(&msg, 0, 0, 0) ) { if (!TranslateAccelerator( hWnd, haccel, &msg )) TranslateMessage( &msg ); @@ -117,8 +115,8 @@ LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_MOVE: DEBUG("WM_MOVE\n"); - board.pos.x = (unsigned) LOWORD(lParam); - board.pos.y = (unsigned) HIWORD(lParam); + board.pos.x = GET_X_LPARAM(lParam); + board.pos.y = GET_Y_LPARAM(lParam); return 0; case WM_DESTROY: @@ -130,8 +128,8 @@ LRESULT WINAPI MainProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_TIMER: if( board.status == PLAYING ) { board.time++; - RedrawWindow( hWnd, &board.timer_rect, NULL_HANDLE, - RDW_INVALIDATE | RDW_UPDATENOW ); + RedrawWindow( hWnd, &board.timer_rect, 0, + RDW_INVALIDATE | RDW_UPDATENOW ); } return 0; @@ -260,29 +258,6 @@ void InitBoard( BOARD *p_board ) LoadBoard( p_board ); - if( p_board->pos.x < GetSystemMetrics( SM_CXFIXEDFRAME )) - p_board->pos.x = GetSystemMetrics( SM_CXFIXEDFRAME ); - - if( p_board->pos.x > (GetSystemMetrics( SM_CXSCREEN ) - - GetSystemMetrics( SM_CXFIXEDFRAME ))) { - p_board->pos.x = GetSystemMetrics( SM_CXSCREEN ) - - GetSystemMetrics( SM_CXFIXEDFRAME ); - } - - if( p_board->pos.y < (GetSystemMetrics( SM_CYMENU ) - + GetSystemMetrics( SM_CYCAPTION ) - + GetSystemMetrics( SM_CYFIXEDFRAME ))) { - p_board->pos.y = GetSystemMetrics( SM_CYMENU ) + - GetSystemMetrics( SM_CYCAPTION ) + - GetSystemMetrics( SM_CYFIXEDFRAME ); - } - - if( p_board->pos.y > (GetSystemMetrics( SM_CYSCREEN ) - - GetSystemMetrics( SM_CYFIXEDFRAME ))) { - p_board->pos.y = GetSystemMetrics( SM_CYSCREEN ) - - GetSystemMetrics( SM_CYFIXEDFRAME ); - } - hMenu = GetMenu( p_board->hWnd ); CheckMenuItem( hMenu, IDM_BEGINNER + (unsigned) p_board->difficulty, MF_CHECKED ); @@ -302,8 +277,7 @@ void LoadBoard( BOARD *p_board ) char key_name[8]; unsigned i; - - RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Software\\Wine\\WineMine", + RegOpenKeyEx( HKEY_CURRENT_USER, registry_key, 0, KEY_QUERY_VALUE, &hkey ); size = sizeof( data ); @@ -312,16 +286,14 @@ void LoadBoard( BOARD *p_board ) p_board->pos.x = atoi( data ); } else - p_board->pos.x = GetSystemMetrics( SM_CXFIXEDFRAME ); + p_board->pos.x = 0; size = sizeof( data ); if( RegQueryValueEx( hkey, "Ypos", NULL, (LPDWORD) &type, (LPBYTE) data, (LPDWORD) &size ) == ERROR_SUCCESS ) p_board->pos.y = atoi( data ); else - p_board->pos.y = GetSystemMetrics( SM_CYMENU ) - + GetSystemMetrics( SM_CYCAPTION ) - + GetSystemMetrics( SM_CYFIXEDFRAME ); + p_board->pos.y = 0; size = sizeof( data ); if( RegQueryValueEx( hkey, "Rows", NULL, (LPDWORD) &type, @@ -389,8 +361,8 @@ void SaveBoard( BOARD *p_board ) char data[16]; char key_name[8]; - if( RegCreateKeyEx( HKEY_LOCAL_MACHINE, - "Software\\Wine\\WineMine", 0, NULL, + if( RegCreateKeyEx( HKEY_CURRENT_USER, registry_key, + 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, NULL ) != ERROR_SUCCESS) return; @@ -398,7 +370,7 @@ void SaveBoard( BOARD *p_board ) wsprintf( data, "%d", p_board->pos.x ); RegSetValueEx( hkey, "Xpos", 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); - wsprintf( data, "%d", p_board->pos.x ); + wsprintf( data, "%d", p_board->pos.y ); RegSetValueEx( hkey, "Ypos", 0, REG_SZ, (LPBYTE) data, strlen(data)+1 ); wsprintf( data, "%d", (int) p_board->difficulty ); @@ -467,6 +439,7 @@ void SetDifficulty( BOARD *p_board, DIFFICULTY difficulty ) case EXPERT: p_board->cols = EXPERT_COLS; p_board->rows = EXPERT_ROWS; + p_board->mines = EXPERT_MINES; break; @@ -475,9 +448,37 @@ void SetDifficulty( BOARD *p_board, DIFFICULTY difficulty ) } } +void ShiftBetween(LONG* x, LONG* y, LONG a, LONG b) +{ + if (*x < a) { + *y += a - *x; + *x = a; + } + else if (*y > b) { + *x -= *y - b; + *y = b; + } +} +void MoveOnScreen(RECT* rect) +{ + HMONITOR hMonitor; + MONITORINFO mi; + + /* find the nearest monitor ... */ + hMonitor = MonitorFromRect(rect, MONITOR_DEFAULTTONEAREST); + + /* ... and move it into the work area (ie excluding task bar)*/ + mi.cbSize = sizeof(mi); + GetMonitorInfo(hMonitor, &mi); + + ShiftBetween(&rect->left, &rect->right, mi.rcWork.left, mi.rcWork.right); + ShiftBetween(&rect->top, &rect->bottom, mi.rcWork.top, mi.rcWork.bottom); +} + void CreateBoard( BOARD *p_board ) { - int left, top, bottom, right, wnd_x, wnd_y, wnd_width, wnd_height; + int left, top, bottom, right; + RECT wnd_rect; p_board->mb = MB_NONE; p_board->boxes_left = p_board->cols * p_board->rows - p_board->mines; @@ -490,17 +491,6 @@ void CreateBoard( BOARD *p_board ) p_board->height = p_board->rows * MINE_HEIGHT + LED_HEIGHT + BOARD_HMARGIN * 3; - wnd_x = p_board->pos.x - GetSystemMetrics( SM_CXFIXEDFRAME ); - wnd_y = p_board->pos.y - GetSystemMetrics( SM_CYMENU ) - - GetSystemMetrics( SM_CYCAPTION ) - - GetSystemMetrics( SM_CYFIXEDFRAME ); - wnd_width = p_board->width - + GetSystemMetrics( SM_CXFIXEDFRAME ) * 2; - wnd_height = p_board->height - + GetSystemMetrics( SM_CYMENU ) - + GetSystemMetrics( SM_CYCAPTION ) - + GetSystemMetrics( SM_CYFIXEDFRAME ) * 2; - /* setting the mines rectangle boundary */ left = BOARD_WMARGIN; top = BOARD_HMARGIN * 2 + LED_HEIGHT; @@ -533,9 +523,20 @@ void CreateBoard( BOARD *p_board ) p_board->face_bmp = SMILE_BMP; p_board->time = 0; - MoveWindow( p_board->hWnd, wnd_x, wnd_y, wnd_width, wnd_height, TRUE ); - RedrawWindow( p_board->hWnd, NULL, NULL_HANDLE, - RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE ); + wnd_rect.left = p_board->pos.x; + wnd_rect.right = p_board->pos.x + p_board->width; + wnd_rect.top = p_board->pos.y; + wnd_rect.bottom = p_board->pos.y + p_board->height; + AdjustWindowRect(&wnd_rect, wnd_style, TRUE); + + /* Make sure the window is completely on the screen */ + MoveOnScreen(&wnd_rect); + MoveWindow( p_board->hWnd, wnd_rect.left, wnd_rect.top, + wnd_rect.right - wnd_rect.left, + wnd_rect.bottom - wnd_rect.top, + TRUE ); + RedrawWindow( p_board->hWnd, NULL, 0, + RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE); } @@ -583,9 +584,9 @@ void CreateBoxes( BOARD *p_board ) /* create mines */ i = 0; - while( (unsigned) i < p_board->mines ) { - col = (int) (p_board->cols * (float) rand() / RAND_MAX + 1); - row = (int) (p_board->rows * (float) rand() / RAND_MAX + 1); + while( (unsigned) i < p_board->mines ) { + col = (int) (p_board->cols * (float) rand() / RAND_MAX + 1); + row = (int) (p_board->rows * (float) rand() / RAND_MAX + 1); if( !p_board->box[col][row].IsMine ) { i++; @@ -819,7 +820,7 @@ void TestBoard( HWND hWnd, BOARD *p_board, unsigned x, unsigned y, int msg ) p_board->num_flags = p_board->mines; - RedrawWindow( p_board->hWnd, NULL, NULL_HANDLE, + RedrawWindow( p_board->hWnd, NULL, 0, RDW_INVALIDATE | RDW_UPDATENOW ); } @@ -893,7 +894,7 @@ void TestMines( BOARD *p_board, POINT pt, int msg ) if( draw ) { - RedrawWindow( p_board->hWnd, NULL, NULL_HANDLE, + RedrawWindow( p_board->hWnd, NULL, 0, RDW_INVALIDATE | RDW_UPDATENOW ); } } @@ -919,7 +920,7 @@ void TestFace( BOARD *p_board, POINT pt, int msg ) CreateBoard( p_board ); } - RedrawWindow( p_board->hWnd, &p_board->face_rect, NULL_HANDLE, + RedrawWindow( p_board->hWnd, &p_board->face_rect, 0, RDW_INVALIDATE | RDW_UPDATENOW ); }