mirror of
https://github.com/0ldsk00l/nestopia.git
synced 2025-04-02 10:31:51 -04:00
185 lines
5.4 KiB
C++
185 lines
5.4 KiB
C++
////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Nestopia - NES/Famicom emulator written in C++
|
|
//
|
|
// Copyright (C) 2003-2008 Martin Freij
|
|
//
|
|
// This file is part of Nestopia.
|
|
//
|
|
// Nestopia 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.
|
|
//
|
|
// Nestopia 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 Nestopia; if not, write to the Free Software
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "NstWindowUser.hpp"
|
|
#include "NstWindowParam.hpp"
|
|
#include "NstApplicationMain.hpp"
|
|
#include "../core/api/NstApiMachine.hpp"
|
|
|
|
namespace Nestopia
|
|
{
|
|
namespace Application
|
|
{
|
|
Main::Main(const int cmdShow)
|
|
:
|
|
menu ( IDR_MENU ),
|
|
preferences ( emulator, instance.GetConfiguration2(), menu ),
|
|
logfile ( emulator, menu, preferences ),
|
|
language ( emulator, menu ),
|
|
paths ( emulator, instance.GetConfiguration2(), menu ),
|
|
window ( emulator, instance.GetConfiguration2(), menu, paths, preferences, cmdShow ),
|
|
recentFiles ( emulator, instance.GetConfiguration2(), menu ),
|
|
recentDirs ( emulator, instance.GetConfiguration2(), menu ),
|
|
machine ( emulator, instance.GetConfiguration2(), menu, preferences ),
|
|
netplay ( emulator, instance.GetConfiguration2(), menu, paths, window.Get() ),
|
|
launcher ( emulator, instance.GetConfiguration2(), menu, paths, window.Get() ),
|
|
fds ( emulator, instance.GetConfiguration2(), menu, paths ),
|
|
tapeRecorder ( emulator, instance.GetConfiguration2(), menu, paths ),
|
|
dipSwitches ( emulator, instance.GetConfiguration2(), menu ),
|
|
barcodeReader ( emulator, menu ),
|
|
nsf ( emulator, instance.GetConfiguration2(), menu ),
|
|
movie ( emulator, menu, paths ),
|
|
cheats ( emulator, instance.GetConfiguration2(), menu, paths ),
|
|
saveStates ( emulator, menu, paths, window ),
|
|
imageDatabase ( emulator, instance.GetConfiguration2(), menu, paths ),
|
|
imageInfo ( emulator, menu ),
|
|
help ( emulator, menu ),
|
|
inesHeader ( emulator, menu, paths ),
|
|
files ( emulator, menu, paths, preferences, movie, tapeRecorder, cheats, saveStates, window )
|
|
{
|
|
static const Window::MsgHandler::Entry<Main> messages[] =
|
|
{
|
|
{ WM_CLOSE, &Main::OnWinClose },
|
|
{ WM_QUERYENDSESSION, &Main::OnWinQueryEndSession }
|
|
};
|
|
|
|
window.Get().Messages().Add( this, messages );
|
|
menu.Commands().Add( IDM_FILE_QUIT, this, &Main::OnCmdFileExit );
|
|
|
|
instance.GetConfiguration2().Reset();
|
|
|
|
if (instance.GetConfiguration2().GetStartupFile().Length())
|
|
window.Get().Send( Instance::WM_NST_LAUNCH, 0, instance.GetConfiguration2().GetStartupFile().Ptr() );
|
|
}
|
|
|
|
Main::~Main()
|
|
{
|
|
emulator.Unload();
|
|
|
|
menu.Commands().Remove( this );
|
|
window.Get().Messages().Remove( this );
|
|
}
|
|
|
|
void Main::Save()
|
|
{
|
|
Instance::Waiter waiter;
|
|
|
|
Configuration& cfg = instance.GetConfiguration2();
|
|
|
|
preferences.Save ( cfg );
|
|
recentFiles.Save ( cfg );
|
|
recentDirs.Save ( cfg );
|
|
paths.Save ( cfg );
|
|
imageDatabase.Save ( cfg );
|
|
launcher.Save ( cfg, preferences[Managers::Preferences::SAVE_LAUNCHERSIZE], preferences[Managers::Preferences::SAVE_LAUNCHER] );
|
|
netplay.Save ( cfg, preferences[Managers::Preferences::SAVE_NETPLAY_GAMELIST] );
|
|
fds.Save ( cfg );
|
|
dipSwitches.Save ( cfg );
|
|
tapeRecorder.Save ( cfg );
|
|
nsf.Save ( cfg );
|
|
window.Save ( cfg );
|
|
machine.Save ( cfg );
|
|
|
|
if (preferences[Managers::Preferences::SAVE_CHEATS])
|
|
cheats.Save( cfg );
|
|
|
|
if (preferences[Managers::Preferences::SAVE_SETTINGS])
|
|
cfg.EnableSaving();
|
|
|
|
instance.Save();
|
|
}
|
|
|
|
int Main::Run()
|
|
{
|
|
int exitCode = window.Run();
|
|
emulator.Unload();
|
|
|
|
if (exitCode == EXIT_SUCCESS)
|
|
Save();
|
|
|
|
return exitCode;
|
|
}
|
|
|
|
bool Main::FirstUnloadOnExit()
|
|
{
|
|
return
|
|
(
|
|
preferences[Managers::Preferences::FIRST_UNLOAD_ON_EXIT] &&
|
|
emulator.IsImage()
|
|
);
|
|
}
|
|
|
|
bool Main::OkToExit() const
|
|
{
|
|
return
|
|
(
|
|
!preferences[Managers::Preferences::CONFIRM_EXIT] ||
|
|
Window::User::Confirm( IDS_ARE_YOU_SURE, IDS_TITLE_EXIT )
|
|
);
|
|
}
|
|
|
|
void Main::Exit()
|
|
{
|
|
if (netplay.Close())
|
|
{
|
|
if (FirstUnloadOnExit())
|
|
{
|
|
window.Get().SendCommand( IDM_FILE_CLOSE );
|
|
}
|
|
else if (OkToExit())
|
|
{
|
|
emulator.Unload();
|
|
|
|
if (menu[IDM_MACHINE_SYSTEM_AUTO].Checked())
|
|
Nes::Machine(emulator).SetMode( Nes::Machine::NTSC );
|
|
|
|
::PostQuitMessage( EXIT_SUCCESS );
|
|
}
|
|
}
|
|
}
|
|
|
|
ibool Main::OnWinClose(Window::Param&)
|
|
{
|
|
Exit();
|
|
return true;
|
|
}
|
|
|
|
ibool Main::OnWinQueryEndSession(Window::Param& param)
|
|
{
|
|
netplay.Close();
|
|
|
|
if (emulator.IsImage())
|
|
window.Get().SendCommand( IDM_FILE_CLOSE );
|
|
|
|
param.lParam = !emulator.IsImage();
|
|
return true;
|
|
}
|
|
|
|
void Main::OnCmdFileExit(uint)
|
|
{
|
|
Exit();
|
|
Managers::Manager::Resume();
|
|
}
|
|
}
|
|
}
|