6d1f51397e
Still needs sound. Note: won't run with optimizations so release build is -O0
408 lines
15 KiB
C++
Executable File
408 lines
15 KiB
C++
Executable File
// ----------------------------------------------------------------------------
|
|
// ___ ___ ___ ___ ___ ____ ___ _ _
|
|
// /__/ /__/ / / /__ /__/ /__ / /_ / |/ /
|
|
// / / \ /__/ ___/ ___/ ___/ / /__ / / emulator
|
|
//
|
|
// ----------------------------------------------------------------------------
|
|
// Copyright 2005 Greg Stanton
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 2 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program; if not, write to the Free Software
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
// ----------------------------------------------------------------------------
|
|
// Menu.cpp
|
|
// ----------------------------------------------------------------------------
|
|
#include "Menu.h"
|
|
|
|
HACCEL menu_hAccel = NULL;
|
|
|
|
static HMENU menu_hMenu = NULL;
|
|
static HMENU menu_hFileMenu = NULL;
|
|
static HMENU menu_hOptionsMenu = NULL;
|
|
static HMENU menu_hRecentMenu = NULL;
|
|
static HMENU menu_hDisplayMenu = NULL;
|
|
static HMENU menu_hScreenshotMenu = NULL;
|
|
static HMENU menu_hModesMenu = NULL;
|
|
static HMENU menu_hSoundMenu = NULL;
|
|
static HMENU menu_hSampleRateMenu = NULL;
|
|
static HMENU menu_hLatencyMenu = NULL;
|
|
static HMENU menu_hEmulationMenu = NULL;
|
|
static HMENU menu_hFrameSkipMenu = NULL;
|
|
static HMENU menu_hRegionsMenu = NULL;
|
|
static HMENU menu_hInputMenu = NULL;
|
|
static HMENU menu_hHelpMenu = NULL;
|
|
static HWND menu_hWnd = NULL;
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// RefreshDisplayMenu
|
|
// ----------------------------------------------------------------------------
|
|
static void menu_RefreshDisplayMenu( ) {
|
|
//Leonis
|
|
CheckMenuItem(menu_hScreenshotMenu, 0, MF_BYPOSITION | ((screenshot1)? MF_CHECKED: MF_UNCHECKED));
|
|
CheckMenuItem(menu_hScreenshotMenu, 1, MF_BYPOSITION | ((screenshot2)? MF_CHECKED: MF_UNCHECKED));
|
|
|
|
CheckMenuItem(menu_hDisplayMenu, 0, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hDisplayMenu, 2, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hDisplayMenu, 5, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hDisplayMenu, 6, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hDisplayMenu, 7, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hDisplayMenu, 8, MF_BYPOSITION | MF_UNCHECKED);
|
|
if(display_IsFullscreen( )) {
|
|
CheckMenuItem(menu_hDisplayMenu, 0, MF_BYPOSITION | MF_CHECKED);
|
|
}
|
|
if(display_stretched) {
|
|
CheckMenuItem(menu_hDisplayMenu, 2, MF_BYPOSITION | MF_CHECKED);
|
|
}
|
|
CheckMenuItem(menu_hDisplayMenu, display_zoom + 4, MF_BYPOSITION | MF_CHECKED);
|
|
|
|
if(cartridge_IsLoaded( )) {
|
|
EnableMenuItem(menu_hDisplayMenu, 10, MF_BYPOSITION | MF_ENABLED);
|
|
}
|
|
else {
|
|
EnableMenuItem(menu_hDisplayMenu, 10, MF_BYPOSITION | MF_GRAYED);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// RefreshModesMenu
|
|
// ----------------------------------------------------------------------------
|
|
static void menu_RefreshModesMenu( ) {
|
|
int count = GetMenuItemCount(menu_hModesMenu);
|
|
int index;
|
|
for(index = count - 1; index >= 0; index--) {
|
|
DeleteMenu(menu_hModesMenu, index, MF_BYPOSITION);
|
|
}
|
|
|
|
count = 0;
|
|
for(index = 0; index < display_modes.size( ); index++) {
|
|
Mode mode = display_modes[index];
|
|
if(mode.bpp == 8) {
|
|
std::string description = common_Format(mode.width) + " x " + common_Format(mode.height);
|
|
MENUITEMINFO item_info = {0};
|
|
item_info.cbSize = sizeof(MENUITEMINFO);
|
|
item_info.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID;
|
|
item_info.dwItemData = (DWORD)&display_modes[index];
|
|
item_info.dwTypeData = (char*)description.c_str( );
|
|
item_info.wID = IDM_MODES_BASE + index;
|
|
InsertMenuItem(menu_hModesMenu, count, TRUE, &item_info);
|
|
if(display_mode.height == mode.height && display_mode.width == mode.width) {
|
|
CheckMenuItem(menu_hModesMenu, count, MF_BYPOSITION | MF_CHECKED);
|
|
}
|
|
count++;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// RefreshOptionsMenu
|
|
// ----------------------------------------------------------------------------
|
|
static void menu_RefreshOptionsMenu( ) {
|
|
if(cartridge_IsLoaded( )) {
|
|
EnableMenuItem(menu_hOptionsMenu, 0, MF_BYPOSITION | MF_ENABLED);
|
|
EnableMenuItem(menu_hOptionsMenu, 1, MF_BYPOSITION | MF_ENABLED);
|
|
CheckMenuItem(menu_hOptionsMenu, 1, MF_BYPOSITION | ((prosystem_paused)? MF_CHECKED: MF_UNCHECKED));
|
|
}
|
|
else {
|
|
EnableMenuItem(menu_hOptionsMenu, 0, MF_BYPOSITION | MF_GRAYED);
|
|
EnableMenuItem(menu_hOptionsMenu, 1, MF_BYPOSITION | MF_GRAYED);
|
|
CheckMenuItem(menu_hOptionsMenu, 1, MF_BYPOSITION | MF_UNCHECKED);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// RefreshRecentMenu
|
|
// ----------------------------------------------------------------------------
|
|
static void menu_RefreshRecentMenu( ) {
|
|
for(uint slot = 0; slot < 10; slot++) {
|
|
ModifyMenu(menu_hRecentMenu, slot, MF_BYPOSITION, IDM_RECENT_SLOT0 + slot, std::string("&" + common_Format(slot) + " " + console_recent[slot]).c_str( ));
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// RefreshSoundMenu
|
|
// ----------------------------------------------------------------------------
|
|
static void menu_RefreshSoundMenu( ) {
|
|
CheckMenuItem(menu_hSoundMenu, 0, MF_BYPOSITION | ((sound_IsMuted( ))? MF_CHECKED: MF_UNCHECKED));
|
|
|
|
CheckMenuItem(menu_hSampleRateMenu, 0, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hSampleRateMenu, 1, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hSampleRateMenu, 2, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hSampleRateMenu, 3, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hSampleRateMenu, 4, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hSampleRateMenu, 5, MF_BYPOSITION | MF_UNCHECKED);
|
|
|
|
switch(sound_GetSampleRate( )) {
|
|
case 11025:
|
|
CheckMenuItem(menu_hSampleRateMenu, 0, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 22050:
|
|
CheckMenuItem(menu_hSampleRateMenu, 1, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 31440:
|
|
CheckMenuItem(menu_hSampleRateMenu, 2, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 44100:
|
|
CheckMenuItem(menu_hSampleRateMenu, 3, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 48000:
|
|
CheckMenuItem(menu_hSampleRateMenu, 4, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 96000:
|
|
CheckMenuItem(menu_hSampleRateMenu, 5, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
}
|
|
|
|
CheckMenuItem(menu_hLatencyMenu, 0, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hLatencyMenu, 1, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hLatencyMenu, 2, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hLatencyMenu, 3, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hLatencyMenu, 4, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hLatencyMenu, 5, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hLatencyMenu, sound_latency, MF_BYPOSITION | MF_CHECKED);
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// RefreshRegionsMenu
|
|
// ----------------------------------------------------------------------------
|
|
void menu_RefreshRegionsMenu( ) {
|
|
CheckMenuItem(menu_hRegionsMenu, 0, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hRegionsMenu, 2, MF_BYPOSITION | MF_UNCHECKED);
|
|
CheckMenuItem(menu_hRegionsMenu, 3, MF_BYPOSITION | MF_UNCHECKED);
|
|
switch(region_type) {
|
|
case REGION_AUTO:
|
|
CheckMenuItem(menu_hRegionsMenu, 0, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case REGION_NTSC:
|
|
CheckMenuItem(menu_hRegionsMenu, 2, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case REGION_PAL:
|
|
CheckMenuItem(menu_hRegionsMenu, 3, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// RefreshEmulationMenu
|
|
// ----------------------------------------------------------------------------
|
|
void menu_RefreshEmulationMenu( ) {
|
|
CheckMenuItem(menu_hEmulationMenu, 2, MF_BYPOSITION | ((bios_enabled)? MF_CHECKED: MF_UNCHECKED));
|
|
if(!cartridge_IsLoaded( )) {
|
|
EnableMenuItem(menu_hEmulationMenu, 0, MF_BYPOSITION | MF_ENABLED);
|
|
EnableMenuItem(menu_hEmulationMenu, 2, MF_BYPOSITION | MF_ENABLED);
|
|
}
|
|
else {
|
|
EnableMenuItem(menu_hEmulationMenu, 0, MF_BYPOSITION | MF_GRAYED);
|
|
EnableMenuItem(menu_hEmulationMenu, 2, MF_BYPOSITION | MF_GRAYED);
|
|
}
|
|
|
|
CheckMenuItem(menu_hEmulationMenu, 3, MF_BYPOSITION | ((database_enabled)? MF_CHECKED: MF_UNCHECKED));
|
|
for(int index = 0; index < 15; index++) {
|
|
CheckMenuItem(menu_hFrameSkipMenu, index, MF_BYPOSITION | MF_UNCHECKED);
|
|
}
|
|
switch(console_frameSkip) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
CheckMenuItem(menu_hFrameSkipMenu, console_frameSkip, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 15:
|
|
CheckMenuItem(menu_hFrameSkipMenu, 11, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 20:
|
|
CheckMenuItem(menu_hFrameSkipMenu, 12, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 25:
|
|
CheckMenuItem(menu_hFrameSkipMenu, 13, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
case 30:
|
|
CheckMenuItem(menu_hFrameSkipMenu, 14, MF_BYPOSITION | MF_CHECKED);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// RefreshFileMenu
|
|
// ----------------------------------------------------------------------------
|
|
void menu_RefreshFileMenu( ) {
|
|
if(cartridge_IsLoaded( )) {
|
|
EnableMenuItem(menu_hFileMenu, 1, MF_BYPOSITION | MF_ENABLED);
|
|
EnableMenuItem(menu_hFileMenu, 4, MF_BYPOSITION | MF_ENABLED);
|
|
EnableMenuItem(menu_hFileMenu, 5, MF_BYPOSITION | MF_ENABLED);
|
|
}
|
|
else {
|
|
EnableMenuItem(menu_hFileMenu, 1, MF_BYPOSITION | MF_GRAYED);
|
|
EnableMenuItem(menu_hFileMenu, 4, MF_BYPOSITION | MF_GRAYED);
|
|
EnableMenuItem(menu_hFileMenu, 5, MF_BYPOSITION | MF_GRAYED);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Initialize
|
|
// ----------------------------------------------------------------------------
|
|
bool menu_Initialize(HWND hWnd, HINSTANCE hInstance) {
|
|
if(hWnd == NULL) {
|
|
logger_LogError(IDS_INPUT1,"");
|
|
}
|
|
if(hInstance == NULL) {
|
|
logger_LogError(IDS_INPUT2,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU_MAIN));
|
|
if(menu_hMenu == NULL) {
|
|
logger_LogError(IDS_MENU2,"");
|
|
logger_LogError("",common_GetErrorMessage( ));
|
|
return false;
|
|
}
|
|
|
|
if(!SetMenu(hWnd, menu_hMenu)) {
|
|
logger_LogError(IDS_MENU3,"");
|
|
logger_LogError("",common_GetErrorMessage( ));
|
|
return false;
|
|
}
|
|
|
|
menu_hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR));
|
|
if(menu_hAccel == NULL) {
|
|
logger_LogError(IDS_MENU4,"");
|
|
logger_LogError("",common_GetErrorMessage( ));
|
|
return false;
|
|
}
|
|
|
|
menu_hFileMenu = GetSubMenu(menu_hMenu, 0);
|
|
if(menu_hFileMenu == NULL) {
|
|
logger_LogError(IDS_MENU5,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hRecentMenu = GetSubMenu(menu_hFileMenu, 2);
|
|
if(menu_hRecentMenu == NULL) {
|
|
logger_LogError(IDS_MENU6,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hOptionsMenu = GetSubMenu(menu_hMenu, 1);
|
|
if(menu_hOptionsMenu == NULL) {
|
|
logger_LogError(IDS_MENU7,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hDisplayMenu = GetSubMenu(menu_hOptionsMenu, 3);
|
|
if(menu_hDisplayMenu == NULL) {
|
|
logger_LogError(IDS_MENU8,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hScreenshotMenu = GetSubMenu(menu_hDisplayMenu, 10);
|
|
if(menu_hScreenshotMenu == NULL) {
|
|
logger_LogError(IDS_MENU8,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hModesMenu = GetSubMenu(menu_hDisplayMenu, 1);
|
|
if(menu_hModesMenu == NULL) {
|
|
logger_LogError(IDS_MENU9,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hSoundMenu = GetSubMenu(menu_hOptionsMenu, 4);
|
|
if(menu_hSoundMenu == NULL) {
|
|
logger_LogError(IDS_MENU10,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hSampleRateMenu = GetSubMenu(menu_hSoundMenu, 2);
|
|
if(menu_hSampleRateMenu == NULL) {
|
|
logger_LogError(IDS_MENU11,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hLatencyMenu = GetSubMenu(menu_hSoundMenu, 3);
|
|
if(menu_hLatencyMenu == NULL) {
|
|
logger_LogError(IDS_MENU11,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hEmulationMenu = GetSubMenu(menu_hOptionsMenu, 5);
|
|
if(menu_hEmulationMenu == NULL) {
|
|
logger_LogError(IDS_MENU12,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hRegionsMenu = GetSubMenu(menu_hEmulationMenu, 0);
|
|
if(menu_hRegionsMenu == NULL) {
|
|
logger_LogError(IDS_MENU13,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hFrameSkipMenu = GetSubMenu(menu_hEmulationMenu, 1);
|
|
if(menu_hFrameSkipMenu == NULL) {
|
|
logger_LogError(IDS_MENU14,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hInputMenu = GetSubMenu(menu_hOptionsMenu, 6);
|
|
if(menu_hInputMenu == NULL) {
|
|
logger_LogError(IDS_MENU15,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hHelpMenu = GetSubMenu(menu_hMenu, 2);
|
|
if(menu_hHelpMenu == NULL) {
|
|
logger_LogError(IDS_MENU16,"");
|
|
return false;
|
|
}
|
|
|
|
menu_hWnd = hWnd;
|
|
return true;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// Refresh
|
|
// ----------------------------------------------------------------------------
|
|
void menu_Refresh( ) {
|
|
menu_RefreshFileMenu( );
|
|
menu_RefreshDisplayMenu( );
|
|
menu_RefreshModesMenu( );
|
|
menu_RefreshRecentMenu( );
|
|
menu_RefreshOptionsMenu( );
|
|
menu_RefreshSoundMenu( );
|
|
menu_RefreshRegionsMenu( );
|
|
menu_RefreshEmulationMenu( );
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// SetEnabled
|
|
// ----------------------------------------------------------------------------
|
|
void menu_SetEnabled(bool enabled) {
|
|
if(enabled) {
|
|
SetMenu(menu_hWnd, menu_hMenu);
|
|
}
|
|
else {
|
|
SetMenu(menu_hWnd, NULL);
|
|
}
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// IsEnabled
|
|
// ----------------------------------------------------------------------------
|
|
bool menu_IsEnabled( ) {
|
|
return (GetMenu(menu_hWnd) == NULL)? false: true;
|
|
} |