1 /* Copyright (C) 2001 by Alex Kompel <shurikk@pacbell.net> */
2 /* NetHack may be freely redistributed.  See license for details. */
3 
4 #include "winMS.h"
5 #include "resource.h"
6 #include "mhsplash.h"
7 #include "mhmsg.h"
8 #include "mhfont.h"
9 #include "patchlevel.h"
10 #include "dlb.h"
11 
12 #define LLEN 128
13 
14 PNHWinApp GetNHApp(void);
15 
16 BOOL CALLBACK NHSplashWndProc(HWND, UINT, WPARAM, LPARAM);
17 
18 #define SPLASH_WIDTH		440
19 #define SPLASH_HEIGHT  322
20 #define SPLASH_VERSION_X		290
21 #define SPLASH_VERSION_Y		10
22 #define SPLASH_OFFSET_X		10
23 #define SPLASH_OFFSET_Y		10
24 
25 extern HFONT version_splash_font;
26 
mswin_display_splash_window(BOOL show_ver)27 void mswin_display_splash_window (BOOL show_ver)
28 {
29 	MSG msg;
30 	HWND mapWnd;
31 	int left, top;
32 	RECT splashrt;
33 	RECT clientrt;
34 	RECT controlrt;
35 	HWND hWnd;
36 	int buttop;
37 	int strsize = 0;
38 	int bufsize = BUFSZ;
39 
40 	char *buf = malloc(bufsize);
41 	if (buf == NULL)
42 	    panic("out of memory");
43 	buf[0] = '\0';
44 
45 	hWnd = CreateDialog(GetNHApp()->hApp, MAKEINTRESOURCE(IDD_SPLASH),
46 	    GetNHApp()->hMainWnd, NHSplashWndProc);
47 	if( !hWnd ) panic("Cannot create Splash window");
48 	mswin_init_splashfonts(hWnd);
49 	GetNHApp()->hPopupWnd = hWnd;
50 	mapWnd = mswin_hwnd_from_winid(WIN_MAP);
51 	if( !IsWindow(mapWnd) ) mapWnd = GetNHApp()->hMainWnd;
52 	/* Get control size */
53 	GetWindowRect (GetDlgItem(hWnd, IDOK), &controlrt);
54 	controlrt.right -= controlrt.left;
55 	controlrt.bottom -= controlrt.top;
56 	/* Get current client area */
57 	GetClientRect (hWnd, &clientrt);
58 	/* Get window size */
59 	GetWindowRect(hWnd, &splashrt);
60 	splashrt.right -= splashrt.left;
61 	splashrt.bottom -= splashrt.top;
62 	/* Get difference between requested client area and current value */
63 	splashrt.right += SPLASH_WIDTH + SPLASH_OFFSET_X * 2 - clientrt.right;
64 	splashrt.bottom += SPLASH_HEIGHT + controlrt.bottom + SPLASH_OFFSET_Y * 3 - clientrt.bottom;
65 	/* Place the window centered */
66 	/* On the screen, not on the parent window */
67 	left = (GetSystemMetrics(SM_CXSCREEN) - splashrt.right) / 2;
68 	top = (GetSystemMetrics(SM_CYSCREEN) - splashrt.bottom) / 2;
69 	MoveWindow(hWnd, left, top, splashrt.right, splashrt.bottom, TRUE);
70 	/* Place the OK control */
71 	GetClientRect (hWnd, &clientrt);
72 	MoveWindow (GetDlgItem(hWnd, IDOK),
73 	    (clientrt.right - clientrt.left - controlrt.right) / 2,
74 	    clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y,
75 	    controlrt.right, controlrt.bottom, TRUE);
76 	buttop = clientrt.bottom - controlrt.bottom - SPLASH_OFFSET_Y;
77 	/* Place the text control */
78 	GetWindowRect (GetDlgItem(hWnd, IDC_EXTRAINFO), &controlrt);
79 	controlrt.right -= controlrt.left;
80 	controlrt.bottom -= controlrt.top;
81 	GetClientRect (hWnd, &clientrt);
82 	MoveWindow (GetDlgItem(hWnd, IDC_EXTRAINFO),
83 	    clientrt.left + SPLASH_OFFSET_X,
84 	    buttop - controlrt.bottom - SPLASH_OFFSET_Y,
85 	    clientrt.right - 2 * SPLASH_OFFSET_X, controlrt.bottom, TRUE);
86 	/* Fill the text control */
87 	Sprintf(buf, "%s\r\n%s\r\n%s\r\n\r\n", COPYRIGHT_BANNER_A, COPYRIGHT_BANNER_B,
88 	    COPYRIGHT_BANNER_C);
89 	strsize = strlen(buf);
90 
91 	if (show_ver) {
92 	    /* Show complete version information */
93 	    dlb *f;
94 
95 	    getversionstring(buf + strsize);
96 	    strcat(buf, "\r\n\r\n");
97 	    strsize = strlen(buf);
98 
99 	    /* Add compile options */
100 	    f = dlb_fopen(OPTIONS_USED, RDTMODE);
101 	    if (f) {
102 		char line[LLEN + 1];
103 
104 		while (dlb_fgets(line, LLEN, f)) {
105 		    size_t len;
106 		    len = strlen(line);
107 		    if (len > 0 && line[len - 1] == '\n') {
108 			line[len - 1] = '\r';
109 			line[len] = '\n';
110 			line[len + 1] = '\0';
111 			len++;
112 		    }
113 		    if (strsize + (int)len + 1 > bufsize)
114 		    {
115 			bufsize += BUFSZ;
116 			buf = realloc(buf, bufsize);
117 			if (buf == NULL)
118 			    panic("out of memory");
119 		    }
120 		    strcat(buf, line);
121 		    strsize += len;
122 		}
123 		(void) dlb_fclose(f);
124 	    }
125 	} else {
126 	    /* Show news, if any */
127 	    if (iflags.news) {
128 		FILE *nf;
129 
130 		iflags.news = 0; /* prevent newgame() from re-displaying news */
131 		nf = fopen(NEWS, "r");
132 		if (nf != NULL) {
133 		    char line[LLEN + 1];
134 
135 		    while (fgets(line, LLEN, nf)) {
136 			size_t len;
137 			len = strlen(line);
138 			if (len > 0 && line[len - 1] == '\n') {
139 			    line[len - 1] = '\r';
140 			    line[len] = '\n';
141 			    line[len + 1] = '\0';
142 			    len++;
143 			}
144 			if (strsize + (int)len + 1 > bufsize)
145 			{
146 			    bufsize += BUFSZ;
147 			    buf = realloc(buf, bufsize);
148 			    if (buf == NULL)
149 				panic("out of memory");
150 			}
151 			strcat(buf, line);
152 			strsize += len;
153 		    }
154 		    (void) fclose(nf);
155 		}
156 		else
157 		{
158 		    strcat(buf, "No news.");
159 		}
160 	    }
161 	}
162 	SetWindowText(GetDlgItem(hWnd, IDC_EXTRAINFO), buf);
163 	free(buf);
164 	ShowWindow(hWnd, SW_SHOW);
165 
166 	while( IsWindow(hWnd) &&
167 	    GetMessage(&msg, NULL, 0, 0)!=0 ) {
168 	    if( !IsDialogMessage(hWnd, &msg) ) {
169 		TranslateMessage(&msg);
170 		DispatchMessage(&msg);
171 	    }
172 	}
173 
174 	GetNHApp()->hPopupWnd = NULL;
175 	mswin_destroy_splashfonts();
176 }
177 
NHSplashWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)178 BOOL CALLBACK NHSplashWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
179 {
180 	HDC hdc;
181 	switch (message)
182 	{
183 	case WM_INITDIALOG:
184 	    /* set text control font */
185 		hdc = GetDC(hWnd);
186 		SendMessage(hWnd, WM_SETFONT,
187 			(WPARAM)mswin_get_font(NHW_TEXT, ATR_NONE, hdc, FALSE), 0);
188 		ReleaseDC(hWnd, hdc);
189 
190 		SetFocus(GetDlgItem(hWnd, IDOK));
191 	return FALSE;
192 
193 	case WM_PAINT:
194 	{
195 		char VersionString[BUFSZ];
196 		RECT rt;
197 		HDC hdcBitmap;
198 		HANDLE OldBitmap;
199 		HANDLE OldFont;
200 		PAINTSTRUCT ps;
201 
202 		hdc = BeginPaint (hWnd, &ps);
203 		/* Show splash graphic */
204 
205 		hdcBitmap = CreateCompatibleDC(hdc);
206 		SetBkMode (hdc, OPAQUE);
207 		OldBitmap = SelectObject(hdcBitmap, GetNHApp()->bmpSplash);
208 		nhapply_image_transparent(hdc, SPLASH_OFFSET_X, SPLASH_OFFSET_Y,
209 		    SPLASH_WIDTH, SPLASH_HEIGHT,
210 		    hdcBitmap, 0, 0, SPLASH_WIDTH, SPLASH_HEIGHT,
211 		    TILE_BK_COLOR);
212 
213 		SelectObject (hdcBitmap, OldBitmap);
214 		DeleteDC (hdcBitmap);
215 
216 		SetBkMode (hdc, TRANSPARENT);
217 		/* Print version number */
218 
219 		SetTextColor (hdc, RGB(0, 0, 0));
220 		rt.right = rt.left = SPLASH_VERSION_X;
221 		rt.bottom = rt.top = SPLASH_VERSION_Y;
222 		Sprintf (VersionString, "%d.%d.%d", VERSION_MAJOR, VERSION_MINOR,
223 		    PATCHLEVEL);
224 		OldFont = SelectObject(hdc, version_splash_font);
225 		DrawText (hdc, VersionString, strlen(VersionString), &rt,
226 		    DT_LEFT | DT_NOPREFIX | DT_CALCRECT);
227 		DrawText (hdc, VersionString, strlen(VersionString), &rt,
228 		    DT_LEFT | DT_NOPREFIX);
229 
230 		EndPaint (hWnd, &ps);
231 	}
232 	break;
233 
234 	case WM_COMMAND:
235 	switch (LOWORD(wParam))
236         {
237 		case IDOK:
238 			mswin_window_mark_dead(mswin_winid_from_handle(hWnd));
239 			if( GetNHApp()->hMainWnd==hWnd )
240 				GetNHApp()->hMainWnd=NULL;
241 			DestroyWindow(hWnd);
242 			SetFocus(GetNHApp()->hMainWnd);
243 			return TRUE;
244 		}
245 	break;
246 	}
247 	return FALSE;
248 }
249