From debd89444cd4419ec5013c412238fbf8329c12c2 Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Thu, 27 Mar 2003 00:23:24 +0000 Subject: [PATCH] (from ) What's in it: some MessageBox tidbits: - Let all MessageBoxes display an icon - Introduced NHMessageBox to have messageboxes display a consistent title - Change icon in mswin_display_file from MB_ICONERROR to MB_ICONEXCLAMATION for non-fatal error And to solve #U355: NetHackW won't run on Win2K OS: - Avoid a crash when closing the main window while the splash screen is displayed. - Make sure NetHack starts normal when closed minimized - Center the splash screen on the screen, not on the parent window (which may be off-screen) What's new in it: - Show copyright banner in textbox in splash screen instead of over the picture - Show news in splash screen only if iflags.news (solves W341-6) - show complete version information in splash screen when it is used as about box) [Also reverse the numkey patch in main trunk] --- sys/winnt/nhdefkey.c | 4 +- win/win32/mhdlg.c | 10 +-- win/win32/mhfont.c | 4 - win/win32/mhmain.c | 19 ++-- win/win32/mhsplash.c | 204 ++++++++++++++++++++++++------------------- win/win32/mswproc.c | 26 ++++-- win/win32/resource.h | 1 + win/win32/winMS.h | 3 + win/win32/winhack.rc | 3 +- 9 files changed, 156 insertions(+), 118 deletions(-) diff --git a/sys/winnt/nhdefkey.c b/sys/winnt/nhdefkey.c index 5d682b201..eeeeb0f30 100644 --- a/sys/winnt/nhdefkey.c +++ b/sys/winnt/nhdefkey.c @@ -81,13 +81,13 @@ static const struct pad { {'9', M('9'), '9'}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'4', M('4'), '4'}, /* 4 */ - {'5', M('5'), '5'}, /* 5 */ + {'g', 'G', 'g'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ - {'0', M('0'), '0'}, /* Ins */ + {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }; diff --git a/win/win32/mhdlg.c b/win/win32/mhdlg.c index 325535be5..e3defb4f3 100644 --- a/win/win32/mhdlg.c +++ b/win/win32/mhdlg.c @@ -354,7 +354,7 @@ BOOL CALLBACK PlayerSelectorDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPAR if( plselFinalSelection(hWnd, data->selection) ) { EndDialog(hWnd, wParam); } else { - MessageBox(hWnd, TEXT("Cannot match this role. Try something else."), TEXT("STOP"), MB_OK ); + NHMessageBox(hWnd, TEXT("Cannot match this role. Try something else."), MB_ICONSTOP | MB_OK ); } return TRUE; @@ -677,7 +677,7 @@ int plselFinalSelection(HWND hWnd, int* selection) if( flags.initrole==ROLE_RANDOM ) { flags.initrole = pick_role(flags.initrace, flags.initgend, flags.initalign, PICK_RANDOM); if (flags.initrole < 0) { - MessageBox(hWnd, TEXT("Incompatible role!"), TEXT("STOP"), MB_OK); + NHMessageBox(hWnd, TEXT("Incompatible role!"), MB_ICONSTOP | MB_OK); return FALSE; } } @@ -691,7 +691,7 @@ int plselFinalSelection(HWND hWnd, int* selection) } if (flags.initrace < 0) { - MessageBox(hWnd, TEXT("Incompatible race!"), TEXT("STOP"), MB_OK); + NHMessageBox(hWnd, TEXT("Incompatible race!"), MB_ICONSTOP | MB_OK); return FALSE; } } @@ -707,7 +707,7 @@ int plselFinalSelection(HWND hWnd, int* selection) } if (flags.initgend < 0) { - MessageBox(hWnd, TEXT("Incompatible gender!"), TEXT("STOP"), MB_OK); + NHMessageBox(hWnd, TEXT("Incompatible gender!"), MB_ICONSTOP | MB_OK); return FALSE; } } @@ -720,7 +720,7 @@ int plselFinalSelection(HWND hWnd, int* selection) if (flags.initalign == ROLE_RANDOM) { flags.initalign = pick_align(flags.initrole, flags.initrace, flags.initgend, PICK_RANDOM); } else { - MessageBox(hWnd, TEXT("Incompatible alignment!"), TEXT("STOP"), MB_OK); + NHMessageBox(hWnd, TEXT("Incompatible alignment!"), MB_ICONSTOP | MB_OK); return FALSE; } } diff --git a/win/win32/mhfont.c b/win/win32/mhfont.c index ecbb4776a..5f05e7633 100644 --- a/win/win32/mhfont.c +++ b/win/win32/mhfont.c @@ -14,7 +14,6 @@ static struct font_table_entry { } font_table[MAXFONTS] ; static int font_table_size = 0; HFONT version_splash_font; -HFONT extrainfo_splash_font; #define NHFONT_CODE(win, attr) (((attr&0xFF)<<8)|(win_type&0xFF)) @@ -41,15 +40,12 @@ void mswin_init_splashfonts(HWND hWnd) lgfnt.lfPitchAndFamily = DEFAULT_PITCH; // pitch and family NH_A2W( "Times New Roman", lgfnt.lfFaceName, LF_FACESIZE); version_splash_font = CreateFontIndirect(&lgfnt); - lgfnt.lfHeight = -16; // height of font - extrainfo_splash_font = CreateFontIndirect(&lgfnt); ReleaseDC(hWnd, hdc); } void mswin_destroy_splashfonts() { DeleteObject (version_splash_font); - DeleteObject (extrainfo_splash_font); } /* create font based on window type, charater attributes and diff --git a/win/win32/mhmain.c b/win/win32/mhmain.c index d5f87d6c3..ccb9811aa 100644 --- a/win/win32/mhmain.c +++ b/win/win32/mhmain.c @@ -138,13 +138,13 @@ numpad[KEY_LAST][3] = { {'9', M('9'), '9'}, /* 9 */ {'m', C('p'), C('p')}, /* - */ {'4', M('4'), '4'}, /* 4 */ - {'5', M('5'), '5'}, /* 5 */ + {'g', 'G', 'g'}, /* 5 */ {'6', M('6'), '6'}, /* 6 */ {'+', 'P', C('p')}, /* + */ {'1', M('1'), '1'}, /* 1 */ {'2', M('2'), '2'}, /* 2 */ {'3', M('3'), '3'}, /* 3 */ - {'0', M('0'), '0'}, /* Ins */ + {'i', 'I', C('i')}, /* Ins */ {'.', ':', ':'} /* Del */ }; @@ -438,7 +438,8 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar wp.length = sizeof(wp); if (GetWindowPlacement(hWnd, &wp)) { - GetNHApp()->regMainShowState = wp.showCmd; + GetNHApp()->regMainShowState = (wp.showCmd == SW_SHOWMAXIMIZED + ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL); GetNHApp()->regMainMinX = wp.ptMinPosition.x; GetNHApp()->regMainMinY = wp.ptMinPosition.y; @@ -472,9 +473,15 @@ LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar NHEVENT_KBD('\033'); /* and send keyboard input as if user pressed ESC */ /* additional code for this is done in menu and rip windows */ } + else if (!program_state.something_worth_saving) + { + /* User exited before the game started, e.g. during splash display */ + /* Just get out. */ + bail((char *)0); + } else { - switch(MessageBox(hWnd, TEXT("Save?"), TEXT("NetHack for Windows"), MB_YESNOCANCEL | MB_ICONQUESTION)) { + switch (NHMessageBox(hWnd, TEXT("Save?"), MB_YESNOCANCEL | MB_ICONQUESTION)) { case IDYES: NHEVENT_KBD('y'); dosave(); break; case IDNO: NHEVENT_KBD('q'); done(QUIT); break; case IDCANCEL: break; @@ -761,9 +768,9 @@ LRESULT onWMCommand(HWND hWnd, WPARAM wParam, LPARAM lParam) { mswin_destroy_reg(); /* Notify the user that windows settings will not be saved this time. */ - MessageBox(GetNHApp()->hMainWnd, + NHMessageBox(GetNHApp()->hMainWnd, "Your Windows Settings will not be stored when you exit this time.", - "NetHack", MB_OK | MB_ICONINFORMATION); + MB_OK | MB_ICONINFORMATION); break; } diff --git a/win/win32/mhsplash.c b/win/win32/mhsplash.c index 4f4ed2677..ecc4661a3 100644 --- a/win/win32/mhsplash.c +++ b/win/win32/mhsplash.c @@ -16,27 +16,31 @@ PNHWinApp GetNHApp(void); BOOL CALLBACK NHSplashWndProc(HWND, UINT, WPARAM, LPARAM); #define SPLASH_WIDTH 440 -#define SPLASH_HEIGHT 301 +#define SPLASH_HEIGHT 322 #define SPLASH_VERSION_X 290 #define SPLASH_VERSION_Y 10 -#define SPLASH_EXTRA_X_BEGIN 15 -#define SPLASH_EXTRA_X_END 415 -#define SPLASH_EXTRA_Y 150 #define SPLASH_OFFSET_X 10 #define SPLASH_OFFSET_Y 10 extern HFONT version_splash_font; -extern HFONT extrainfo_splash_font; void mswin_display_splash_window (BOOL show_ver) { MSG msg; - RECT rt; + int left, top; RECT splashrt; RECT clientrt; RECT controlrt; HWND hWnd; - int buttop; + int buttop; + int strsize = 0; + int bufsize = BUFSZ; + char *buf = malloc(bufsize); + + if (buf == NULL) + panic("out of memory"); + buf[0] = '\0'; + hWnd = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_SPLASH), GetNHApp()->hMainWnd, NHSplashWndProc); @@ -57,82 +61,115 @@ void mswin_display_splash_window (BOOL show_ver) splashrt.right += SPLASH_WIDTH + SPLASH_OFFSET_X * 2 - clientrt.right; splashrt.bottom += SPLASH_HEIGHT + controlrt.bottom + SPLASH_OFFSET_Y * 3 - clientrt.bottom; /* Place the window centered */ - GetWindowRect(GetNHApp()->hMainWnd, &rt); - rt.left += (rt.right - rt.left - splashrt.right) / 2; - rt.top += (rt.bottom - rt.top - splashrt.bottom) / 2; - MoveWindow(hWnd, rt.left, rt.top, splashrt.right, splashrt.bottom, TRUE); - /* Place the OK control */ + /* On the screen, not on the parent window */ + left = (GetSystemMetrics(SM_CXSCREEN) - splashrt.right) / 2; + top = (GetSystemMetrics(SM_CYSCREEN) - splashrt.bottom) / 2; + MoveWindow(hWnd, left, top, splashrt.right, splashrt.bottom, TRUE); + /* Place the OK control */ GetClientRect (hWnd, &clientrt); MoveWindow (GetDlgItem(hWnd, IDOK), (clientrt.right - clientrt.left - controlrt.right) / 2, clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y, controlrt.right, controlrt.bottom, TRUE); - buttop = clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y; - /* Place the text control */ - GetWindowRect (GetDlgItem(hWnd, IDC_EXTRAINFO), &controlrt); - controlrt.right -= controlrt.left; - controlrt.bottom -= controlrt.top; - GetClientRect (hWnd, &clientrt); - MoveWindow (GetDlgItem(hWnd, IDC_EXTRAINFO), - clientrt.left + SPLASH_OFFSET_X, - buttop - controlrt.bottom - SPLASH_OFFSET_Y, - clientrt.right - 2 * SPLASH_OFFSET_X, controlrt.bottom, TRUE); - if (show_ver) { - /* Show complete version informatoin */ - char buf[BUFSZ]; - - getversionstring(buf); - SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), buf); - - } else { - /* Show news, if any */ - FILE *nf; - - nf = fopen(NEWS, "r"); - if (nf != NULL) { - char *buf = NULL; - int bufsize = 0; - int strsize = 0; - char line[LLEN + 1]; - - while (fgets(line, LLEN, nf)) { - size_t len; - len = strlen(line); - if (line[len - 1] == '\n') { - line[len - 1] = '\r'; - line[len] = '\n'; - line[len + 1] = '\0'; - len++; - } - if (strsize + (int)len > bufsize) - { - bufsize += BUFSZ; - buf = realloc(buf, bufsize); - if (buf == NULL) - panic("out of memory"); - if (strsize == 0) - buf[0] = '\0'; - } - strcat(buf, line); - strsize += len; - } - (void) fclose(nf); - SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), buf); - free(buf); - } - else - SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), "No news."); - } - ShowWindow(hWnd, SW_SHOW); - - while( IsWindow(hWnd) && - GetMessage(&msg, NULL, 0, 0)!=0 ) { - if( !IsDialogMessage(hWnd, &msg) ) { - TranslateMessage(&msg); - DispatchMessage(&msg); + buttop = clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y; + /* Place the text control */ + GetWindowRect (GetDlgItem(hWnd, IDC_EXTRAINFO), &controlrt); + controlrt.right -= controlrt.left; + controlrt.bottom -= controlrt.top; + GetClientRect (hWnd, &clientrt); + MoveWindow (GetDlgItem(hWnd, IDC_EXTRAINFO), + clientrt.left + SPLASH_OFFSET_X, + buttop - controlrt.bottom - SPLASH_OFFSET_Y, + clientrt.right - 2 * SPLASH_OFFSET_X, controlrt.bottom, TRUE); + + /* Fill the text control */ + Sprintf (buf, "%s\r\n%s\r\n%s\r\n\r\n", COPYRIGHT_BANNER_A, COPYRIGHT_BANNER_B, + COPYRIGHT_BANNER_C); + strsize = strlen(buf); + + if (show_ver) { + /* Show complete version information */ + dlb *f; + + getversionstring(buf + strsize); + strcat(buf, "\r\n\r\n"); + strsize = strlen(buf); + + /* Add compile options */ + f = dlb_fopen(OPTIONS_USED, RDTMODE); + if (f) { + char line[LLEN + 1]; + + while (dlb_fgets(line, LLEN, f)) { + size_t len; + len = strlen(line); + if (len > 0 && line[len - 1] == '\n') { + line[len - 1] = '\r'; + line[len] = '\n'; + line[len + 1] = '\0'; + len++; + } + if (strsize + (int)len > bufsize) + { + bufsize += BUFSZ; + buf = realloc(buf, bufsize); + if (buf == NULL) + panic("out of memory"); + } + strcat(buf, line); + strsize += len; } + (void) dlb_fclose(f); + } + } else { + /* Show news, if any */ + if (iflags.news) { + FILE *nf; + + iflags.news = 0; /* prevent newgame() from re-displaying news */ + nf = fopen(NEWS, "r"); + if (nf != NULL) { + char line[LLEN + 1]; + + while (fgets(line, LLEN, nf)) { + size_t len; + len = strlen(line); + if (len > 0 && line[len - 1] == '\n') { + line[len - 1] = '\r'; + line[len] = '\n'; + line[len + 1] = '\0'; + len++; + } + if (strsize + (int)len > bufsize) + { + bufsize += BUFSZ; + buf = realloc(buf, bufsize); + if (buf == NULL) + panic("out of memory"); + } + strcat(buf, line); + strsize += len; + } + (void) fclose(nf); + } + else + { + strcat(buf, "No news."); + } + } } + SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), buf); + free(buf); + ShowWindow(hWnd, SW_SHOW); + while( IsWindow(hWnd) && + GetMessage(&msg, NULL, 0, 0)!=0 ) { + if( !IsDialogMessage(hWnd, &msg) ) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + GetNHApp()->hPopupWnd = NULL; mswin_destroy_splashfonts(); } @@ -155,7 +192,6 @@ BOOL CALLBACK NHSplashWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa case WM_PAINT: { char VersionString[BUFSZ]; - char InfoString[BUFSZ]; RECT rt; HDC hdcBitmap; HANDLE OldBitmap; @@ -189,22 +225,6 @@ BOOL CALLBACK NHSplashWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa DT_LEFT | DT_NOPREFIX | DT_CALCRECT); DrawText (hdc, VersionString, strlen(VersionString), &rt, DT_LEFT | DT_NOPREFIX); - - /* Print copyright banner */ - - SetTextColor (hdc, RGB(255, 255, 255)); - Sprintf (InfoString, "%s\n%s\n%s\n", COPYRIGHT_BANNER_A, COPYRIGHT_BANNER_B, - COPYRIGHT_BANNER_C); - SelectObject(hdc, extrainfo_splash_font); - rt.left = SPLASH_EXTRA_X_BEGIN; - rt.right = SPLASH_EXTRA_X_END; - rt.bottom = rt.top = SPLASH_EXTRA_Y; - DrawText (hdc, InfoString, strlen(InfoString), &rt, - DT_LEFT | DT_NOPREFIX | DT_LEFT | DT_VCENTER | DT_CALCRECT); - DrawText (hdc, InfoString, strlen(InfoString), &rt, - DT_LEFT | DT_NOPREFIX | DT_LEFT | DT_VCENTER); - - SelectObject(hdc, OldFont); EndPaint (hWnd, &ps); } break; diff --git a/win/win32/mswproc.c b/win/win32/mswproc.c index ce27794ee..fb020c305 100644 --- a/win/win32/mswproc.c +++ b/win/win32/mswproc.c @@ -23,6 +23,7 @@ #include "mhrip.h" #include "mhmain.h" #include "mhfont.h" +#include "resource.h" #define LLEN 128 @@ -333,8 +334,8 @@ void prompt_for_player_selection(void) /* tty_putstr(BASE_WINDOW, 0, ""); */ /* echoline = wins[BASE_WINDOW]->cury; */ - box_result = MessageBox(NULL, prompt, TEXT("NetHack for Windows"), - MB_YESNOCANCEL | MB_DEFBUTTON1); + box_result = NHMessageBox(NULL, prompt, + MB_YESNOCANCEL | MB_DEFBUTTON1 | MB_ICONQUESTION); pick4u = (box_result == IDYES) ? 'y' : (box_result == IDNO) ? 'n' : '\033'; /* tty_putstr(BASE_WINDOW, 0, prompt); */ do { @@ -998,7 +999,7 @@ void mswin_display_file(const char *filename,BOOLEAN_P must_exist) if (must_exist) { TCHAR message[90]; _stprintf(message, TEXT("Warning! Could not find file: %s\n"), NH_A2W(filename, wbuf, sizeof(wbuf))); - MessageBox(GetNHApp()->hMainWnd, message, TEXT("ERROR"), MB_OK | MB_ICONERROR ); + NHMessageBox(GetNHApp()->hMainWnd, message, MB_OK | MB_ICONEXCLAMATION ); } } else { winid text; @@ -1275,7 +1276,7 @@ void mswin_raw_print(const char *str) TCHAR wbuf[255]; logDebug("mswin_raw_print(%s)\n", str); if( str && *str ) - MessageBox(GetNHApp()->hMainWnd, NH_A2W(str, wbuf, sizeof(wbuf)), TEXT("NetHack"), MB_OK ); + NHMessageBox(GetNHApp()->hMainWnd, NH_A2W(str, wbuf, sizeof(wbuf)), MB_ICONINFORMATION | MB_OK ); } /* @@ -1288,7 +1289,7 @@ void mswin_raw_print_bold(const char *str) TCHAR wbuf[255]; logDebug("mswin_raw_print_bold(%s)\n", str); if( str && *str ) - MessageBox(GetNHApp()->hMainWnd, NH_A2W(str, wbuf, sizeof(wbuf)), TEXT("NetHack"), MB_OK ); + NHMessageBox(GetNHApp()->hMainWnd, NH_A2W(str, wbuf, sizeof(wbuf)), MB_ICONINFORMATION | MB_OK ); } /* @@ -1405,10 +1406,9 @@ char mswin_yn_function(const char *question, const char *choices, + strlen(GetNHApp()->saved_text) + 1); DWORD box_result; strcat(text, question); - box_result = MessageBox(NULL, + box_result = NHMessageBox(NULL, NH_W2A(text, message, sizeof(message)), - TEXT("NetHack for Windows"), - MB_YESNOCANCEL | + MB_ICONQUESTION | MB_YESNOCANCEL | ((def == 'y') ? MB_DEFBUTTON1 : (def == 'n') ? MB_DEFBUTTON2 : MB_DEFBUTTON3)); free(text); @@ -2476,3 +2476,13 @@ void mswin_update_window_placement(int type, LPRECT rt) } } + +int NHMessageBox(HWND hWnd, LPCTSTR text, UINT type) +{ + TCHAR title[MAX_LOADSTRING]; + + LoadString(GetNHApp()->hApp, IDS_APP_TITLE_SHORT, title, MAX_LOADSTRING); + + return MessageBox(hWnd, text, title, type); +} + diff --git a/win/win32/resource.h b/win/win32/resource.h index c9c06af37..8cc7dd4b4 100644 --- a/win/win32/resource.h +++ b/win/win32/resource.h @@ -11,6 +11,7 @@ #define IDS_HELLO 106 #define IDI_NETHACKW 107 #define IDC_NETHACKW 109 +#define IDS_APP_TITLE_SHORT 110 #define IDR_MAINFRAME 128 #define IDB_TILES 129 #define IDD_TEXT 130 diff --git a/win/win32/winMS.h b/win/win32/winMS.h index 684be30cd..c2a7d0daa 100644 --- a/win/win32/winMS.h +++ b/win/win32/winMS.h @@ -164,6 +164,9 @@ void mswin_write_reg(void); void mswin_get_window_placement(int type, LPRECT rt); void mswin_update_window_placement(int type, LPRECT rt); +int NHMessageBox(HWND hWnd, LPCTSTR text, UINT type); + + extern HBRUSH menu_bg_brush; extern HBRUSH menu_fg_brush; extern HBRUSH text_bg_brush; diff --git a/win/win32/winhack.rc b/win/win32/winhack.rc index 32d210a57..aa4c92240 100644 --- a/win/win32/winhack.rc +++ b/win/win32/winhack.rc @@ -206,7 +206,7 @@ CAPTION "Welcome to NetHack" FONT 8, "MS Sans Serif" BEGIN DEFPUSHBUTTON "OK",IDOK,224,236,50,14 - EDITTEXT IDC_EXTRAINFO,7,191,267,37,ES_MULTILINE | ES_READONLY | + EDITTEXT IDC_EXTRAINFO,7,176,267,52,ES_MULTILINE | ES_READONLY | WS_VSCROLL END @@ -325,6 +325,7 @@ STRINGTABLE DISCARDABLE BEGIN IDS_APP_TITLE "NetHack for Windows - Graphical Interface" IDC_NETHACKW "NETHACKW" + IDS_APP_TITLE_SHORT "NetHack for Windows" END #endif // English (U.S.) resources -- 2.40.0