1 // Menu handling
2 
3 #include "burner.h"
4 
5 #ifdef _MSC_VER
6 // #include <winable.h>
7 #endif
8 
9 int nOtherRes = 0;
10 
11 HMENU hMenu = NULL;
12 HMENU hMenuPopup = NULL;
13 HWND hMenubar = NULL;			  			// Handle to the Toolbar control comprising the menu
14 static HMENU hBlitterMenu[8] = {NULL, };	// Handles to the blitter-specific sub-menus
15 static HMENU hAudioPluginMenu[8] = {NULL, };
16 
17 bool bMenuDisplayed = false;
18 bool bModelessMenu = false;
19 int nLastMenu = 0;
20 static int nRecursions = -1;
21 static HMENU hCurrentMenu;
22 static int nCurrentItem;
23 static int nCurrentItemFlags;
24 
25 int nMenuHeight = 0;
26 int nWindowSize = 0;
27 int nScreenSize = 0;
28 int nScreenSizeHor = 0;
29 int nScreenSizeVer = 0;
30 
31 TCHAR szPrevGames[SHOW_PREV_GAMES][32];
32 
33 static HHOOK hMenuHook;
34 
MenuHook(int nCode,WPARAM wParam,LPARAM lParam)35 static LRESULT CALLBACK MenuHook(int nCode, WPARAM wParam, LPARAM lParam)
36 {
37 
38 	switch (((MSG*)lParam)->message) {
39 
40 		case WM_MOUSEMOVE: {				// Translate coordinates to menubar client coordinates
41 			RECT rect;
42 			POINT point = {GET_X_LPARAM(((MSG*)lParam)->lParam), GET_Y_LPARAM(((MSG*)lParam)->lParam)};
43 
44 			GetWindowRect(hMenubar, &rect);
45 
46 			if (point.x >= rect.left && point.y >= rect.top && point.x < rect.right && point.y < rect.bottom) {
47 				RECT buttonrect;
48 				SendMessage(hMenubar, TB_GETITEMRECT, nLastMenu, (LPARAM)&buttonrect);
49 
50 				if (!(point.x >= rect.left + buttonrect.left && point.y >= rect.top + buttonrect.top && point.x < rect.left + buttonrect.right && point.y < rect.top + buttonrect.bottom)) {
51 					SendNotifyMessage(hMenubar, WM_MOUSEMOVE, wParam, MAKELONG(point.x - rect.left, point.y - rect.top));
52 				}
53 			}
54 			break;
55 		}
56 
57 		case WM_LBUTTONDOWN: {
58 			RECT rect;
59 			RECT buttonrect;
60 			POINT point = {GET_X_LPARAM(((MSG*)lParam)->lParam), GET_Y_LPARAM(((MSG*)lParam)->lParam)};
61 
62 			GetWindowRect(hMenubar, &rect);
63 			SendMessage(hMenubar, TB_GETITEMRECT, nLastMenu, (LPARAM)&buttonrect);
64 
65 			// If the button is pressed over the currently selected menu title, eat the message and close the menu
66 			if (point.x >= rect.left + buttonrect.left && point.y >= rect.top + buttonrect.top && point.x < rect.left + buttonrect.right && point.y < rect.top + buttonrect.bottom) {
67 				PostMessage(hMenubar, WM_CANCELMODE, 0, 0);
68 				return 1;
69 			}
70 			break;
71 		}
72 
73 	}
74 
75 	MenuHandleKeyboard((MSG*)lParam);
76 
77 	return CallNextHookEx(hMenuHook, nCode, wParam, lParam);
78 }
79 
DisplayPopupMenu(int nMenu)80 void DisplayPopupMenu(int nMenu)
81 {
82 	if (bMenuDisplayed) {
83 		EndMenu();
84 		if (nLastMenu != nMenu) {
85 			PostMessage(hScrnWnd, UM_DISPLAYPOPUP, nMenu, 0);
86 		}
87 	} else {
88 		HMENU hPopupMenu = GetSubMenu(hMenu, nMenu);
89 		RECT clientRect;
90 		RECT buttonRect;
91 
92 		nLastMenu = nMenu;
93 		nRecursions = 0;
94 		nCurrentItemFlags = 0;
95 
96 		GetWindowRect(hMenubar, &clientRect);
97 		SendMessage(hMenubar, TB_GETITEMRECT, nMenu, (LPARAM)&buttonRect);
98 
99 	 	if (!bModelessMenu) {
100 			hMenuHook = SetWindowsHookEx(WH_MSGFILTER, MenuHook, NULL, GetCurrentThreadId());
101 		}
102   		TrackPopupMenuEx(hPopupMenu, TPM_LEFTALIGN | TPM_TOPALIGN, clientRect.left + buttonRect.left, clientRect.top + buttonRect.bottom, hScrnWnd, NULL);
103 	 	if (!bModelessMenu) {
104 			UnhookWindowsHookEx(hMenuHook);
105 		}
106 	}
107 }
108 
OnNotify(HWND,int,NMHDR * lpnmhdr)109 int OnNotify(HWND, int, NMHDR* lpnmhdr)		// HWND hwnd, int id, NMHDR* lpnmhdr
110 {
111 	switch (((TBNOTIFY*)lpnmhdr)->hdr.code) {
112 
113 		case TBN_DROPDOWN: {
114 			if (!bMenuDisplayed || ((TBNOTIFY*)lpnmhdr)->iItem - MENU_MENU_0 != nLastMenu) {
115 				DisplayPopupMenu(((TBNOTIFY*)lpnmhdr)->iItem - MENU_MENU_0);
116 				nLastMenu = ((TBNOTIFY*)lpnmhdr)->iItem - MENU_MENU_0;
117 			}
118 			return TBDDRET_DEFAULT;
119 		}
120 
121 		case TBN_HOTITEMCHANGE: {
122 			int nItem = ((NMTBHOTITEM*)lpnmhdr)->idNew;
123 
124 			// If a menu is being displayed, close it and display the new one
125 			if (bMenuDisplayed) {
126 				if (nItem) {
127 					if (nItem - MENU_MENU_0 != nLastMenu) {
128 						DisplayPopupMenu(nItem - MENU_MENU_0);
129 						return 1;
130 					}
131 				}
132 			} else {
133 				nLastMenu = nItem - MENU_MENU_0;
134 				if (!nItem && !bAltPause) {
135 					GameInpCheckMouse();
136 				}
137 				return 0;
138 			}
139 		}
140 	}
141 	return 0;
142 }
143 
OnMenuSelect(HWND,HMENU,int nItem,HMENU,UINT nFlags)144 int OnMenuSelect(HWND, HMENU, int nItem, HMENU, UINT nFlags)
145 {
146 //	printf("WM_MENUSELECT: %4i, %08x\n", nItem, nFlags);
147 	nCurrentItem = nItem;
148 	nCurrentItemFlags = nFlags;
149 	return 0;
150 }
151 
OnInitMenuPopup(HWND,HMENU hNewMenuPopup,UINT,BOOL bWindowsMenu)152 int OnInitMenuPopup(HWND, HMENU hNewMenuPopup, UINT, BOOL bWindowsMenu)
153 {
154 	if (!bWindowsMenu) {
155 		if (!nRecursions) {
156 			bMenuDisplayed = true;
157 			SendMessage(hMenubar, TB_PRESSBUTTON, nLastMenu + MENU_MENU_0, MAKELONG(1, 0));
158 			hCurrentMenu = hNewMenuPopup;
159 		}
160 		nRecursions++;
161 	}
162 	return 0;
163 }
164 
OnUnInitMenuPopup(HWND,HMENU,UINT,BOOL)165 int OnUnInitMenuPopup(HWND, HMENU, UINT, BOOL)
166 {
167 	if (nRecursions <= 1) {
168 		bMenuDisplayed = false;
169   		SendMessage(hMenubar, TB_PRESSBUTTON, nLastMenu + MENU_MENU_0, MAKELONG(0, 0));
170 		if(!bAltPause) {
171 			if (bRunPause) {
172 				bRunPause = 0;
173 			}
174 			GameInpCheckMouse();
175 		}
176 	}
177 	nRecursions--;
178 
179 	return 0;
180 }
181 
MenuHandleKeyboard(MSG * Msg)182 bool MenuHandleKeyboard(MSG* Msg)
183 {
184 	static bool bProcessAltKeyUp = true;
185 
186 	if (!bMenuEnabled) {
187 		return 0;
188 	}
189 
190 	if (Msg->message == WM_KEYDOWN) {
191 		switch (Msg->wParam) {
192 			case VK_ESCAPE: {
193 				if (bMenuDisplayed) {
194 					if (nRecursions > 1) {
195 						break;
196 					} else {
197 						EndMenu();
198 						SendMessage(hMenubar, TB_SETHOTITEM, nLastMenu, 0);
199 						return 1;
200 					}
201 				} else {
202 					if (SendMessage(hMenubar, TB_GETHOTITEM, 0, 0) != -1) {
203 						SendMessage(hMenubar, TB_SETHOTITEM, (WPARAM)-1, 0);
204 						if (!bAltPause) {
205 							GameInpCheckMouse();
206 						}
207 						return 1;
208 					}
209 				}
210 				break;
211 			}
212 			case VK_LEFT: {
213 				int nItem;
214 				if (bMenuDisplayed) {
215 					if (nRecursions > 1) {
216 						break;
217 					} else {
218 						nItem = nLastMenu;
219 					}
220 				} else {
221 					nItem = SendMessage(hMenubar, TB_GETHOTITEM, 0, 0);
222 				}
223 				if (nItem != -1) {
224 					if (nItem) {
225 						nItem -= 1;
226 					} else {
227 						nItem = 5;
228 					}
229 					SendMessage(hMenubar, TB_SETHOTITEM, (WPARAM)nItem, 0);
230 					return 1;
231 				}
232 				break;
233 			}
234 			case VK_RIGHT: {
235 				int nItem;
236 				if (bMenuDisplayed) {
237 					if (nCurrentItemFlags & MF_POPUP) {
238 						break;
239 					} else {
240 						nItem = nLastMenu;
241 					}
242 				} else {
243 					nItem = SendMessage(hMenubar, TB_GETHOTITEM, 0, 0);
244 				}
245 				if (nItem != -1) {
246 					if (nItem != 5) {
247 						nItem += 1;
248 					} else {
249 						nItem = 0;
250 					}
251 					SendMessage(hMenubar, TB_SETHOTITEM, (WPARAM)nItem, 0);
252 					return 1;
253 				}
254 				break;
255 			}
256 			case VK_UP: {
257 				if (!bMenuDisplayed) {
258 					int nItem = SendMessage(hMenubar, TB_GETHOTITEM, 0, 0);
259 					if (nItem == -1) {
260 						break;
261 					} else {
262 						SendMessage(hMenubar, TB_SETHOTITEM, (WPARAM)-1, 0);
263 						DisplayPopupMenu(nItem);
264 						return 1;
265 					}
266 				}
267 				break;
268 			}
269 			case VK_DOWN: {
270 				if (!bMenuDisplayed) {
271 					int nItem = SendMessage(hMenubar, TB_GETHOTITEM, 0, 0);
272 					if (nItem == -1) {
273 						break;
274 					} else {
275 						SendMessage(hMenubar, TB_SETHOTITEM, (WPARAM)-1, 0);
276 						DisplayPopupMenu(nItem);
277 						return 1;
278 					}
279 				}
280 				break;
281 			}
282 		}
283 	} else {
284 		if (!bLeftAltkeyMapped || bRunPause || !bDrvOkay) {
285 			if (Msg->message == WM_SYSKEYDOWN && Msg->wParam == VK_MENU) {
286 				if (bMenuDisplayed) {
287 					bProcessAltKeyUp = false;
288 					EndMenu();
289 					if (!bAltPause) {
290 						GameInpCheckMouse();
291 					}
292 					return 1;
293 				}
294 			} else {
295 				if (Msg->message == WM_SYSKEYUP && Msg->wParam == VK_MENU) {
296 					if (bProcessAltKeyUp) {
297 						int nItem = SendMessage(hMenubar, TB_GETHOTITEM, 0, 0);
298 						if (nItem == -1) {													// Menu enabled
299 							SendMessage(hMenubar, TB_SETHOTITEM, 0, 0);
300 							InputSetCooperativeLevel(false, bAlwaysProcessKeyboardInput);
301 							return 1;
302 						} else {															// Menu disabled
303 							SendMessage(hMenubar, TB_SETHOTITEM, (WPARAM)-1, 0);
304 							if (!bAltPause) {
305 								GameInpCheckMouse();
306 							}
307 							return 1;
308 						}
309 					}
310 				} else {
311 					if (Msg->message == UM_DISPLAYPOPUP) {
312 						DisplayPopupMenu(Msg->wParam);
313 						InputSetCooperativeLevel(false, bAlwaysProcessKeyboardInput);
314 						return 1;
315 					}
316 				}
317 			}
318 		}
319 	}
320 
321 	bProcessAltKeyUp = true;
322 
323 	return 0;
324 }
325 
MenuCreate()326 int MenuCreate()
327 {
328 	TBBUTTON button;
329 	TCHAR szButtonText[32];
330 	MENUITEMINFO menuItemInfo;
331 	MENUINFO menu;
332 
333 	if (hMenu == NULL) {
334 		hMenu = FBALoadMenu(hAppInst, MAKEINTRESOURCE(IDR_MENU));					// Main application menu
335 		hBlitterMenu[0] = FBALoadMenu(hAppInst, MAKEINTRESOURCE(IDR_MENU_BLITTER_1));	// DirectDraw Standard blitter
336 		hBlitterMenu[1] = FBALoadMenu(hAppInst, MAKEINTRESOURCE(IDR_MENU_BLITTER_2));	// Direct3D
337 		hBlitterMenu[2] = FBALoadMenu(hAppInst, MAKEINTRESOURCE(IDR_MENU_BLITTER_3));	// Software effects blitter
338 		hBlitterMenu[3] = FBALoadMenu(hAppInst, MAKEINTRESOURCE(IDR_MENU_BLITTER_4));	// DirectX 9
339 		hBlitterMenu[4] = FBALoadMenu(hAppInst, MAKEINTRESOURCE(IDR_MENU_BLITTER_5));	// DirectX 9 Alt
340 
341 		hAudioPluginMenu[0] = FBALoadMenu(hAppInst, MAKEINTRESOURCE(IDR_MENU_AUD_PLUGIN_1));
342 		hAudioPluginMenu[1] = FBALoadMenu(hAppInst, MAKEINTRESOURCE(IDR_MENU_AUD_PLUGIN_2));
343 	}
344 
345 	if (hMenuPopup == NULL) {
346 		hMenuPopup = CreatePopupMenu();
347 
348 		menuItemInfo.cbSize = sizeof(MENUITEMINFO);
349 		menuItemInfo.fMask = MIIM_TYPE;
350 		menuItemInfo.dwTypeData = szButtonText;
351 
352 		for (int i = 0; i < 6; i++) {
353 			menuItemInfo.cch = 32;
354 			GetMenuItemInfo(hMenu, i, true, &menuItemInfo);
355 			AppendMenu(hMenuPopup, MF_POPUP | MF_STRING, (UINT_PTR)GetSubMenu(hMenu, i), szButtonText);
356 		}
357 	}
358 
359 	MenuEnableItems();
360 	MenuUpdate();
361 
362 	bMenuDisplayed = false;
363 	nLastMenu = -1;
364 
365 	hMenubar = CreateWindowEx(0,
366 		TOOLBARCLASSNAME, NULL,
367 		TBSTYLE_FLAT | TBSTYLE_LIST | CCS_NODIVIDER | CCS_NOPARENTALIGN | CCS_NORESIZE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE,
368 		0, 0, 0, 0,
369 		hScrnWnd, NULL, hAppInst, NULL);
370 
371 	SendMessage(hMenubar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
372 	SendMessage(hMenubar, TB_SETBITMAPSIZE, 0, 0);
373 
374 	// Reset window menu to default
375 	GetSystemMenu(hScrnWnd, TRUE);
376 
377 	if (bModelessMenu) {							// Make menu modeless
378 
379 		memset(&menu, 0, sizeof(MENUINFO));
380 		menu.cbSize = sizeof(MENUINFO);
381 		menu.fMask = MIM_APPLYTOSUBMENUS | MIM_STYLE;
382 		menu.dwStyle = MNS_MODELESS | MNS_CHECKORBMP;
383 
384 		SetMenuInfo(hMenuPopup, &menu);
385 
386 		for (int i = 0; i < 6; i++) {
387 			SetMenuInfo(GetSubMenu(hMenu, i), &menu);
388 		}
389 
390 		memset(&menu, 0, sizeof(MENUINFO));
391 		menu.cbSize = sizeof(MENUINFO);
392 		menu.fMask = MIM_STYLE | MIM_MAXHEIGHT;
393 
394 #if 0
395 		// Doesn't seem to work
396 		{
397 			HMENU hWindowMenu = GetSystemMenu(hScrnWnd, FALSE);
398 			GetMenuInfo(hWindowMenu, &menu);
399 			menu.dwStyle |= MNS_MODELESS;
400 			SetMenuInfo(hWindowMenu, &menu);
401 		}
402 #endif
403 	}
404 
405 	// Add buttons to the menu toolbar
406 	memset(&button, 0, sizeof(TBBUTTON));
407 	memset(&menuItemInfo, 0, sizeof(MENUITEMINFO));
408 
409 	menuItemInfo.cbSize = sizeof(MENUITEMINFO);
410 	menuItemInfo.fMask = MIIM_TYPE;
411 	menuItemInfo.dwTypeData = szButtonText;
412 
413 	for (int i = 0; i < 6; i++) {
414 
415 		menuItemInfo.cch = 32;
416 		GetMenuItemInfo(hMenu, i, true, &menuItemInfo);
417 
418 		button.iBitmap = 0;
419 		button.idCommand = MENU_MENU_0 + i;
420 		button.fsState = TBSTATE_ENABLED;
421 		button.fsStyle = TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE;
422 
423 		button.iString = (INT_PTR)szButtonText;
424 
425 		SendMessage(hMenubar, TB_ADDBUTTONS, 1, (LPARAM)&button);
426 	}
427 
428 	SendMessage(hMenubar, TB_AUTOSIZE, 0, 0);
429 
430 	return 0;
431 }
432 
MenuDestroy()433 void MenuDestroy()
434 {
435 	if (hMenubar) {
436 		DestroyWindow(hMenubar);
437 		hMenubar = NULL;
438 	}
439 
440 	{
441 		MENUITEMINFO myMenuItemInfo;
442 		myMenuItemInfo.cbSize = sizeof(MENUITEMINFO);
443 		myMenuItemInfo.fMask = MIIM_SUBMENU | MIIM_STATE;
444         myMenuItemInfo.fState = MFS_GRAYED;
445         myMenuItemInfo.hSubMenu = NULL;
446 		if (hMenu) {
447 			SetMenuItemInfo(GetSubMenu(hMenu, 1), 1, TRUE, &myMenuItemInfo);
448 		}
449 		if (hMenuPopup) {
450 			SetMenuItemInfo(GetSubMenu(hMenuPopup, 1), 1, TRUE, &myMenuItemInfo);
451 		}
452 
453 		for (int i = 0; i < 5; i++) {
454 			if (hBlitterMenu[i]) {
455 				DestroyMenu(hBlitterMenu[i]);
456 				hBlitterMenu[i] = 0;
457 			}
458 		}
459 
460 		for (int i = 0; i < 2; i++) {
461 			if (hAudioPluginMenu[i]) {
462 				DestroyMenu(hAudioPluginMenu[i]);
463 				hAudioPluginMenu[i] = 0;
464 			}
465 		}
466 	}
467 
468 	if(hMenu) {
469 		DestroyMenu(hMenu);
470 		hMenu = NULL;
471 	}
472 	if (hMenuPopup) {
473 		DestroyMenu(hMenuPopup);
474 		hMenuPopup = NULL;
475 	}
476 }
477 
478 // Update the arade resolution menuitem
CreateArcaderesItem()479 void CreateArcaderesItem()
480 {
481 	int nGameWidth, nGameHeight;
482 
483 	TCHAR szItemText[256];
484 	MENUITEMINFO menuItem = {sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText, 0, 0, };
485 
486 	// horizontal oriented
487 	FBALoadString(hAppInst, IDS_MENU_0, szItemText, 256);
488 	if ((bDrvOkay) && !(BurnDrvGetFlags() & BDF_ORIENTATION_VERTICAL)) {
489 		BurnDrvGetVisibleSize(&nGameWidth, &nGameHeight);
490 		_stprintf(szItemText + _tcslen(szItemText), _T("\t(%i x %i)"), nGameWidth, nGameHeight);
491 	}
492 	menuItem.cch = _tcslen(szItemText);
493 	SetMenuItemInfo(hMenu, MENU_RES_ARCADE, 0, &menuItem);
494 
495 	// vertical oriented
496 	TCHAR szItemText2[256];
497 	MENUITEMINFO menuItem2 = {sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText2, 0, 0, };
498 
499 	FBALoadString(hAppInst, IDS_MENU_0, szItemText2, 256);
500 	if (bDrvOkay && BurnDrvGetFlags() & BDF_ORIENTATION_VERTICAL) {
501 		BurnDrvGetVisibleSize(&nGameWidth, &nGameHeight);
502 		_stprintf(szItemText + _tcslen(szItemText2), _T("\t(%i x %i)"), nGameWidth, nGameHeight);
503 	}
504 	menuItem2.cch = _tcslen(szItemText2);
505 	SetMenuItemInfo(hMenu, MENU_RES_ARCADE_VERTICAL, 0, &menuItem2);
506 }
507 
508 // (Horizontal oriented) Update the custom resolution menuitem
CreateOtherresItem(bool bOther)509 static void CreateOtherresItem(bool bOther)
510 {
511 	TCHAR szItemText[256];
512 	MENUITEMINFO menuItem = {sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText, 0, 0 };
513 
514 	FBALoadString(hAppInst, IDS_MENU_1, szItemText, 256);
515 	if (bOther) {
516 		_stprintf(szItemText + _tcslen(szItemText), _T("\t(%i x %i)"), nVidHorWidth, nVidHorHeight);
517 	}
518 	menuItem.cch = _tcslen(szItemText);
519 	SetMenuItemInfo(hMenu, MENU_RES_OTHER, 0, &menuItem);
520 }
521 
522 // (Vertical oriented) Update the custom resolution menuitem
CreateOtherresItemVer(bool bOther)523 static void CreateOtherresItemVer(bool bOther)
524 {
525 	TCHAR szItemText[256];
526 	MENUITEMINFO menuItem = {sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText, 0, 0 };
527 
528 	FBALoadString(hAppInst, IDS_MENU_1, szItemText, 256);
529 	if (bOther) {
530 		_stprintf(szItemText + _tcslen(szItemText), _T("\t(%i x %i)"), nVidVerWidth, nVidVerHeight);
531 	}
532 	menuItem.cch = _tcslen(szItemText);
533 	SetMenuItemInfo(hMenu, MENU_RES_OTHER_VERTICAL, 0, &menuItem);
534 }
535 
CreatepresetResItems()536 static void CreatepresetResItems()
537 {
538 	TCHAR szItemText[256];
539 	MENUITEMINFO menuItem = {sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText, 0, 0 };
540 
541 	// horizontal oriented
542 	for (int i = 0; i < 4; i++) {
543 		_stprintf(szItemText, _T("%i x %i"), VidPreset[i].nWidth, VidPreset[i].nHeight);
544 		menuItem.cch = _tcslen(szItemText);
545 		SetMenuItemInfo(hMenu, MENU_RES_1 + i, 0, &menuItem);
546 	}
547 
548 	// vertical oriented
549 	for (int i = 0; i < 4; i++) {
550 		_stprintf(szItemText, _T("%i x %i"), VidPresetVer[i].nWidth, VidPresetVer[i].nHeight);
551 		menuItem.cch = _tcslen(szItemText);
552 		SetMenuItemInfo(hMenu, MENU_RES_1_VERTICAL + i, 0, &menuItem);
553 	}
554 	return;
555 }
556 
557 // Update the other gamma menuitem
CreateOtherGammaItem(bool bOther)558 static void CreateOtherGammaItem(bool bOther)
559 {
560 	TCHAR szItemText[256];
561 	MENUITEMINFO menuItem = {sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText, 0, 0 };
562 
563 	FBALoadString(hAppInst, IDS_MENU_2, szItemText, 256);
564 	if (bOther) {
565 		_stprintf(szItemText + _tcslen(szItemText), _T("\t(%1.2f)"), nGamma);
566 	}
567 	menuItem.cch = _tcslen(szItemText);
568 	SetMenuItemInfo(hMenu, MENU_GAMMA_OTHER, 0, &menuItem);
569 }
570 
571 // Update the cpu speed menuitem
CreateCPUSpeedItem(bool bOther)572 static void CreateCPUSpeedItem(bool bOther)
573 {
574 	TCHAR szItemText[256];
575 	MENUITEMINFO menuItem = {sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText, 0, 0 };
576 
577 	FBALoadString(hAppInst, IDS_MENU_3, szItemText, 256);
578 	if (bOther) {
579 		_stprintf(szItemText + _tcslen(szItemText), _T("\t(%d%%)"), nBurnCPUSpeedAdjust * 100 / 256);
580 	}
581 	menuItem.cch = _tcslen(szItemText);
582 	SetMenuItemInfo(hMenu, MENU_SETCPUCLOCK, 0, &menuItem);
583 }
584 
585 // Update state slot menuitmes
CreateStateslotItems()586 static void CreateStateslotItems()
587 {
588 	TCHAR szItemText[256];
589 	MENUITEMINFO menuItem = {sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText, 0, 0 };
590 
591 	_sntprintf(szItemText, 256, FBALoadStringEx(hAppInst, IDS_MENU_4, true), nSavestateSlot);
592 	menuItem.cch = _tcslen(szItemText);
593 	SetMenuItemInfo(hMenu, MENU_STATE_LOAD_SLOT, 0, &menuItem);
594 
595 	_sntprintf(szItemText, 256, FBALoadStringEx(hAppInst, IDS_MENU_5, true), nSavestateSlot);
596 	menuItem.cch = _tcslen(szItemText);
597 	SetMenuItemInfo(hMenu, MENU_STATE_SAVE_SLOT, 0, &menuItem);
598 }
599 #if 0
600 // Update CD menu items
601 static void CreateCDItems()
602 {
603 	TCHAR szItemText[256];
604 	MENUITEMINFO menuItem = { sizeof(MENUITEMINFO), MIIM_TYPE, MFT_STRING, 0, 0, NULL, NULL, NULL, 0, szItemText, 0, NULL };
605 
606 	_sntprintf(szItemText, 256, FBALoadStringEx(hAppInst, IDS_CD_SELECT_IMAGE, true));
607 	if (nCDEmuSelect == 0) {
608 		TCHAR szImage[32];
609 		int length = _tcslen(szItemText);
610 
611 		_sntprintf(szImage, 13, _T("\t%s"), CDEmuImage);
612 		if (_tcslen(szImage) > 13) {
613 			_sntprintf(szImage + 13, 8, _T("..."));
614 		}
615 
616 		_sntprintf(szItemText + length - 1, 256 - length, szImage);
617 	}
618 	menuItem.cch = _tcslen(szItemText);
619 	SetMenuItemInfo(hMenu, MENU_CDIMAGE, 0, &menuItem);
620 }
621 #endif
622 // Update bullets, checkmarks, and item text
MenuUpdate()623 void MenuUpdate()
624 {
625 	int var;
626 
627 //	if (!bMenuEnabled) {
628 //		return;
629 //	}
630 
631 	CreateStateslotItems();
632 
633 	CheckMenuItem(hMenu, MENU_PAUSE, bAltPause ? MF_CHECKED : MF_UNCHECKED);
634 	CheckMenuItem(hMenu, MENU_ALLRAM, bDrvSaveAll ? MF_CHECKED : MF_UNCHECKED);
635 
636 //	CreateCDItems();
637 //	CheckMenuRadioItem(hMenu, MENU_CDIMAGE, MENU_CDIMAGE, MENU_CDIMAGE + nCDEmuSelect, MF_BYCOMMAND);
638 
639 	CheckMenuItem(hMenu, MENU_SETCPUCLOCK, nBurnCPUSpeedAdjust != 0x0100 ? MF_CHECKED : MF_UNCHECKED);
640 	CreateCPUSpeedItem(nBurnCPUSpeedAdjust != 0x0100);
641 
642 	if (bVidFullStretch) {
643 		var = MENU_STRETCH;
644 	} else {
645 		if (bVidCorrectAspect) {
646 			var = MENU_ASPECT;
647 		} else {
648 			var = MENU_NOSTRETCH;
649 		}
650 	}
651 	CheckMenuRadioItem(hMenu, MENU_NOSTRETCH, MENU_ASPECT, var, MF_BYCOMMAND);
652 	CheckMenuItem(hMenu, MENU_STRETCH, bVidFullStretch ? MF_CHECKED : MF_UNCHECKED);
653 
654 	CheckMenuItem(hMenu, MENU_TRIPLE, bVidTripleBuffer ? MF_CHECKED : MF_UNCHECKED);
655 
656 	CheckMenuItem(hMenu, MENU_DWMFIX, bVidDWMSync ? MF_CHECKED : MF_UNCHECKED);
657 
658 	var = nVidSelect + MENU_BLITTER_1;
659 	CheckMenuRadioItem(hMenu, MENU_BLITTER_1, MENU_BLITTER_8, var, MF_BYCOMMAND);
660 
661 	switch (nVidSelect) {
662 		case 0:
663 			if (bVidScanlines) {
664 				if (bVidScanHalf) {
665 					var = MENU_SCAN50;
666 				} else {
667 					var = MENU_BASIC_SCAN;
668 				}
669 			} else {
670 				var = MENU_BASIC_NORMAL;
671 			}
672 			CheckMenuRadioItem(hMenu, MENU_BASIC_NORMAL, MENU_SCAN50, var, MF_BYCOMMAND);
673 			CheckMenuItem(hMenu, MENU_BASIC_ROTSCAN, bVidScanRotate ? MF_CHECKED : MF_UNCHECKED);
674 			CheckMenuItem(hMenu, MENU_FORCE_FLIP, bVidForceFlip ? MF_CHECKED : MF_UNCHECKED);
675 			CheckMenuItem(hMenu, MENU_RES_ARCADE, bVidArcaderes ? MF_CHECKED : MF_UNCHECKED);
676 			break;
677 		case 1:
678 			CheckMenuItem(hMenu, MENU_BILINEAR, bVidBilinear ? MF_CHECKED : MF_UNCHECKED);
679 			CheckMenuItem(hMenu, MENU_ENHANCED_SCAN, bVidScanlines ? MF_CHECKED : MF_UNCHECKED);
680 			CheckMenuItem(hMenu, MENU_PHOSPHOR, bVidScanDelay ? MF_CHECKED : MF_UNCHECKED);
681 
682 			CheckMenuItem(hMenu, MENU_PRESCALE, nVidBlitterOpt[nVidSelect] & 0x01000000 ? MF_CHECKED : MF_UNCHECKED);
683 			CheckMenuItem(hMenu, MENU_SOFTFX, nVidBlitterOpt[nVidSelect] & 0x02000000 ? MF_CHECKED : MF_UNCHECKED);
684 
685 			var = ((unsigned long long)nVidBlitterOpt[nVidSelect] >> 32) + MENU_ENHANCED_SOFT_STRETCH;
686 			CheckMenuRadioItem(hMenu, MENU_ENHANCED_SOFT_STRETCH, MENU_ENHANCED_SOFT_STRETCH + 34, var, MF_BYCOMMAND);
687 			CheckMenuItem(hMenu, MENU_ENHANCED_SOFT_AUTOSIZE, (nVidBlitterOpt[nVidSelect] & 0x04000000) ? MF_CHECKED : MF_UNCHECKED);
688 			if (nVidBlitterOpt[nVidSelect] & 0x00100000) {
689 				var = MENU_3DPROJECTION;
690 			} else {
691 				if (nVidBlitterOpt[nVidSelect] & 0x00010000) {
692 					var = MENU_RGBEFFECTS;
693 				} else {
694    					var = MENU_ENHANCED_NORMAL;
695 				}
696 			}
697 			CheckMenuRadioItem(hMenu, MENU_ENHANCED_NORMAL, MENU_ENHANCED_NORMAL, var, MF_BYCOMMAND);
698 			CheckMenuRadioItem(hMenu, MENU_RGBEFFECTS, MENU_3DPROJECTION, var, MF_BYCOMMAND);
699 
700 			CheckMenuItem(hMenu, MENU_EFFECT_AUTO, (nVidBlitterOpt[nVidSelect] & 0x00020000) ? MF_CHECKED : MF_UNCHECKED);
701 			var = MENU_EFFECT_01 + (nVidBlitterOpt[nVidSelect] & 0x000000FF) - 8;
702 			CheckMenuRadioItem(hMenu, MENU_EFFECT_01, MENU_EFFECT_08, var, MF_BYCOMMAND);
703 			CheckMenuItem(hMenu, MENU_3DUSELIGHTING, nVidBlitterOpt[nVidSelect] & 0x00200000 ? MF_CHECKED : MF_UNCHECKED);
704 			CheckMenuItem(hMenu, MENU_ENHANCED_ROTSCAN, bVidScanRotate ? MF_CHECKED : MF_UNCHECKED);
705 			CheckMenuItem(hMenu, MENU_FORCE_16BIT, bVidForce16bit ? MF_CHECKED : MF_UNCHECKED);
706 			CheckMenuItem(hMenu, MENU_TEXTUREMANAGE, (nVidTransferMethod & 1) ? MF_CHECKED : MF_UNCHECKED);
707 			CheckMenuItem(hMenu, MENU_RES_ARCADE, bVidArcaderes ? MF_CHECKED : MF_UNCHECKED);
708 			break;
709 		case 2:
710 			var = (nVidBlitterOpt[nVidSelect] & 0xFF) + MENU_SOFTFX_SOFT_STRETCH;
711 			CheckMenuRadioItem(hMenu, MENU_SOFTFX_SOFT_STRETCH, MENU_SOFTFX_SOFT_STRETCH + 34, var, MF_BYCOMMAND);
712 			CheckMenuItem(hMenu, MENU_SOFTFX_SOFT_AUTOSIZE, (nVidBlitterOpt[nVidSelect] & 0x0100) ? MF_CHECKED : MF_UNCHECKED);
713 			CheckMenuItem(hMenu, MENU_SOFT_DIRECTACCESS, !(nVidBlitterOpt[nVidSelect] & 0x0200) ? MF_CHECKED : MF_UNCHECKED);
714 			break;
715 		case 3:
716 			var = ((nVidBlitterOpt[nVidSelect] >> 24) & 0x03) + MENU_DX9_POINT;
717 			CheckMenuRadioItem(hMenu, MENU_DX9_POINT, MENU_DX9_POINT + 2, var, MF_BYCOMMAND);
718 			CheckMenuItem(hMenu, MENU_EXP_SCAN, bVidScanlines ? MF_CHECKED : MF_UNCHECKED);
719 
720 			var = MENU_DX9_CUBIC_CUSTOM;
721 			if (dVidCubicB > -0.001 && dVidCubicB <  0.001 && dVidCubicC > -0.001 && dVidCubicC <  0.001) {
722 				var = MENU_DX9_CUBIC_LIGHT;
723 			}
724 			if (dVidCubicB >  1.499 && dVidCubicB <  1.501 && dVidCubicC > -0.251 && dVidCubicC < -0.249) {
725 				var = MENU_DX9_CUBIC_NOTCH;
726 			}
727 			if (dVidCubicB >  0.999 && dVidCubicB <  1.001 && dVidCubicC > -0.001 && dVidCubicC <  0.001) {
728 				var = MENU_DX9_CUBIC_BSPLINE;
729 			}
730 			if (dVidCubicB >  0.333 && dVidCubicB <  0.334 && dVidCubicC >  0.333 && dVidCubicC <  0.334) {
731 				var = MENU_DX9_CUBIC_OPTIMAL;
732 			}
733 			if (dVidCubicB > -0.001 && dVidCubicB <  0.001 && dVidCubicC >  0.499 && dVidCubicC <  0.501) {
734 				var = MENU_DX9_CUBIC_CATMULL;
735 			}
736 			if (dVidCubicB > -0.001 && dVidCubicB <  0.001 && dVidCubicC >  0.999 && dVidCubicC <  1.001) {
737 				var = MENU_DX9_CUBIC_SHARP;
738 			}
739 			CheckMenuRadioItem(hMenu, MENU_DX9_CUBIC_LIGHT, MENU_DX9_CUBIC_BSPLINE + 8, var, MF_BYCOMMAND);
740 
741 			CheckMenuItem(hMenu, MENU_DX9_FORCE_PS14, !(nVidBlitterOpt[nVidSelect] & (1 <<  9)) ? MF_CHECKED : MF_UNCHECKED);
742 			CheckMenuItem(hMenu, MENU_DX9_FPTERXTURES, (nVidBlitterOpt[nVidSelect] & (1 <<  8)) ? MF_CHECKED : MF_UNCHECKED);
743 			if (!(nVidBlitterOpt[nVidSelect] & (1 <<  9))) {
744 				var = MENU_DX9_CUBIC4;
745 			} else {
746 				var = ((nVidBlitterOpt[nVidSelect] >> 28) & 0x07) + MENU_DX9_CUBIC0;
747 			}
748 			CheckMenuRadioItem(hMenu, MENU_DX9_CUBIC0, MENU_DX9_CUBIC0 + 8, var, MF_BYCOMMAND);
749 			break;
750 		case 4:
751 			var = (nVidBlitterOpt[nVidSelect] & 0xFF) + MENU_DX9_ALT_SOFT_STRETCH;
752 			CheckMenuRadioItem(hMenu, MENU_DX9_ALT_SOFT_STRETCH, MENU_DX9_ALT_SOFT_STRETCH + 34, var, MF_BYCOMMAND);
753 			CheckMenuItem(hMenu, MENU_DX9_ALT_SOFT_AUTOSIZE, (nVidBlitterOpt[nVidSelect] & 0x0100) ? MF_CHECKED : MF_UNCHECKED);
754 			CheckMenuRadioItem(hMenu, MENU_DX9_ALT_POINT, MENU_DX9_ALT_POINT + 1, MENU_DX9_ALT_POINT + bVidDX9Bilinear, MF_BYCOMMAND);
755 			CheckMenuItem(hMenu, MENU_DX9_ALT_HARDWAREVERTEX, (bVidHardwareVertex) ? MF_CHECKED : MF_UNCHECKED);
756 			CheckMenuItem(hMenu, MENU_DX9_ALT_MOTIONBLUR, (bVidMotionBlur) ? MF_CHECKED : MF_UNCHECKED);
757 			CheckMenuItem(hMenu, MENU_DX9_ALT_FORCE_16BIT, bVidForce16bitDx9Alt ? MF_CHECKED : MF_UNCHECKED);
758 			break;
759 	}
760 
761 	var = 0;
762 	if (nScreenSizeHor) {
763 		var = MENU_SINGLESIZESCREEN + nScreenSizeHor - 1;
764 		CreateOtherresItem(0);
765 	} else {
766 		for (int n = 0; n < 4; n++) {
767 			if (nVidHorWidth == VidPreset[n].nWidth && nVidHorHeight == VidPreset[n].nHeight) {
768 				var = MENU_RES_1 + n;
769 				break;
770 			}
771 		}
772 		if (var) {
773 			CreateOtherresItem(0);
774 		} else {
775 			var = MENU_RES_OTHER;
776 			CreateOtherresItem(1);
777 		}
778 		if (bVidArcaderesHor) {
779 			var = MENU_RES_ARCADE;
780 		}
781 	}
782 	CheckMenuRadioItem(hMenu, MENU_RES_1, MENU_QUADSIZESCREEN, var, MF_BYCOMMAND);
783 
784 	var = 0;
785 	if (nScreenSizeVer) {
786 		var = MENU_SINGLESIZESCREEN_VERTICAL + nScreenSizeVer - 1;
787 		CreateOtherresItemVer(0);
788 	} else {
789 		for (int n = 0; n < 4; n++) {
790 			if (nVidVerWidth == VidPresetVer[n].nWidth && nVidVerHeight == VidPresetVer[n].nHeight) {
791 				var = MENU_RES_1_VERTICAL + n;
792 				break;
793 			}
794 		}
795 		if (var) {
796 			CreateOtherresItemVer(0);
797 		} else {
798 			var = MENU_RES_OTHER_VERTICAL;
799 			CreateOtherresItemVer(1);
800 		}
801 		if (bVidArcaderesVer) {
802 			var = MENU_RES_ARCADE_VERTICAL;
803 		}
804 	}
805 	CheckMenuRadioItem(hMenu, MENU_RES_1_VERTICAL, MENU_QUADSIZESCREEN_VERTICAL, var, MF_BYCOMMAND);
806 
807 	if (nVidDepth == 16) {
808 		var = MENU_16;
809 	} else {
810 		if (nVidDepth == 24) {
811 			var = MENU_24;
812 		} else {
813 			var = MENU_32;
814 		}
815 	}
816 	CheckMenuRadioItem(hMenu, MENU_16, MENU_32, var, MF_BYCOMMAND);
817 
818 	if (nGamma > 1.249 && nGamma < 1.251) {
819 		var = MENU_GAMMA_DARKER;
820 	} else {
821 		if (nGamma > 0.799 && nGamma < 0.801) {
822 			var = MENU_GAMMA_LIGHTER;
823 		} else {
824 			var = MENU_GAMMA_OTHER;
825 		}
826 	}
827 	if (var == MENU_GAMMA_OTHER) {
828 		CreateOtherGammaItem(1);
829 	} else {
830 		CreateOtherGammaItem(0);
831 	}
832 	if (!bDoGamma) {
833 		var = MENU_GAMMA_DO;
834 	}
835 	CheckMenuRadioItem(hMenu, MENU_GAMMA_DARKER, MENU_GAMMA_OTHER, var, MF_BYCOMMAND);
836 	CheckMenuItem(hMenu, MENU_GAMMA_DO, bDoGamma ? MF_CHECKED : MF_UNCHECKED);
837 
838 	var = MENU_GAMMA_SOFTWARE_ONLY;
839 	if (bVidUseHardwareGamma) {
840 		if (bHardwareGammaOnly) {
841 			var = MENU_GAMMA_HARDWARE_ONLY;
842 		} else {
843 			var = MENU_GAMMA_USE_HARDWARE;
844 		}
845 	}
846 	CheckMenuRadioItem(hMenu, MENU_GAMMA_USE_HARDWARE, MENU_GAMMA_SOFTWARE_ONLY, var, MF_BYCOMMAND);
847 
848 	CheckMenuItem(hMenu, MENU_AUTOSWITCHFULL, bVidAutoSwitchFull ? MF_CHECKED : MF_UNCHECKED);
849 
850 	if (nVidTransferMethod == 0) {
851 		var = MENU_BASIC_VIDEOMEM;
852 	} else {
853 		if (nVidTransferMethod == -1) {
854 			var = MENU_BASIC_MEMAUTO;
855 		} else {
856 			var = MENU_BASIC_SYSMEM;
857 		}
858 	}
859 	CheckMenuRadioItem(hMenu, MENU_BASIC_MEMAUTO, MENU_BASIC_SYSMEM, var, MF_BYCOMMAND);
860 
861 	if (nVidTransferMethod == 0) {
862 		var = MENU_SOFTFX_VIDEOMEM;
863 	} else {
864 		if (nVidTransferMethod == -1) {
865 			var = MENU_SOFTFX_MEMAUTO;
866 		} else {
867 			var = MENU_SOFTFX_SYSMEM;
868 		}
869 	}
870 	CheckMenuRadioItem(hMenu, MENU_SOFTFX_MEMAUTO, MENU_SOFTFX_SYSMEM, var, MF_BYCOMMAND);
871 
872 	if (nWindowSize <= 4) {
873 		var = MENU_AUTOSIZE + nWindowSize;
874 	} else {
875 		var = MENU_MAXIMUMSIZEWINDOW;
876 	}
877 	CheckMenuRadioItem(hMenu, MENU_AUTOSIZE, MENU_MAXIMUMSIZEWINDOW, var, MF_BYCOMMAND);
878 
879 	CheckMenuItem(hMenu, MENU_MONITORAUTOCHECK, bMonitorAutoCheck ? MF_CHECKED : MF_UNCHECKED);
880 
881 	var = -1;
882 	if (nVidScrnAspectX == 4 && nVidScrnAspectY == 3) {
883 		var = MENU_ASPECTNORMAL;
884 	} else {
885 		if (nVidScrnAspectX == 5 && nVidScrnAspectY == 4) {
886 			var = MENU_ASPECTLCD;
887 		} else {
888 			if (nVidScrnAspectX == 16 && nVidScrnAspectY == 9) {
889 				var = MENU_ASPECTWIDE;
890 			} else {
891 				if (nVidScrnAspectX == 16 && nVidScrnAspectY == 10) {
892 					var = MENU_ASPECTWIDELCD;
893 				}
894 			}
895 		}
896 	}
897 	CheckMenuRadioItem(hMenu, MENU_ASPECTNORMAL, MENU_ASPECTWIDELCD, var, MF_BYCOMMAND);
898 	CheckMenuItem(hMenu, MENU_MONITORMIRRORVERT, (nVidRotationAdjust & 2) ? MF_CHECKED : MF_UNCHECKED);
899 
900 	CheckMenuItem(hMenu, MENU_ROTATEVERTICAL, !(nVidRotationAdjust & 1) ? MF_CHECKED : MF_UNCHECKED);
901 	CheckMenuItem(hMenu, MENU_FORCE60HZ, bForce60Hz ? MF_CHECKED : MF_UNCHECKED);
902 	CheckMenuItem(hMenu, MENU_VIDEOVSYNC, bVidVSync ? MF_CHECKED : MF_UNCHECKED);
903 	CheckMenuItem(hMenu, MENU_AUTOFRAMESKIP, !bAlwaysDrawFrames ? MF_CHECKED : MF_UNCHECKED);
904 
905 	var = nAudSelect + MENU_AUD_PLUGIN_1;
906 	CheckMenuRadioItem(hMenu, MENU_AUD_PLUGIN_1, MENU_AUD_PLUGIN_8, var, MF_BYCOMMAND);
907 
908 	switch (nAudSelect) {
909 		case 0: {
910 			var = MENU_DSOUND_NOSOUND;
911 			if (nAudSampleRate[0] > 0) {
912 				if (nAudSampleRate[0] <= 11025) {
913 					var = MENU_DSOUND_11025;
914 				} else {
915 					if (nAudSampleRate[0] <= 22050) {
916 						var = MENU_DSOUND_22050;
917 					} else {
918 						if (nAudSampleRate[0] <= 44100) {
919 							var = MENU_DSOUND_44100;
920 						} else {
921 							var = MENU_DSOUND_48000;
922 						}
923 					}
924 				}
925 			}
926 			CheckMenuRadioItem(hMenu, MENU_DSOUND_NOSOUND, MENU_DSOUND_48000, var, MF_BYCOMMAND);
927 			CheckMenuItem(hMenu, MENU_DSOUND_BASS, nAudDSPModule[0] ? MF_CHECKED : MF_UNCHECKED);
928 			break;
929 		}
930 
931 		case 1: {
932 			var = MENU_XAUDIO_NOSOUND;
933 			if (nAudSampleRate[1] > 0) {
934 				if (nAudSampleRate[1] <= 11025) {
935 					var = MENU_XAUDIO_11025;
936 				} else {
937 					if (nAudSampleRate[1] <= 22050) {
938 						var = MENU_XAUDIO_22050;
939 					} else {
940 						if (nAudSampleRate[1] <= 44100) {
941 							var = MENU_XAUDIO_44100;
942 						} else {
943 							var = MENU_XAUDIO_48000;
944 						}
945 					}
946 				}
947 			}
948 			CheckMenuRadioItem(hMenu, MENU_XAUDIO_NOSOUND, MENU_XAUDIO_48000, var, MF_BYCOMMAND);
949 			CheckMenuItem(hMenu, MENU_XAUDIO_BASS, (nAudDSPModule[1] & 1) ? MF_CHECKED : MF_UNCHECKED);
950 			CheckMenuItem(hMenu, MENU_XAUDIO_REVERB, (nAudDSPModule[1] & 2) ? MF_CHECKED : MF_UNCHECKED);
951 			break;
952 		}
953 	}
954 
955 	var = MENU_INTERPOLATE_0 + nInterpolation;
956 	if (bDrvOkay) {
957 		if ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNK_NEOGEO) {
958 			var = MENU_INTERPOLATE_0 + 1;
959 		}
960 	}
961 	CheckMenuRadioItem(hMenu, MENU_INTERPOLATE_0, MENU_INTERPOLATE_5, var, MF_BYCOMMAND);
962 
963 	var = MENU_INTERPOLATE_FM_0 + nFMInterpolation;
964 	CheckMenuRadioItem(hMenu, MENU_INTERPOLATE_FM_0, MENU_INTERPOLATE_FM_5, var, MF_BYCOMMAND);
965 
966 	CheckMenuItem(hMenu, MENU_AUTOPAUSE, bAutoPause ? MF_CHECKED : MF_UNCHECKED);
967 	CheckMenuItem(hMenu, MENU_PROCESSINPUT, !bAlwaysProcessKeyboardInput ? MF_CHECKED : MF_UNCHECKED);
968 	if (bAutoPause) {
969 		EnableMenuItem(hMenu, MENU_PROCESSINPUT, MF_GRAYED | MF_BYCOMMAND);
970 	} else {
971 		EnableMenuItem(hMenu, MENU_PROCESSINPUT, MF_ENABLED | MF_BYCOMMAND);
972 	}
973 	CheckMenuItem(hMenu, MENU_DISPLAYINDICATOR, nVidSDisplayStatus ? MF_CHECKED : MF_UNCHECKED);
974 	CheckMenuItem(hMenu, MENU_MODELESS, bModelessMenu ? MF_CHECKED : MF_UNCHECKED);
975 	CheckMenuItem(hMenu, MENU_NOCHANGENUMLOCK, bNoChangeNumLock ? MF_CHECKED : MF_UNCHECKED);
976 	CheckMenuItem(hMenu, MENU_HIGHRESTIMER, bEnableHighResTimer ? MF_CHECKED : MF_UNCHECKED);
977 	CheckMenuItem(hMenu, MENU_CREATEDIRS, bAlwaysCreateSupportFolders ? MF_CHECKED : MF_UNCHECKED);
978 	CheckMenuItem(hMenu, MENU_AUTOLOADGAMELIST, bAutoLoadGameList ? MF_CHECKED : MF_UNCHECKED);
979 	CheckMenuItem(hMenu, MENU_SAVEHISCORES, EnableHiscores ? MF_CHECKED : MF_UNCHECKED);
980 	CheckMenuItem(hMenu, MENU_USEBLEND, bBurnUseBlend ? MF_CHECKED : MF_UNCHECKED);
981 	CheckMenuItem(hMenu, MENU_GEARSHIFT, BurnShiftEnabled ? MF_CHECKED : MF_UNCHECKED);
982 
983 #ifdef INCLUDE_AVI_RECORDING
984 	if (nAvi3x <= 1) {
985 		nAvi3x = 1;
986 		var = MENU_AVI1X;
987 	}
988 	if (nAvi3x == 2) {
989 		var = MENU_AVI2X;
990 	}
991 	if (nAvi3x >= 3) {
992 		nAvi3x = 3;
993 		var = MENU_AVI3X;
994 	}
995 
996 	CheckMenuRadioItem(hMenu, MENU_AVI1X, MENU_AVI3X, var, MF_BYCOMMAND);
997 #endif
998 
999 	if (nAppThreadPriority == THREAD_PRIORITY_TIME_CRITICAL) {
1000 		var = MENU_PRIORITY_REALTIME;
1001 	} else {
1002 		if (nAppThreadPriority == THREAD_PRIORITY_HIGHEST) {
1003 			var = MENU_PRIORITY_HIGH;
1004 		} else {
1005 			if (nAppThreadPriority == THREAD_PRIORITY_ABOVE_NORMAL) {
1006 				var = MENU_PRIORITY_ABOVE_NORMAL;
1007 			} else {
1008 				if (nAppThreadPriority == THREAD_PRIORITY_BELOW_NORMAL) {
1009 					var = MENU_PRIORITY_BELOW_NORMAL;
1010 				} else {
1011 					if (nAppThreadPriority == THREAD_PRIORITY_LOWEST) {
1012 						var = MENU_PRIORITY_LOW;
1013 					} else {
1014 						var = MENU_PRIORITY_NORMAL;
1015 					}
1016 				}
1017 			}
1018 		}
1019 	}
1020 	CheckMenuRadioItem(hMenu, MENU_PRIORITY_REALTIME, MENU_PRIORITY_LOW, var, MF_BYCOMMAND);
1021 	CheckMenuItem(hMenu, MENU_SAVEGAMEINPUT, bSaveInputs ? MF_CHECKED : MF_UNCHECKED);
1022 
1023 	// Auto-Fire
1024 	if (nAutoFireRate == 4)  var = MENU_INPUT_AUTOFIRE_RATE_4;
1025 	if (nAutoFireRate == 8)  var = MENU_INPUT_AUTOFIRE_RATE_3;
1026 	if (nAutoFireRate == 12) var = MENU_INPUT_AUTOFIRE_RATE_2;
1027 	if (nAutoFireRate == 22) var = MENU_INPUT_AUTOFIRE_RATE_1;
1028 	CheckMenuRadioItem(hMenu, MENU_INPUT_AUTOFIRE_RATE_1, MENU_INPUT_AUTOFIRE_RATE_4, var, MF_BYCOMMAND);
1029 
1030 #ifdef BUILD_A68K
1031 	CheckMenuItem(hMenu, MENU_ASSEMBLYCORE, bBurnUseASMCPUEmulation ? MF_CHECKED : MF_UNCHECKED);
1032 #endif
1033 
1034 	var = MENU_ICONS_SIZE_16;
1035 	switch (nIconsSize) {
1036 		case ICON_16x16: var = MENU_ICONS_SIZE_16;	break;
1037 		case ICON_24x24: var = MENU_ICONS_SIZE_24;	break;
1038 		case ICON_32x32: var = MENU_ICONS_SIZE_32;	break;
1039 	}
1040 	CheckMenuRadioItem(hMenu, MENU_ICONS_SIZE_16, MENU_ICONS_SIZE_32, var, MF_BYCOMMAND);
1041 	CheckMenuItem(hMenu, MENU_ENABLEICONS, bEnableIcons ? MF_CHECKED : MF_UNCHECKED);
1042 	CheckMenuItem(hMenu, MENU_ICONS_PARENTSONLY, bIconsOnlyParents ? MF_CHECKED : MF_UNCHECKED);
1043 
1044 	// Previous games list
1045 	for (int i = 0; i < SHOW_PREV_GAMES; i++) {
1046 		MENUITEMINFO menuItemInfo;
1047 		TCHAR szText[256] = _T("");
1048 		int OldDrvSelect = nBurnDrvActive;
1049 
1050 		memset(&menuItemInfo, 0, sizeof(MENUITEMINFO));
1051 		menuItemInfo.cbSize = sizeof(MENUITEMINFO);
1052 		menuItemInfo.fType = MFT_STRING;
1053 		menuItemInfo.fMask = MIIM_TYPE;
1054 
1055 		if (_tcslen(szPrevGames[i])) {
1056 			for (unsigned int j = 0; j < nBurnDrvCount; j++) {
1057 				nBurnDrvActive = j;
1058 				if (!_tcsicmp(szPrevGames[i], BurnDrvGetText(DRV_NAME))) {
1059 					_stprintf(szText, _T("%s\t%s"), BurnDrvGetText(DRV_FULLNAME), BurnDrvGetText(DRV_NAME));
1060 
1061 					break;
1062 				}
1063 			}
1064 
1065 			// Check for &s and change to &&
1066 			TCHAR szText2[256] = _T("");
1067 			TCHAR *Tokens = NULL;
1068 			int NumTokens = 0;
1069 
1070 			Tokens = _tcstok(szText, _T("&"));
1071 			while (Tokens != NULL) {
1072 				if (NumTokens) {
1073 					_stprintf(szText2, _T("%s&&%s"), szText2, Tokens);
1074 				} else {
1075 					_stprintf(szText2, _T("%s"), Tokens);
1076 				}
1077 
1078 				Tokens = _tcstok(NULL, _T("&"));
1079 				NumTokens++;
1080 			}
1081 
1082 			menuItemInfo.dwTypeData = szText2;
1083 			menuItemInfo.cch = _tcslen(szText2);
1084 
1085 			SetMenuItemInfo(hMenu, MENU_PREVIOUSGAMES1 + i, FALSE, &menuItemInfo);
1086 			EnableMenuItem(hMenu, MENU_PREVIOUSGAMES1 + i, MF_ENABLED | MF_BYCOMMAND);
1087 		} else {
1088 			_tcscpy(szText, FBALoadStringEx(hAppInst, IDS_MENU_6, true));
1089 
1090 			menuItemInfo.dwTypeData = szText;
1091 			menuItemInfo.cch = _tcslen(szText);
1092 
1093 			SetMenuItemInfo(hMenu, MENU_PREVIOUSGAMES1 + i, FALSE, &menuItemInfo);
1094 			EnableMenuItem(hMenu, MENU_PREVIOUSGAMES1 + i, MF_GRAYED | MF_BYCOMMAND);
1095 		}
1096 
1097 		nBurnDrvActive = OldDrvSelect;
1098 	}
1099 
1100 #if !defined BUILD_X86_ASM
1101 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_2XPM_LQ, MF_GRAYED  | MF_BYCOMMAND);
1102 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_2XPM_HQ, MF_GRAYED  | MF_BYCOMMAND);
1103 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_EAGLE, MF_GRAYED  | MF_BYCOMMAND);
1104 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_SUPEREAGLE, MF_GRAYED  | MF_BYCOMMAND);
1105 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_2XSAI, MF_GRAYED  | MF_BYCOMMAND);
1106 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_SUPER2XSAI, MF_GRAYED  | MF_BYCOMMAND);
1107 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_SUPEREAGLE_VBA, MF_GRAYED  | MF_BYCOMMAND);
1108 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_2XSAI_VBA, MF_GRAYED  | MF_BYCOMMAND);
1109 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_SUPER2XSAI_VBA, MF_GRAYED  | MF_BYCOMMAND);
1110 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_SUPERSCALE, MF_GRAYED  | MF_BYCOMMAND);
1111 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_SUPERSCALE75, MF_GRAYED  | MF_BYCOMMAND);
1112 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_HQ2X, MF_GRAYED  | MF_BYCOMMAND);
1113 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_HQ3X, MF_GRAYED  | MF_BYCOMMAND);
1114 	EnableMenuItem(hMenu, MENU_ENHANCED_SOFT_HQ4X, MF_GRAYED  | MF_BYCOMMAND);
1115 
1116 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_2XPM_LQ, MF_GRAYED  | MF_BYCOMMAND);
1117 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_2XPM_HQ, MF_GRAYED  | MF_BYCOMMAND);
1118 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_EAGLE, MF_GRAYED  | MF_BYCOMMAND);
1119 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_SUPEREAGLE, MF_GRAYED  | MF_BYCOMMAND);
1120 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_2XSAI, MF_GRAYED  | MF_BYCOMMAND);
1121 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_SUPER2XSAI, MF_GRAYED  | MF_BYCOMMAND);
1122 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_SUPEREAGLE_VBA, MF_GRAYED  | MF_BYCOMMAND);
1123 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_2XSAI_VBA, MF_GRAYED  | MF_BYCOMMAND);
1124 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_SUPER2XSAI_VBA, MF_GRAYED  | MF_BYCOMMAND);
1125 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_SUPERSCALE, MF_GRAYED  | MF_BYCOMMAND);
1126 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_SUPERSCALE75, MF_GRAYED  | MF_BYCOMMAND);
1127 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_HQ2X, MF_GRAYED  | MF_BYCOMMAND);
1128 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_HQ3X, MF_GRAYED  | MF_BYCOMMAND);
1129 	EnableMenuItem(hMenu, MENU_SOFTFX_SOFT_HQ4X, MF_GRAYED  | MF_BYCOMMAND);
1130 
1131 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_2XPM_LQ, MF_GRAYED  | MF_BYCOMMAND);
1132 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_2XPM_HQ, MF_GRAYED  | MF_BYCOMMAND);
1133 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_EAGLE, MF_GRAYED  | MF_BYCOMMAND);
1134 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_SUPEREAGLE, MF_GRAYED  | MF_BYCOMMAND);
1135 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_2XSAI, MF_GRAYED  | MF_BYCOMMAND);
1136 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_SUPER2XSAI, MF_GRAYED  | MF_BYCOMMAND);
1137 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_SUPEREAGLE_VBA, MF_GRAYED  | MF_BYCOMMAND);
1138 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_2XSAI_VBA, MF_GRAYED  | MF_BYCOMMAND);
1139 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_SUPER2XSAI_VBA, MF_GRAYED  | MF_BYCOMMAND);
1140 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_SUPERSCALE, MF_GRAYED  | MF_BYCOMMAND);
1141 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_SUPERSCALE75, MF_GRAYED  | MF_BYCOMMAND);
1142 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_HQ2X, MF_GRAYED  | MF_BYCOMMAND);
1143 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_HQ3X, MF_GRAYED  | MF_BYCOMMAND);
1144 	EnableMenuItem(hMenu, MENU_DX9_ALT_SOFT_HQ4X, MF_GRAYED  | MF_BYCOMMAND);
1145 #endif
1146 
1147 #if defined BUILD_X64_EXE
1148 	EnableMenuItem(hMenu, MENU_BLITTER_2, MF_GRAYED  | MF_BYCOMMAND);
1149 #endif
1150 }
1151 
MenuEnableItems()1152 void MenuEnableItems()
1153 {
1154 	CreateArcaderesItem();
1155 	CreatepresetResItems();
1156 
1157 	if (hBlitterMenu[nVidSelect]) {
1158 		MENUITEMINFO myMenuItemInfo;
1159 		myMenuItemInfo.cbSize = sizeof(MENUITEMINFO);
1160 		myMenuItemInfo.fMask = MIIM_SUBMENU | MIIM_STATE;
1161         	myMenuItemInfo.fState = MFS_ENABLED;
1162         	myMenuItemInfo.hSubMenu = GetSubMenu(hBlitterMenu[nVidSelect], 0);
1163 		SetMenuItemInfo(GetSubMenu(hMenu, 1), 1, TRUE, &myMenuItemInfo);
1164 	} else {
1165 		MENUITEMINFO myMenuItemInfo;
1166 		myMenuItemInfo.cbSize = sizeof(MENUITEMINFO);
1167 		myMenuItemInfo.fMask = MIIM_SUBMENU | MIIM_STATE;
1168         	myMenuItemInfo.fState = MFS_GRAYED;
1169         	myMenuItemInfo.hSubMenu = NULL;
1170 		SetMenuItemInfo(GetSubMenu(hMenu, 1), 1, TRUE, &myMenuItemInfo);
1171 	}
1172 
1173 	if (hBlitterMenu[nAudSelect]) {
1174 		MENUITEMINFO myMenuItemInfo;
1175 		myMenuItemInfo.cbSize = sizeof(MENUITEMINFO);
1176 		myMenuItemInfo.fMask = MIIM_SUBMENU | MIIM_STATE;
1177         	myMenuItemInfo.fState = MFS_ENABLED;
1178         	myMenuItemInfo.hSubMenu = GetSubMenu(hAudioPluginMenu[nAudSelect], 0);
1179 		SetMenuItemInfo(GetSubMenu(hMenu, 2), 1, TRUE, &myMenuItemInfo);
1180 	} else {
1181 		MENUITEMINFO myMenuItemInfo;
1182 		myMenuItemInfo.cbSize = sizeof(MENUITEMINFO);
1183 		myMenuItemInfo.fMask = MIIM_SUBMENU | MIIM_STATE;
1184         	myMenuItemInfo.fState = MFS_GRAYED;
1185         	myMenuItemInfo.hSubMenu = NULL;
1186 		SetMenuItemInfo(GetSubMenu(hMenu, 2), 1, TRUE, &myMenuItemInfo);
1187 	}
1188 
1189 	// Auto-size image when software blitter effects anre enabled
1190 	if ((nVidSelect == 1 && (nVidBlitterOpt[1] & 0x07000000) == 0x07000000) || (nVidSelect == 2 && nVidBlitterOpt[2] & 0x0100)) {
1191 		EnableMenuItem(GetSubMenu(hMenu, 1),  2,	MF_GRAYED | MF_BYPOSITION);
1192 		EnableMenuItem(GetSubMenu(hMenu, 1),  7,	MF_GRAYED | MF_BYPOSITION);
1193 		EnableMenuItem(GetSubMenu(hMenu, 1), 10,	MF_GRAYED | MF_BYPOSITION);
1194 	} else {
1195 		EnableMenuItem(GetSubMenu(hMenu, 1),  2,	MF_ENABLED | MF_BYPOSITION);
1196 		EnableMenuItem(GetSubMenu(hMenu, 1),  7,	MF_ENABLED | MF_BYPOSITION);
1197 		EnableMenuItem(GetSubMenu(hMenu, 1), 10,	MF_ENABLED | MF_BYPOSITION);
1198 	}
1199 	EnableMenuItem(GetSubMenu(hMenu, 1), 11,		MF_ENABLED | MF_BYPOSITION);
1200 
1201 #if 0
1202 	if (nVidSelect == 3 && !(nVidBlitterOpt[3] & (1 <<  9))) {
1203 		EnableMenuItem(hMenu, MENU_DX9_CUBIC0,		MF_GRAYED  | MF_BYCOMMAND);
1204 		EnableMenuItem(hMenu, MENU_DX9_CUBIC1,		MF_GRAYED  | MF_BYCOMMAND);
1205 		EnableMenuItem(hMenu, MENU_DX9_CUBIC2,		MF_GRAYED  | MF_BYCOMMAND);
1206 		EnableMenuItem(hMenu, MENU_DX9_CUBIC3,		MF_GRAYED  | MF_BYCOMMAND);
1207 		EnableMenuItem(hMenu, MENU_DX9_CUBIC4,		MF_GRAYED  | MF_BYCOMMAND);
1208 	} else {
1209 		EnableMenuItem(hMenu, MENU_DX9_CUBIC0,		MF_ENABLED | MF_BYCOMMAND);
1210 		EnableMenuItem(hMenu, MENU_DX9_CUBIC1,		MF_ENABLED | MF_BYCOMMAND);
1211 		EnableMenuItem(hMenu, MENU_DX9_CUBIC2,		MF_ENABLED | MF_BYCOMMAND);
1212 		EnableMenuItem(hMenu, MENU_DX9_CUBIC3,		MF_ENABLED | MF_BYCOMMAND);
1213 		EnableMenuItem(hMenu, MENU_DX9_CUBIC4,		MF_ENABLED | MF_BYCOMMAND);
1214 	}
1215 #endif
1216 
1217 	if (nVidSelect == 3 && (!(nVidBlitterOpt[3] & (1 <<  9)) || (nVidBlitterOpt[nVidSelect] & (7 << 28)) == (4 << 28))) {
1218 		EnableMenuItem(hMenu, MENU_DX9_CUBIC_BSPLINE,	MF_GRAYED  | MF_BYCOMMAND);
1219 		EnableMenuItem(hMenu, MENU_DX9_CUBIC_NOTCH,		MF_GRAYED  | MF_BYCOMMAND);
1220 		EnableMenuItem(hMenu, MENU_DX9_CUBIC_OPTIMAL,	MF_GRAYED  | MF_BYCOMMAND);
1221 	} else {
1222 		EnableMenuItem(hMenu, MENU_DX9_CUBIC_BSPLINE,	MF_ENABLED | MF_BYCOMMAND);
1223 		EnableMenuItem(hMenu, MENU_DX9_CUBIC_NOTCH,		MF_ENABLED | MF_BYCOMMAND);
1224 		EnableMenuItem(hMenu, MENU_DX9_CUBIC_OPTIMAL,	MF_ENABLED | MF_BYCOMMAND);
1225 	}
1226 	if (nVidSelect == 3) {
1227 		EnableMenuItem(hMenu, MENU_24,	                MF_GRAYED  | MF_BYCOMMAND);
1228 	}
1229 
1230 	EnableMenuItem(hMenu, MENU_MODELESS,	                MF_ENABLED  | MF_BYCOMMAND);
1231 
1232 #if defined _MSC_VER && defined BUILD_X86_ASM
1233 	EnableMenuItem(hBlitterMenu[1], MENU_ENHANCED_SOFT_HQ3XS_VBA, MF_ENABLED | MF_BYCOMMAND);
1234 	EnableMenuItem(hBlitterMenu[2], MENU_SOFTFX_SOFT_HQ3XS_VBA, MF_ENABLED | MF_BYCOMMAND);
1235 	EnableMenuItem(hBlitterMenu[4], MENU_DX9_ALT_SOFT_HQ3XS_VBA, MF_ENABLED | MF_BYCOMMAND);
1236 #endif
1237 
1238 	if (bDrvOkay) {
1239 		EnableMenuItem(hMenu, MENU_QUIT,				MF_ENABLED | MF_BYCOMMAND);
1240 		EnableMenuItem(hMenu, MENU_INPUT,				MF_ENABLED | MF_BYCOMMAND);
1241 		EnableMenuItem(hMenu, MENU_FORCE60HZ,				MF_GRAYED  | MF_BYCOMMAND);
1242 		EnableMenuItem(hMenu, MENU_DSOUND_NOSOUND,				MF_GRAYED  | MF_BYCOMMAND);
1243 		EnableMenuItem(hMenu, MENU_DSOUND_11025,				MF_GRAYED  | MF_BYCOMMAND);
1244 		EnableMenuItem(hMenu, MENU_DSOUND_22050,				MF_GRAYED  | MF_BYCOMMAND);
1245 		EnableMenuItem(hMenu, MENU_DSOUND_44100,				MF_GRAYED  | MF_BYCOMMAND);
1246 		EnableMenuItem(hMenu, MENU_DSOUND_48000,				MF_GRAYED  | MF_BYCOMMAND);
1247 		EnableMenuItem(hMenu, MENU_XAUDIO_NOSOUND,				MF_GRAYED  | MF_BYCOMMAND);
1248 		EnableMenuItem(hMenu, MENU_XAUDIO_11025,				MF_GRAYED  | MF_BYCOMMAND);
1249 		EnableMenuItem(hMenu, MENU_XAUDIO_22050,				MF_GRAYED  | MF_BYCOMMAND);
1250 		EnableMenuItem(hMenu, MENU_XAUDIO_44100,				MF_GRAYED  | MF_BYCOMMAND);
1251 		EnableMenuItem(hMenu, MENU_XAUDIO_48000,				MF_GRAYED  | MF_BYCOMMAND);
1252 		EnableMenuItem(hMenu, MENU_INTERPOLATE_FM_0,	MF_GRAYED  | MF_BYCOMMAND);
1253 		EnableMenuItem(hMenu, MENU_INTERPOLATE_FM_3,	MF_GRAYED  | MF_BYCOMMAND);
1254 		EnableMenuItem(hMenu, MENU_FRAMES,				MF_GRAYED  | MF_BYCOMMAND);
1255 		EnableMenuItem(hMenu, MENU_SAVESNAP,			MF_ENABLED | MF_BYCOMMAND);
1256 		EnableMenuItem(hMenu, MENU_SAVEGAMEINPUTNOW,	MF_ENABLED | MF_BYCOMMAND);
1257 #ifdef BUILD_A68K
1258 		EnableMenuItem(hMenu, MENU_ASSEMBLYCORE,		MF_GRAYED  | MF_BYCOMMAND);
1259 #endif
1260 		EnableMenuItem(hMenu, MENU_SAVEHISCORES,		MF_GRAYED  | MF_BYCOMMAND);
1261 		EnableMenuItem(hMenu, MENU_USEBLEND,			MF_GRAYED  | MF_BYCOMMAND);
1262 
1263 		EnableMenuItem(hMenu, MENU_CDIMAGE,				MF_GRAYED | MF_BYCOMMAND);
1264 
1265 		EnableMenuItem(hMenu, MENU_AUD_PLUGIN_1, MF_GRAYED  | MF_BYCOMMAND);
1266 		EnableMenuItem(hMenu, MENU_AUD_PLUGIN_2, MF_GRAYED  | MF_BYCOMMAND);
1267 
1268 		BurnDIPInfo bdi;
1269 		if (BurnDrvGetDIPInfo(&bdi, 0) == 0) {
1270 			EnableMenuItem(hMenu, MENU_DIPSW,			MF_ENABLED | MF_BYCOMMAND);
1271 		} else {
1272 			EnableMenuItem(hMenu, MENU_DIPSW,			MF_GRAYED | MF_BYCOMMAND);
1273 		}
1274 
1275 		EnableMenuItem(hMenu, MENU_INTERPOLATE_1,		MF_ENABLED | MF_BYCOMMAND);
1276 		EnableMenuItem(hMenu, MENU_INTERPOLATE_3,		MF_ENABLED | MF_BYCOMMAND);
1277 
1278 		EnableMenuItem(hMenu, MENU_MEMCARD_CREATE,		MF_GRAYED | MF_BYCOMMAND);
1279 		EnableMenuItem(hMenu, MENU_MEMCARD_SELECT,		MF_GRAYED | MF_BYCOMMAND);
1280 		EnableMenuItem(hMenu, MENU_MEMCARD_INSERT,		MF_GRAYED | MF_BYCOMMAND);
1281 		EnableMenuItem(hMenu, MENU_MEMCARD_EJECT,		MF_GRAYED | MF_BYCOMMAND);
1282 
1283 		if ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SNK_NEOGEO) {
1284 			EnableMenuItem(hMenu, MENU_INTERPOLATE_1,				MF_GRAYED | MF_BYCOMMAND);
1285 			EnableMenuItem(hMenu, MENU_INTERPOLATE_3,				MF_GRAYED | MF_BYCOMMAND);
1286 
1287 			if (!kNetGame) {
1288 				EnableMenuItem(hMenu, MENU_MEMCARD_CREATE,			MF_ENABLED | MF_BYCOMMAND);
1289 				EnableMenuItem(hMenu, MENU_MEMCARD_SELECT,			MF_ENABLED | MF_BYCOMMAND);
1290 				if (nMemoryCardStatus & 1) {
1291 					if (nMemoryCardStatus & 2) {
1292 						EnableMenuItem(hMenu, MENU_MEMCARD_EJECT,	MF_ENABLED | MF_BYCOMMAND);
1293 					} else {
1294 						EnableMenuItem(hMenu, MENU_MEMCARD_INSERT,	MF_ENABLED | MF_BYCOMMAND);
1295 					}
1296 				}
1297 			}
1298 		}
1299 
1300 		if (kNetGame) {
1301 			EnableMenuItem(hMenu, MENU_LOAD,			MF_GRAYED | MF_BYCOMMAND);
1302 			EnableMenuItem(hMenu, MENU_STARTNET,		MF_GRAYED | MF_BYCOMMAND);
1303 			EnableMenuItem(hMenu, MENU_EXIT,			MF_GRAYED | MF_BYCOMMAND);
1304 			EnableMenuItem(hMenu, MENU_SETCPUCLOCK,		MF_GRAYED | MF_BYCOMMAND);
1305 			EnableMenuItem(hMenu, MENU_RESETCPUCLOCK,	MF_GRAYED | MF_BYCOMMAND);
1306 			EnableMenuItem(hMenu, MENU_PAUSE,			MF_GRAYED | MF_BYCOMMAND);
1307 			EnableMenuItem(hMenu, MENU_ENABLECHEAT,		MF_GRAYED | MF_BYCOMMAND);
1308 			EnableMenuItem(hMenu, MENU_SNAPFACT,		MF_GRAYED | MF_BYCOMMAND);
1309 		} else {
1310 			EnableMenuItem(hMenu, MENU_LOAD,			MF_ENABLED | MF_BYCOMMAND);
1311 			EnableMenuItem(hMenu, MENU_STARTNET,		MF_ENABLED | MF_BYCOMMAND);
1312 			EnableMenuItem(hMenu, MENU_EXIT,			MF_ENABLED | MF_BYCOMMAND);
1313 			EnableMenuItem(hMenu, MENU_SETCPUCLOCK,		MF_ENABLED | MF_BYCOMMAND);
1314 			EnableMenuItem(hMenu, MENU_RESETCPUCLOCK,	(nBurnCPUSpeedAdjust != 0x0100 ? MF_ENABLED : MF_GRAYED) | MF_BYCOMMAND);
1315 			EnableMenuItem(hMenu, MENU_PAUSE,			MF_ENABLED | MF_BYCOMMAND);
1316 			if (pCheatInfo) {
1317 				EnableMenuItem(hMenu, MENU_ENABLECHEAT,	MF_ENABLED | MF_BYCOMMAND);
1318 			}
1319 
1320 			if (CheatSearchInit()) {
1321 				EnableMenuItem(hMenu, MENU_CHEATSEARCH_START, MF_ENABLED | MF_BYCOMMAND);
1322 			}
1323 
1324 #if defined (FBA_DEBUG)
1325 			extern UINT8 DebugCPU_SekInitted;
1326 			if (DebugCPU_SekInitted) {
1327 				EnableMenuItem(hMenu, MENU_DEBUG,		MF_ENABLED | MF_BYCOMMAND);
1328 			} else {
1329 				EnableMenuItem(hMenu, MENU_DEBUG,		MF_GRAYED | MF_BYCOMMAND);
1330 			}
1331 #else
1332 			EnableMenuItem(hMenu, MENU_DEBUG,			MF_GRAYED  | MF_BYCOMMAND);
1333 #endif
1334 
1335 			if (BurnDrvGetPaletteEntries()) EnableMenuItem(hMenu, MENU_PALETTEVIEWER,	MF_ENABLED | MF_BYCOMMAND);
1336 			EnableMenuItem(hMenu, MENU_SNAPFACT,		MF_ENABLED | MF_BYCOMMAND);
1337 		}
1338 
1339 		if (WaveLog) {
1340 			EnableMenuItem(hMenu, MENU_WLOGEND,		MF_ENABLED | MF_BYCOMMAND);
1341 			EnableMenuItem(hMenu, MENU_WLOGSTART,	MF_GRAYED  | MF_BYCOMMAND);
1342 		} else {
1343 			EnableMenuItem(hMenu, MENU_WLOGEND,		MF_GRAYED  | MF_BYCOMMAND);
1344 			EnableMenuItem(hMenu, MENU_WLOGSTART,	MF_ENABLED | MF_BYCOMMAND);
1345 		}
1346 
1347 		{ // Enabled by default / selectively disabled below (nReplayStatus & kNetGame blocks)
1348 			EnableMenuItem(hMenu, MENU_STARTRECORD,			MF_ENABLED | MF_BYCOMMAND);
1349 			EnableMenuItem(hMenu, MENU_STARTREPLAY,			MF_ENABLED | MF_BYCOMMAND);
1350 			EnableMenuItem(hMenu, MENU_STATE_SAVE_SLOT,		MF_ENABLED | MF_BYCOMMAND);
1351 			EnableMenuItem(hMenu, MENU_STATE_SAVE_DIALOG,	MF_ENABLED | MF_BYCOMMAND);
1352 			EnableMenuItem(hMenu, MENU_STATE_LOAD_SLOT,		MF_ENABLED | MF_BYCOMMAND);
1353 			EnableMenuItem(hMenu, MENU_STATE_LOAD_DIALOG,	MF_ENABLED | MF_BYCOMMAND);
1354 		}
1355 
1356 		if (nReplayStatus) {
1357 			EnableMenuItem(hMenu, MENU_STOPREPLAY,				MF_ENABLED | MF_BYCOMMAND);
1358 			EnableMenuItem(hMenu, MENU_STARTRECORD,				MF_GRAYED  | MF_BYCOMMAND);
1359 			EnableMenuItem(hMenu, MENU_STARTREPLAY,				MF_GRAYED  | MF_BYCOMMAND);
1360 		} else {
1361 			EnableMenuItem(hMenu, MENU_STOPREPLAY,				MF_GRAYED  | MF_BYCOMMAND);
1362 		}
1363 
1364 		if (kNetGame) {
1365 			EnableMenuItem(hMenu, MENU_STARTRECORD,			MF_ENABLED | MF_BYCOMMAND);
1366 			EnableMenuItem(hMenu, MENU_STARTREPLAY,			MF_GRAYED  | MF_BYCOMMAND);
1367 			EnableMenuItem(hMenu, MENU_STATE_SAVE_SLOT,		MF_ENABLED | MF_BYCOMMAND);
1368 			EnableMenuItem(hMenu, MENU_STATE_SAVE_DIALOG,	MF_ENABLED | MF_BYCOMMAND);
1369 			EnableMenuItem(hMenu, MENU_STATE_LOAD_SLOT,		MF_GRAYED  | MF_BYCOMMAND);
1370 			EnableMenuItem(hMenu, MENU_STATE_LOAD_DIALOG,	MF_GRAYED  | MF_BYCOMMAND);
1371 		}
1372 
1373 #ifdef INCLUDE_AVI_RECORDING
1374 		if (nAviStatus) {
1375 			EnableMenuItem(hMenu, MENU_AVISTART,	        MF_GRAYED | MF_BYCOMMAND);
1376 			EnableMenuItem(hMenu, MENU_AVISTOP,		        MF_ENABLED | MF_BYCOMMAND);
1377 			EnableMenuItem(hMenu, MENU_AVI1X,		        MF_GRAYED | MF_BYCOMMAND);
1378 			EnableMenuItem(hMenu, MENU_AVI2X,		        MF_GRAYED | MF_BYCOMMAND);
1379 			EnableMenuItem(hMenu, MENU_AVI3X,		        MF_GRAYED | MF_BYCOMMAND);
1380 		} else {
1381 			EnableMenuItem(hMenu, MENU_AVISTART,	        MF_ENABLED | MF_BYCOMMAND);
1382 			EnableMenuItem(hMenu, MENU_AVISTOP,		        MF_GRAYED | MF_BYCOMMAND);
1383 			EnableMenuItem(hMenu, MENU_AVI1X,		        MF_ENABLED | MF_BYCOMMAND);
1384 			EnableMenuItem(hMenu, MENU_AVI2X,		        MF_ENABLED | MF_BYCOMMAND);
1385 			EnableMenuItem(hMenu, MENU_AVI3X,		        MF_ENABLED | MF_BYCOMMAND);
1386 		}
1387 #endif
1388 	} else {
1389 		bAltPause = 0;
1390 
1391 		EnableMenuItem(hMenu, MENU_LOAD,				MF_ENABLED | MF_BYCOMMAND);
1392 		EnableMenuItem(hMenu, MENU_MEMCARD_CREATE,		MF_GRAYED  | MF_BYCOMMAND);
1393 		EnableMenuItem(hMenu, MENU_MEMCARD_SELECT,		MF_GRAYED  | MF_BYCOMMAND);
1394 		EnableMenuItem(hMenu, MENU_MEMCARD_INSERT,		MF_GRAYED  | MF_BYCOMMAND);
1395 		EnableMenuItem(hMenu, MENU_MEMCARD_EJECT,		MF_GRAYED  | MF_BYCOMMAND);
1396 		EnableMenuItem(hMenu, MENU_STARTNET,			MF_ENABLED | MF_BYCOMMAND);
1397 		EnableMenuItem(hMenu, MENU_STARTREPLAY,			MF_ENABLED | MF_BYCOMMAND);
1398 		EnableMenuItem(hMenu, MENU_STARTRECORD,			MF_GRAYED  | MF_BYCOMMAND);
1399 		EnableMenuItem(hMenu, MENU_STOPREPLAY,			MF_GRAYED  | MF_BYCOMMAND);
1400 		EnableMenuItem(hMenu, MENU_QUIT,				MF_GRAYED  | MF_BYCOMMAND);
1401 		EnableMenuItem(hMenu, MENU_EXIT,				MF_ENABLED | MF_BYCOMMAND);
1402 		EnableMenuItem(hMenu, MENU_INPUT,				MF_GRAYED  | MF_BYCOMMAND);
1403 		EnableMenuItem(hMenu, MENU_SETCPUCLOCK,			MF_GRAYED  | MF_BYCOMMAND);
1404 		EnableMenuItem(hMenu, MENU_RESETCPUCLOCK,		MF_GRAYED  | MF_BYCOMMAND);
1405 		EnableMenuItem(hMenu, MENU_PAUSE,				MF_GRAYED  | MF_BYCOMMAND);
1406 		EnableMenuItem(hMenu, MENU_FORCE60HZ,			MF_ENABLED | MF_BYCOMMAND);
1407 		EnableMenuItem(hMenu, MENU_DIPSW,				MF_GRAYED  | MF_BYCOMMAND);
1408 		EnableMenuItem(hMenu, MENU_ENABLECHEAT,			MF_GRAYED  | MF_BYCOMMAND);
1409 		EnableMenuItem(hMenu, MENU_DEBUG,				MF_GRAYED  | MF_BYCOMMAND);
1410 #ifdef BUILD_A68K
1411 		EnableMenuItem(hMenu, MENU_ASSEMBLYCORE,		MF_ENABLED | MF_BYCOMMAND);
1412 #endif
1413 		EnableMenuItem(hMenu, MENU_SAVEHISCORES,		MF_ENABLED  | MF_BYCOMMAND);
1414 		EnableMenuItem(hMenu, MENU_USEBLEND,			MF_ENABLED  | MF_BYCOMMAND);
1415 		EnableMenuItem(hMenu, MENU_STATE_LOAD_SLOT,		MF_GRAYED  | MF_BYCOMMAND);
1416 		EnableMenuItem(hMenu, MENU_STATE_LOAD_DIALOG,	MF_ENABLED | MF_BYCOMMAND);
1417 		EnableMenuItem(hMenu, MENU_STATE_SAVE_SLOT,		MF_GRAYED  | MF_BYCOMMAND);
1418 		EnableMenuItem(hMenu, MENU_STATE_SAVE_DIALOG,	MF_GRAYED  | MF_BYCOMMAND);
1419 		EnableMenuItem(hMenu, MENU_FRAMES,				MF_ENABLED | MF_BYCOMMAND);
1420 		EnableMenuItem(hMenu, MENU_DSOUND_NOSOUND,				MF_ENABLED | MF_BYCOMMAND);
1421 		EnableMenuItem(hMenu, MENU_DSOUND_11025,				MF_ENABLED | MF_BYCOMMAND);
1422 		EnableMenuItem(hMenu, MENU_DSOUND_22050,				MF_ENABLED | MF_BYCOMMAND);
1423 		EnableMenuItem(hMenu, MENU_DSOUND_44100,				MF_ENABLED | MF_BYCOMMAND);
1424 		EnableMenuItem(hMenu, MENU_DSOUND_48000,				MF_ENABLED | MF_BYCOMMAND);
1425 		EnableMenuItem(hMenu, MENU_XAUDIO_NOSOUND,				MF_ENABLED | MF_BYCOMMAND);
1426 		EnableMenuItem(hMenu, MENU_XAUDIO_11025,				MF_ENABLED | MF_BYCOMMAND);
1427 		EnableMenuItem(hMenu, MENU_XAUDIO_22050,				MF_ENABLED | MF_BYCOMMAND);
1428 		EnableMenuItem(hMenu, MENU_XAUDIO_44100,				MF_ENABLED | MF_BYCOMMAND);
1429 		EnableMenuItem(hMenu, MENU_XAUDIO_48000,				MF_ENABLED | MF_BYCOMMAND);
1430 //		EnableMenuItem(hMenu, MENU_INTERPOLATE_1,		MF_ENABLED | MF_BYCOMMAND);
1431 //		EnableMenuItem(hMenu, MENU_INTERPOLATE_3,		MF_ENABLED | MF_BYCOMMAND);
1432 		EnableMenuItem(hMenu, MENU_WLOGSTART,			MF_GRAYED  | MF_BYCOMMAND);
1433 		EnableMenuItem(hMenu, MENU_INTERPOLATE_FM_0,	MF_ENABLED | MF_BYCOMMAND);
1434 		EnableMenuItem(hMenu, MENU_INTERPOLATE_FM_3,	MF_ENABLED | MF_BYCOMMAND);
1435 		EnableMenuItem(hMenu, MENU_WLOGEND,				MF_GRAYED  | MF_BYCOMMAND);
1436 		EnableMenuItem(hMenu, MENU_SAVESNAP,			MF_GRAYED  | MF_BYCOMMAND);
1437 		EnableMenuItem(hMenu, MENU_SNAPFACT,			MF_GRAYED  | MF_BYCOMMAND);
1438 		EnableMenuItem(hMenu, MENU_PALETTEVIEWER,		MF_GRAYED | MF_BYCOMMAND);
1439 		EnableMenuItem(hMenu, MENU_SAVEGAMEINPUTNOW,		MF_GRAYED  | MF_BYCOMMAND);
1440 #ifdef INCLUDE_AVI_RECORDING
1441 		EnableMenuItem(hMenu, MENU_AVISTART,	        MF_GRAYED | MF_BYCOMMAND);
1442 		EnableMenuItem(hMenu, MENU_AVISTOP,		        MF_GRAYED | MF_BYCOMMAND);
1443 #endif
1444 		EnableMenuItem(hMenu, MENU_CDIMAGE,				MF_ENABLED | MF_BYCOMMAND);
1445 
1446 		EnableMenuItem(hMenu, MENU_AUD_PLUGIN_1, 		MF_ENABLED  | MF_BYCOMMAND);
1447 		EnableMenuItem(hMenu, MENU_AUD_PLUGIN_2,		 MF_ENABLED  | MF_BYCOMMAND);
1448 	}
1449 }
1450