rlm@1: // VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator. rlm@1: // Copyright (C) 1999-2003 Forgotten rlm@1: // Copyright (C) 2004 Forgotten and the VBA development team rlm@1: rlm@1: // This program is free software; you can redistribute it and/or modify rlm@1: // it under the terms of the GNU General Public License as published by rlm@1: // the Free Software Foundation; either version 2, or(at your option) rlm@1: // any later version. rlm@1: // rlm@1: // This program is distributed in the hope that it will be useful, rlm@1: // but WITHOUT ANY WARRANTY; without even the implied warranty of rlm@1: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the rlm@1: // GNU General Public License for more details. rlm@1: // rlm@1: // You should have received a copy of the GNU General Public License rlm@1: // along with this program; if not, write to the Free Software Foundation, rlm@1: // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. rlm@1: rlm@1: #include "window.h" rlm@1: rlm@1: #include rlm@1: rlm@1: #include rlm@1: #include rlm@1: rlm@1: #include rlm@1: rlm@1: #include "../gba/GBA.h" rlm@1: #include "../gba/GBAGlobals.h" rlm@1: #include "../gba/Flash.h" rlm@1: #include "../gba/GBASound.h" rlm@1: #include "../gb/GB.h" rlm@1: #include "../gb/gbGlobals.h" rlm@1: #include "../gb/gbPrinter.h" rlm@1: #include "../common/Util.h" rlm@1: rlm@1: #include "tools.h" rlm@1: #include "intl.h" rlm@1: rlm@1: extern int systemRenderedFrames; rlm@1: extern int systemFPS; rlm@1: extern bool debugger; rlm@1: extern int RGB_LOW_BITS_MASK; rlm@1: extern void (*dbgMain)(); rlm@1: extern void (*dbgSignal)(int, int); rlm@1: extern void (*dbgOutput)(char *, u32); rlm@1: extern void remoteInit(); rlm@1: extern void remoteCleanUp(); rlm@1: extern void remoteStubMain(); rlm@1: extern void remoteStubSignal(int, int); rlm@1: extern void remoteOutput(char *, u32); rlm@1: extern void remoteSetProtocol(int); rlm@1: extern void remoteSetPort(int); rlm@1: rlm@1: #ifdef MMX rlm@1: extern "C" bool cpu_mmx; rlm@1: #endif // MMX rlm@1: rlm@1: namespace VBA rlm@1: { rlm@1: rlm@1: using Gnome::Glade::Xml; rlm@1: rlm@1: void Window::vOnFileOpen() rlm@1: { rlm@1: while (m_poFileOpenDialog->run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: if (bLoadROM(m_poFileOpenDialog->get_filename())) rlm@1: { rlm@1: break; rlm@1: } rlm@1: } rlm@1: m_poFileOpenDialog->hide(); rlm@1: } rlm@1: rlm@1: void Window::vOnFileLoad() rlm@1: { rlm@1: std::string sSaveDir = m_poDirConfig->sGetKey("saves"); rlm@1: rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: Gtk::FileSelection oDialog(_("Load game")); rlm@1: oDialog.set_transient_for(*this); rlm@1: rlm@1: if (sSaveDir == "") rlm@1: { rlm@1: oDialog.set_filename(Glib::path_get_dirname(m_sRomFile) + "/"); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_filename(sSaveDir + "/"); rlm@1: } rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: Gtk::FileChooserDialog oDialog(*this, _("Load game")); rlm@1: oDialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); rlm@1: oDialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); rlm@1: rlm@1: if (sSaveDir == "") rlm@1: { rlm@1: oDialog.set_current_folder(Glib::path_get_dirname(m_sRomFile)); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_current_folder(sSaveDir); rlm@1: oDialog.add_shortcut_folder(sSaveDir); rlm@1: } rlm@1: rlm@1: Gtk::FileFilter oSaveFilter; rlm@1: oSaveFilter.set_name(_("VisualBoyAdvance save game")); rlm@1: oSaveFilter.add_pattern("*.[sS][gG][mM]"); rlm@1: rlm@1: oDialog.add_filter(oSaveFilter); rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: rlm@1: while (oDialog.run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: if (m_stEmulator.emuReadState(oDialog.get_filename().c_str())) rlm@1: { rlm@1: break; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnFileSave() rlm@1: { rlm@1: Glib::ustring sSaveDir = m_poDirConfig->sGetKey("saves"); rlm@1: rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: Gtk::FileSelection oDialog(_("Save game")); rlm@1: oDialog.set_transient_for(*this); rlm@1: rlm@1: if (sSaveDir == "") rlm@1: { rlm@1: oDialog.set_filename(sCutSuffix(m_sRomFile)); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_filename(sSaveDir + "/" + rlm@1: sCutSuffix(Glib::path_get_basename(m_sRomFile))); rlm@1: } rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: Gtk::FileChooserDialog oDialog(*this, _("Save game"), rlm@1: Gtk::FILE_CHOOSER_ACTION_SAVE); rlm@1: oDialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); rlm@1: oDialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); rlm@1: rlm@1: if (sSaveDir == "") rlm@1: { rlm@1: oDialog.set_current_folder(Glib::path_get_dirname(m_sRomFile)); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_current_folder(sSaveDir); rlm@1: oDialog.add_shortcut_folder(sSaveDir); rlm@1: } rlm@1: oDialog.set_current_name(sCutSuffix(Glib::path_get_basename(m_sRomFile))); rlm@1: rlm@1: Gtk::FileFilter oSaveFilter; rlm@1: oSaveFilter.set_name(_("VisualBoyAdvance save game")); rlm@1: oSaveFilter.add_pattern("*.[sS][gG][mM]"); rlm@1: rlm@1: oDialog.add_filter(oSaveFilter); rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: rlm@1: while (oDialog.run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: Glib::ustring sFile = oDialog.get_filename(); rlm@1: if (! bHasSuffix(sFile, ".sgm", false)) rlm@1: { rlm@1: sFile += ".sgm"; rlm@1: } rlm@1: rlm@1: if (Glib::file_test(sFile, Glib::FILE_TEST_EXISTS)) rlm@1: { rlm@1: Gtk::MessageDialog oConfirmDialog(*this, rlm@1: _("File already exists. Overwrite it?"), rlm@1: #ifndef GTKMM20 rlm@1: false, rlm@1: #endif // ! GTKMM20 rlm@1: Gtk::MESSAGE_QUESTION, rlm@1: Gtk::BUTTONS_YES_NO); rlm@1: if (oConfirmDialog.run() != Gtk::RESPONSE_YES) rlm@1: { rlm@1: continue; rlm@1: } rlm@1: } rlm@1: rlm@1: if (m_stEmulator.emuWriteState(sFile.c_str())) rlm@1: { rlm@1: break; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnLoadGameMostRecent() rlm@1: { rlm@1: int iMostRecent = -1; rlm@1: time_t uiTimeMax; rlm@1: rlm@1: for (int i = 0; i < 10; i++) rlm@1: { rlm@1: if (! m_astGameSlot[i].m_bEmpty rlm@1: && (iMostRecent < 0 || m_astGameSlot[i].m_uiTime > uiTimeMax)) rlm@1: { rlm@1: iMostRecent = i; rlm@1: uiTimeMax = m_astGameSlot[i].m_uiTime; rlm@1: } rlm@1: } rlm@1: rlm@1: if (iMostRecent >= 0) rlm@1: { rlm@1: vOnLoadGame(iMostRecent + 1); rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnLoadGameAutoToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: m_poCoreConfig->vSetKey("load_game_auto", _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnLoadGame(int _iSlot) rlm@1: { rlm@1: int i = _iSlot - 1; rlm@1: if (! m_astGameSlot[i].m_bEmpty) rlm@1: { rlm@1: m_stEmulator.emuReadState(m_astGameSlot[i].m_sFile.c_str()); rlm@1: m_poFilePauseItem->set_active(false); rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnSaveGameOldest() rlm@1: { rlm@1: int iOldest = -1; rlm@1: time_t uiTimeMin; rlm@1: rlm@1: for (int i = 0; i < 10; i++) rlm@1: { rlm@1: if (! m_astGameSlot[i].m_bEmpty rlm@1: && (iOldest < 0 || m_astGameSlot[i].m_uiTime < uiTimeMin)) rlm@1: { rlm@1: iOldest = i; rlm@1: uiTimeMin = m_astGameSlot[i].m_uiTime; rlm@1: } rlm@1: } rlm@1: rlm@1: if (iOldest >= 0) rlm@1: { rlm@1: vOnSaveGame(iOldest + 1); rlm@1: } rlm@1: else rlm@1: { rlm@1: vOnSaveGame(1); rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnSaveGame(int _iSlot) rlm@1: { rlm@1: int i = _iSlot - 1; rlm@1: m_stEmulator.emuWriteState(m_astGameSlot[i].m_sFile.c_str()); rlm@1: vUpdateGameSlots(); rlm@1: } rlm@1: rlm@1: void Window::vOnFilePauseToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: m_bPaused = _poCMI->get_active(); rlm@1: if (emulating) rlm@1: { rlm@1: if (m_bPaused) rlm@1: { rlm@1: vStopEmu(); rlm@1: soundPause(); rlm@1: } rlm@1: else rlm@1: { rlm@1: vStartEmu(); rlm@1: soundResume(); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnFileReset() rlm@1: { rlm@1: if (emulating) rlm@1: { rlm@1: m_stEmulator.emuReset(true); rlm@1: m_poFilePauseItem->set_active(false); rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnRecentReset() rlm@1: { rlm@1: m_listHistory.clear(); rlm@1: vClearHistoryMenu(); rlm@1: } rlm@1: rlm@1: void Window::vOnRecentFreezeToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: m_poRecentResetItem->set_sensitive(! _poCMI->get_active()); rlm@1: m_poHistoryConfig->vSetKey("freeze", _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnRecentFile(std::string _sFile) rlm@1: { rlm@1: bLoadROM(_sFile); rlm@1: } rlm@1: rlm@1: void Window::vOnImportBatteryFile() rlm@1: { rlm@1: std::string BatteryDir = m_poDirConfig->sGetKey("batteries"); rlm@1: rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: Gtk::FileSelection oDialog(_("Import battery file")); rlm@1: oDialog.set_transient_for(*this); rlm@1: rlm@1: if (BatteryDir == "") rlm@1: { rlm@1: oDialog.set_filename(Glib::path_get_dirname(m_sRomFile) + "/"); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_filename(BatteryDir + "/"); rlm@1: } rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: Gtk::FileChooserDialog oDialog(*this, _("Import battery file")); rlm@1: oDialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); rlm@1: oDialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); rlm@1: rlm@1: if (BatteryDir == "") rlm@1: { rlm@1: oDialog.set_current_folder(Glib::path_get_dirname(m_sRomFile)); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_current_folder(BatteryDir); rlm@1: oDialog.add_shortcut_folder(BatteryDir); rlm@1: } rlm@1: rlm@1: Gtk::FileFilter oBatteryFilter; rlm@1: oBatteryFilter.set_name(_("Battery file")); rlm@1: oBatteryFilter.add_pattern("*.[sS][aA][vV]"); rlm@1: rlm@1: Gtk::FileFilter oFlashFilter; rlm@1: oFlashFilter.set_name(_("Flash save")); rlm@1: oFlashFilter.add_pattern("*.[dD][aA][tT]"); rlm@1: rlm@1: oDialog.add_filter(oBatteryFilter); rlm@1: oDialog.add_filter(oFlashFilter); rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: rlm@1: while (oDialog.run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: Gtk::MessageDialog oConfirmDialog(*this, rlm@1: _("Importing a battery file will erase any saved games and reset the emulator. Do you want to continue?"), rlm@1: #ifndef GTKMM20 rlm@1: false, rlm@1: #endif // ! GTKMM20 rlm@1: Gtk::MESSAGE_QUESTION, rlm@1: Gtk::BUTTONS_YES_NO); rlm@1: if (oConfirmDialog.run() != Gtk::RESPONSE_YES) rlm@1: { rlm@1: continue; rlm@1: } rlm@1: rlm@1: if (m_stEmulator.emuReadBattery(oDialog.get_filename().c_str())) rlm@1: { rlm@1: m_stEmulator.emuReset(false); rlm@1: break; rlm@1: } rlm@1: else rlm@1: { rlm@1: vPopupError(_("Failed to import battery file %s."), rlm@1: oDialog.get_filename().c_str()); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnExportBatteryFile() rlm@1: { rlm@1: std::string sBatteryDir = m_poDirConfig->sGetKey("batteries"); rlm@1: rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: Gtk::FileSelection oDialog(_("Export battery file")); rlm@1: oDialog.set_transient_for(*this); rlm@1: rlm@1: if (sBatteryDir == "") rlm@1: { rlm@1: oDialog.set_filename(sCutSuffix(m_sRomFile)); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_filename(sBatteryDir + "/" + rlm@1: sCutSuffix(Glib::path_get_basename(m_sRomFile))); rlm@1: } rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: Gtk::FileChooserDialog oDialog(*this, _("Export battery file"), rlm@1: Gtk::FILE_CHOOSER_ACTION_SAVE); rlm@1: oDialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); rlm@1: oDialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); rlm@1: rlm@1: if (sBatteryDir == "") rlm@1: { rlm@1: oDialog.set_current_folder(Glib::path_get_dirname(m_sRomFile)); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_current_folder(sBatteryDir); rlm@1: oDialog.add_shortcut_folder(sBatteryDir); rlm@1: } rlm@1: oDialog.set_current_name(sCutSuffix(Glib::path_get_basename(m_sRomFile))); rlm@1: rlm@1: Gtk::FileFilter oBatteryFilter; rlm@1: oBatteryFilter.set_name(_("Battery file")); rlm@1: oBatteryFilter.add_pattern("*.[sS][aA][vV]"); rlm@1: rlm@1: Gtk::FileFilter oFlashFilter; rlm@1: oFlashFilter.set_name(_("Flash save")); rlm@1: oFlashFilter.add_pattern("*.[dD][aA][tT]"); rlm@1: rlm@1: oDialog.add_filter(oBatteryFilter); rlm@1: oDialog.add_filter(oFlashFilter); rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: rlm@1: while (oDialog.run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: Glib::ustring sFile = oDialog.get_filename(); rlm@1: Glib::ustring sExt; rlm@1: rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: sExt = ".sav"; rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: if (oDialog.get_filter() == &oBatteryFilter) rlm@1: { rlm@1: sExt = ".sav"; rlm@1: } rlm@1: else rlm@1: { rlm@1: sExt = ".dat"; rlm@1: } rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: rlm@1: if (! bHasSuffix(sFile, sExt, false)) rlm@1: { rlm@1: sFile += sExt; rlm@1: } rlm@1: rlm@1: if (Glib::file_test(sFile, Glib::FILE_TEST_EXISTS)) rlm@1: { rlm@1: Gtk::MessageDialog oConfirmDialog(*this, rlm@1: _("File already exists. Overwrite it?"), rlm@1: #ifndef GTKMM20 rlm@1: false, rlm@1: #endif // ! GTKMM20 rlm@1: Gtk::MESSAGE_QUESTION, rlm@1: Gtk::BUTTONS_YES_NO); rlm@1: if (oConfirmDialog.run() != Gtk::RESPONSE_YES) rlm@1: { rlm@1: continue; rlm@1: } rlm@1: } rlm@1: rlm@1: bool bResult; rlm@1: if (m_eCartridge == CartridgeGB) rlm@1: { rlm@1: bResult = gbWriteBatteryFile(sFile.c_str(), false); rlm@1: } rlm@1: else rlm@1: { rlm@1: bResult = m_stEmulator.emuWriteBattery(sFile.c_str()); rlm@1: } rlm@1: rlm@1: if (bResult) rlm@1: { rlm@1: break; rlm@1: } rlm@1: else rlm@1: { rlm@1: vPopupError(_("Failed to export battery file %s."), rlm@1: sFile.c_str()); rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnFileScreenCapture() rlm@1: { rlm@1: std::string sCaptureDir = m_poDirConfig->sGetKey("captures"); rlm@1: rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: Gtk::FileSelection oDialog(_("Save screenshot")); rlm@1: oDialog.set_transient_for(*this); rlm@1: rlm@1: if (sCaptureDir == "") rlm@1: { rlm@1: oDialog.set_filename(sCutSuffix(m_sRomFile)); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_filename(sCaptureDir + "/" + rlm@1: sCutSuffix(Glib::path_get_basename(m_sRomFile))); rlm@1: } rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: Gtk::FileChooserDialog oDialog(*this, _("Save screenshot"), rlm@1: Gtk::FILE_CHOOSER_ACTION_SAVE); rlm@1: oDialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); rlm@1: oDialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK); rlm@1: rlm@1: if (sCaptureDir == "") rlm@1: { rlm@1: oDialog.set_current_folder(Glib::path_get_dirname(m_sRomFile)); rlm@1: } rlm@1: else rlm@1: { rlm@1: oDialog.set_current_folder(sCaptureDir); rlm@1: oDialog.add_shortcut_folder(sCaptureDir); rlm@1: } rlm@1: oDialog.set_current_name(sCutSuffix(Glib::path_get_basename(m_sRomFile))); rlm@1: rlm@1: Gtk::FileFilter oPngFilter; rlm@1: oPngFilter.set_name(_("PNG image")); rlm@1: oPngFilter.add_pattern("*.[pP][nN][gG]"); rlm@1: rlm@1: Gtk::FileFilter oBmpFilter; rlm@1: oBmpFilter.set_name(_("BMP image")); rlm@1: oBmpFilter.add_pattern("*.[bB][mM][pP]"); rlm@1: rlm@1: oDialog.add_filter(oPngFilter); rlm@1: oDialog.add_filter(oBmpFilter); rlm@1: rlm@1: if (m_poCoreConfig->sGetKey("screenshot_format") == "bmp") rlm@1: { rlm@1: oDialog.set_filter(oBmpFilter); rlm@1: } rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: rlm@1: while (oDialog.run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: Glib::ustring sFile = oDialog.get_filename(); rlm@1: Glib::ustring sExt; rlm@1: rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: sExt = "." + m_poCoreConfig->sGetKey("screenshot_format"); rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: if (oDialog.get_filter() == &oPngFilter) rlm@1: { rlm@1: sExt = ".png"; rlm@1: } rlm@1: else rlm@1: { rlm@1: sExt = ".bmp"; rlm@1: } rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: rlm@1: if (! bHasSuffix(sFile, sExt, false)) rlm@1: { rlm@1: sFile += sExt; rlm@1: } rlm@1: rlm@1: if (Glib::file_test(sFile, Glib::FILE_TEST_EXISTS)) rlm@1: { rlm@1: Gtk::MessageDialog oConfirmDialog(*this, rlm@1: _("File already exists. Overwrite it?"), rlm@1: #ifndef GTKMM20 rlm@1: false, rlm@1: #endif // ! GTKMM20 rlm@1: Gtk::MESSAGE_QUESTION, rlm@1: Gtk::BUTTONS_YES_NO); rlm@1: if (oConfirmDialog.run() != Gtk::RESPONSE_YES) rlm@1: { rlm@1: continue; rlm@1: } rlm@1: } rlm@1: rlm@1: bool bResult; rlm@1: if (sExt == ".png") rlm@1: { rlm@1: bResult = m_stEmulator.emuWritePNG(sFile.c_str()); rlm@1: } rlm@1: else rlm@1: { rlm@1: bResult = m_stEmulator.emuWriteBMP(sFile.c_str()); rlm@1: } rlm@1: rlm@1: if (bResult) rlm@1: { rlm@1: break; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnFileClose() rlm@1: { rlm@1: if (m_eCartridge != CartridgeNone) rlm@1: { rlm@1: soundPause(); rlm@1: vStopEmu(); rlm@1: vSetDefaultTitle(); rlm@1: vDrawDefaultScreen(); rlm@1: vSaveBattery(); rlm@1: m_stEmulator.emuCleanUp(); rlm@1: m_eCartridge = CartridgeNone; rlm@1: emulating = 0; rlm@1: rlm@1: vUpdateGameSlots(); rlm@1: rlm@1: for (std::list::iterator it = m_listSensitiveWhenPlaying.begin(); rlm@1: it != m_listSensitiveWhenPlaying.end(); rlm@1: it++) rlm@1: { rlm@1: (*it)->set_sensitive(false); rlm@1: } rlm@1: rlm@1: m_poFilePauseItem->set_active(false); rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnFileExit() rlm@1: { rlm@1: hide(); rlm@1: } rlm@1: rlm@1: void Window::vOnFrameskipToggled(Gtk::CheckMenuItem * _poCMI, int _iValue) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: if (_iValue >= 0 && _iValue <= 9) rlm@1: { rlm@1: m_poCoreConfig->vSetKey("frameskip", _iValue); rlm@1: gbFrameSkip = _iValue; rlm@1: systemFrameSkip = _iValue; rlm@1: m_bAutoFrameskip = false; rlm@1: } rlm@1: else rlm@1: { rlm@1: m_poCoreConfig->vSetKey("frameskip", "auto"); rlm@1: gbFrameSkip = 0; rlm@1: systemFrameSkip = 0; rlm@1: m_bAutoFrameskip = true; rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnThrottleToggled(Gtk::CheckMenuItem * _poCMI, int _iPercent) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: vSetThrottle(_iPercent); rlm@1: rlm@1: // Initialize the frameskip adjustment each time throttle is changed rlm@1: if (m_bAutoFrameskip) rlm@1: { rlm@1: systemFrameSkip = 0; rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnThrottleOther(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: Glib::RefPtr poXml; rlm@1: poXml = Xml::create(PKGDATADIR "/vba.glade", "ThrottleDialog"); rlm@1: rlm@1: Gtk::Dialog * poDialog = dynamic_cast(poXml->get_widget("ThrottleDialog")); rlm@1: Gtk::SpinButton * poSpin = dynamic_cast(poXml->get_widget("ThrottleSpin")); rlm@1: rlm@1: poDialog->set_transient_for(*this); rlm@1: rlm@1: if (m_iThrottle != 0) rlm@1: { rlm@1: poSpin->set_value(m_iThrottle); rlm@1: } rlm@1: else rlm@1: { rlm@1: poSpin->set_value(100); rlm@1: } rlm@1: rlm@1: if (poDialog->run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: vSetThrottle(poSpin->get_value_as_int()); rlm@1: } rlm@1: rlm@1: delete poDialog; rlm@1: vSelectBestThrottleItem(); rlm@1: } rlm@1: rlm@1: void Window::vOnVideoScaleToggled(Gtk::CheckMenuItem * _poCMI, int _iScale) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: m_poDisplayConfig->vSetKey("scale", _iScale); rlm@1: vUpdateScreen(); rlm@1: } rlm@1: rlm@1: void Window::vOnLayerToggled(Gtk::CheckMenuItem * _poCMI, int _iLayer) rlm@1: { rlm@1: int iMask = (0x0100 << _iLayer); rlm@1: if (_poCMI->get_active()) rlm@1: { rlm@1: layerSettings |= iMask; rlm@1: } rlm@1: else rlm@1: { rlm@1: layerSettings &= ~iMask; rlm@1: } rlm@1: layerEnable = DISPCNT & layerSettings; rlm@1: rlm@1: const char * acsLayers[] = rlm@1: { rlm@1: "layer_bg0", rlm@1: "layer_bg1", rlm@1: "layer_bg2", rlm@1: "layer_bg3", rlm@1: "layer_obj", rlm@1: "layer_win0", rlm@1: "layer_win1", rlm@1: "layer_objwin" rlm@1: }; rlm@1: m_poCoreConfig->vSetKey(acsLayers[_iLayer], _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnDirectories() rlm@1: { rlm@1: Glib::RefPtr poXml; rlm@1: poXml = Xml::create(PKGDATADIR "/vba.glade", "DirectoriesDialog"); rlm@1: rlm@1: struct rlm@1: { rlm@1: const char * m_csKey; rlm@1: const char * m_csEntry; rlm@1: const char * m_csResetButton; rlm@1: const char * m_csSelectButton; rlm@1: } rlm@1: astRow[] = rlm@1: { rlm@1: { "gba_roms", "GBARomsDirEntry", "GBARomsDirResetButton", "GBARomsDirSelectButton" }, rlm@1: { "gb_roms", "GBRomsDirEntry", "GBRomsDirResetButton", "GBRomsDirSelectButton" }, rlm@1: { "batteries", "BatteriesDirEntry", "BatteriesDirResetButton", "BatteriesDirSelectButton" }, rlm@1: { "saves", "SavesDirEntry", "SavesDirResetButton", "SavesDirSelectButton" }, rlm@1: { "captures", "CapturesDirEntry", "CapturesDirResetButton", "CapturesDirSelectButton" } rlm@1: }; rlm@1: rlm@1: for (guint i = 0; i < G_N_ELEMENTS(astRow); i++) rlm@1: { rlm@1: Gtk::Entry * poEntry = dynamic_cast(poXml->get_widget(astRow[i].m_csEntry)); rlm@1: Gtk::Button * poReset = dynamic_cast(poXml->get_widget(astRow[i].m_csResetButton)); rlm@1: Gtk::Button * poSelect = dynamic_cast(poXml->get_widget(astRow[i].m_csSelectButton)); rlm@1: rlm@1: poEntry->set_text(m_poDirConfig->sGetKey(astRow[i].m_csKey)); rlm@1: rlm@1: poReset->signal_clicked().connect(SigC::bind( rlm@1: SigC::slot(*this, &Window::vOnDirectoryReset), rlm@1: poEntry)); rlm@1: poSelect->signal_clicked().connect(SigC::bind( rlm@1: SigC::slot(*this, &Window::vOnDirectorySelect), rlm@1: poEntry)); rlm@1: } rlm@1: rlm@1: Gtk::Dialog * poDialog = dynamic_cast(poXml->get_widget("DirectoriesDialog")); rlm@1: poDialog->set_transient_for(*this); rlm@1: rlm@1: if (poDialog->run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: for (guint i = 0; i < G_N_ELEMENTS(astRow); i++) rlm@1: { rlm@1: Gtk::Entry * poEntry = dynamic_cast(poXml->get_widget(astRow[i].m_csEntry)); rlm@1: Glib::ustring sDir = poEntry->get_text(); rlm@1: if (! Glib::file_test(sDir, Glib::FILE_TEST_IS_DIR)) rlm@1: { rlm@1: sDir = ""; rlm@1: } rlm@1: m_poDirConfig->vSetKey(astRow[i].m_csKey, sDir); rlm@1: } rlm@1: rlm@1: // Needed if saves dir changed rlm@1: vUpdateGameSlots(); rlm@1: } rlm@1: rlm@1: delete poDialog; rlm@1: } rlm@1: rlm@1: void Window::vOnDirectoryReset(Gtk::Entry * _poEntry) rlm@1: { rlm@1: _poEntry->set_text(""); rlm@1: } rlm@1: rlm@1: void Window::vOnDirectorySelect(Gtk::Entry * _poEntry) rlm@1: { rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: Gtk::FileSelection oDialog(_("Select directory")); rlm@1: oDialog.set_transient_for(*this); rlm@1: rlm@1: if (_poEntry->get_text() != "") rlm@1: { rlm@1: oDialog.set_filename(_poEntry->get_text() + "/"); rlm@1: } rlm@1: rlm@1: if (oDialog.run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: std::string sFile = oDialog.get_filename(); rlm@1: if (! Glib::file_test(sFile, Glib::FILE_TEST_IS_DIR)) rlm@1: { rlm@1: sFile = Glib::path_get_dirname(sFile); rlm@1: } rlm@1: _poEntry->set_text(sFile); rlm@1: } rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: Gtk::FileChooserDialog oDialog(*this, _("Select directory"), rlm@1: Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER); rlm@1: oDialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); rlm@1: oDialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); rlm@1: rlm@1: if (_poEntry->get_text() != "") rlm@1: { rlm@1: oDialog.add_shortcut_folder(_poEntry->get_text()); rlm@1: oDialog.set_current_folder(_poEntry->get_text()); rlm@1: } rlm@1: rlm@1: if (oDialog.run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: _poEntry->set_text(oDialog.get_filename()); rlm@1: } rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: } rlm@1: rlm@1: void Window::vOnPauseWhenInactiveToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: m_poDisplayConfig->vSetKey("pause_when_inactive", _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnSelectBios() rlm@1: { rlm@1: #ifdef GTKMM20 rlm@1: rlm@1: Gtk::FileSelection oDialog(_("Select BIOS file")); rlm@1: oDialog.set_transient_for(*this); rlm@1: rlm@1: if (m_poCoreConfig->sGetKey("bios_file") != "") rlm@1: { rlm@1: oDialog.set_filename(m_poCoreConfig->sGetKey("bios_file")); rlm@1: } rlm@1: rlm@1: #else // ! GTKMM20 rlm@1: rlm@1: Gtk::FileChooserDialog oDialog(*this, _("Select BIOS file")); rlm@1: oDialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); rlm@1: oDialog.add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_OK); rlm@1: rlm@1: if (m_poCoreConfig->sGetKey("bios_file") != "") rlm@1: { rlm@1: oDialog.set_filename(m_poCoreConfig->sGetKey("bios_file")); rlm@1: } rlm@1: rlm@1: const char * acsPattern[] = rlm@1: { rlm@1: "*.[bB][iI][nN]", "*.[aA][gG][bB]", "*.[gG][bB][aA]", rlm@1: "*.[bB][iI][oO][sS]", "*.[zZ][iI][pP]", "*.[zZ]", "*.[gG][zZ]" rlm@1: }; rlm@1: rlm@1: Gtk::FileFilter oAllFilter; rlm@1: oAllFilter.set_name(_("All files")); rlm@1: oAllFilter.add_pattern("*"); rlm@1: rlm@1: Gtk::FileFilter oBiosFilter; rlm@1: oBiosFilter.set_name(_("Gameboy Advance BIOS")); rlm@1: for (guint i = 0; i < G_N_ELEMENTS(acsPattern); i++) rlm@1: { rlm@1: oBiosFilter.add_pattern(acsPattern[i]); rlm@1: } rlm@1: rlm@1: oDialog.add_filter(oAllFilter); rlm@1: oDialog.add_filter(oBiosFilter); rlm@1: rlm@1: oDialog.set_filter(oBiosFilter); rlm@1: rlm@1: #endif // ! GTKMM20 rlm@1: rlm@1: while (oDialog.run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: if (Glib::file_test(oDialog.get_filename(), Glib::FILE_TEST_IS_REGULAR)) rlm@1: { rlm@1: m_poCoreConfig->vSetKey("bios_file", oDialog.get_filename()); rlm@1: m_poUseBiosItem->set_sensitive(); rlm@1: break; rlm@1: } rlm@1: } rlm@1: } rlm@1: rlm@1: void Window::vOnUseBiosToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: m_poCoreConfig->vSetKey("use_bios_file", _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnShowSpeedToggled(Gtk::CheckMenuItem * _poCMI, int _iShowSpeed) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: m_eShowSpeed = (EShowSpeed)_iShowSpeed; rlm@1: if (m_eShowSpeed == ShowNone) rlm@1: { rlm@1: vSetDefaultTitle(); rlm@1: } rlm@1: m_poDisplayConfig->vSetKey("show_speed", _iShowSpeed); rlm@1: } rlm@1: rlm@1: void Window::vOnSaveTypeToggled(Gtk::CheckMenuItem * _poCMI, int _iSaveType) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: cpuSaveType = _iSaveType; rlm@1: m_poCoreConfig->vSetKey("save_type", _iSaveType); rlm@1: } rlm@1: rlm@1: void Window::vOnFlashSizeToggled(Gtk::CheckMenuItem * _poCMI, int _iFlashSize) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: if (_iFlashSize == 64) rlm@1: { rlm@1: flashSetSize(0x10000); rlm@1: } rlm@1: else rlm@1: { rlm@1: flashSetSize(0x20000); rlm@1: } rlm@1: m_poCoreConfig->vSetKey("flash_size", _iFlashSize); rlm@1: } rlm@1: rlm@1: void Window::vOnScreenshotFormatToggled(Gtk::CheckMenuItem * _poCMI, std::string _sFormat) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: m_poCoreConfig->vSetKey("screenshot_format", _sFormat); rlm@1: } rlm@1: rlm@1: void Window::vOnSoundStatusToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundStatus) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: std::string sSoundStatus; rlm@1: switch (_iSoundStatus) rlm@1: { rlm@1: case SoundOff: rlm@1: soundOffFlag = true; rlm@1: if (systemSoundOn) rlm@1: { rlm@1: soundShutdown(); rlm@1: } rlm@1: sSoundStatus = "off"; rlm@1: break; rlm@1: case SoundMute: rlm@1: soundDisableChannels(0x30f); rlm@1: sSoundStatus = "mute"; rlm@1: break; rlm@1: case SoundOn: rlm@1: if (soundOffFlag) rlm@1: { rlm@1: soundOffFlag = false; rlm@1: if (! soundInit()) rlm@1: { rlm@1: m_poSoundOffItem->set_active(); rlm@1: return; rlm@1: } rlm@1: } rlm@1: soundEnableChannels(0x30f); rlm@1: sSoundStatus = "on"; rlm@1: break; rlm@1: } rlm@1: m_poSoundConfig->vSetKey("status", sSoundStatus); rlm@1: } rlm@1: rlm@1: void Window::vOnSoundEchoToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: soundEcho = _poCMI->get_active(); rlm@1: m_poSoundConfig->vSetKey("echo", soundEcho); rlm@1: } rlm@1: rlm@1: void Window::vOnSoundLowPassToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: soundLowPass = _poCMI->get_active(); rlm@1: m_poSoundConfig->vSetKey("low_pass", soundLowPass); rlm@1: } rlm@1: rlm@1: void Window::vOnSoundReverseToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: soundReverse = _poCMI->get_active(); rlm@1: m_poSoundConfig->vSetKey("reverse_stereo", soundReverse); rlm@1: } rlm@1: rlm@1: void Window::vOnSoundChannelToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundChannel) rlm@1: { rlm@1: int iShift = _iSoundChannel; rlm@1: if (_iSoundChannel > 3) rlm@1: { rlm@1: iShift += 4; rlm@1: } rlm@1: int iFlag = 1 << iShift; rlm@1: int iActive = soundGetEnabledChannels() & 0x30f; rlm@1: if (_poCMI->get_active()) rlm@1: { rlm@1: iActive |= iFlag; rlm@1: } rlm@1: else rlm@1: { rlm@1: iActive &= ~iFlag; rlm@1: } rlm@1: soundEnableChannels(iActive); rlm@1: soundDisableChannels(~iActive & 0x30f); rlm@1: rlm@1: const char * acsChannels[] = rlm@1: { rlm@1: "channel_1", rlm@1: "channel_2", rlm@1: "channel_3", rlm@1: "channel_4", rlm@1: "channel_A", rlm@1: "channel_B" rlm@1: }; rlm@1: m_poSoundConfig->vSetKey(acsChannels[_iSoundChannel], _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnSoundQualityToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundQuality) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: m_eSoundQuality = (ESoundQuality)_iSoundQuality; rlm@1: if (m_eCartridge == CartridgeGBA) rlm@1: { rlm@1: soundSetQuality(_iSoundQuality); rlm@1: } rlm@1: else if (m_eCartridge == CartridgeGB) rlm@1: { rlm@1: gbSoundSetQuality(_iSoundQuality); rlm@1: } rlm@1: m_poSoundConfig->vSetKey("quality", _iSoundQuality); rlm@1: } rlm@1: rlm@1: void Window::vOnSoundVolumeToggled(Gtk::CheckMenuItem * _poCMI, int _iSoundVolume) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: soundVolume = _iSoundVolume; rlm@1: m_poSoundConfig->vSetKey("volume", _iSoundVolume); rlm@1: } rlm@1: rlm@1: void Window::vOnGBBorderToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: gbBorderOn = _poCMI->get_active(); rlm@1: if (emulating && m_eCartridge == CartridgeGB && _poCMI->get_active()) rlm@1: { rlm@1: gbSgbRenderBorder(); rlm@1: } rlm@1: vUpdateScreen(); rlm@1: m_poCoreConfig->vSetKey("gb_border", _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnGBPrinterToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: if (_poCMI->get_active()) rlm@1: { rlm@1: gbSerialFunction = gbPrinterSend; rlm@1: } rlm@1: else rlm@1: { rlm@1: gbSerialFunction = NULL; rlm@1: } rlm@1: m_poCoreConfig->vSetKey("gb_printer", _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnEmulatorTypeToggled(Gtk::CheckMenuItem * _poCMI, int _iEmulatorType) rlm@1: { rlm@1: gbEmulatorType = _iEmulatorType; rlm@1: m_poCoreConfig->vSetKey("emulator_type", _iEmulatorType); rlm@1: } rlm@1: rlm@1: void Window::vOnFilter2xToggled(Gtk::CheckMenuItem * _poCMI, int _iFilter2x) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: m_poScreenArea->vSetFilter2x((EFilter2x)_iFilter2x); rlm@1: if (emulating) rlm@1: { rlm@1: vDrawScreen(); rlm@1: } rlm@1: m_poDisplayConfig->vSetKey("filter2x", _iFilter2x); rlm@1: } rlm@1: rlm@1: void Window::vOnFilterIBToggled(Gtk::CheckMenuItem * _poCMI, int _iFilterIB) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: m_poScreenArea->vSetFilterIB((EFilterIB)_iFilterIB); rlm@1: if (emulating) rlm@1: { rlm@1: vDrawScreen(); rlm@1: } rlm@1: m_poDisplayConfig->vSetKey("filterIB", _iFilterIB); rlm@1: } rlm@1: rlm@1: #ifdef MMX rlm@1: void Window::vOnDisableMMXToggled(Gtk::CheckMenuItem * _poCMI) rlm@1: { rlm@1: cpu_mmx = ! _poCMI->get_active(); rlm@1: m_poDisplayConfig->vSetKey("filter_disable_mmx", _poCMI->get_active()); rlm@1: } rlm@1: #endif // MMX rlm@1: rlm@1: void Window::vOnJoypadConfigure(int _iJoypad) rlm@1: { rlm@1: Glib::RefPtr poXml; rlm@1: poXml = Xml::create(PKGDATADIR "/vba.glade", "JoypadConfigDialog"); rlm@1: rlm@1: JoypadConfigDialog * poDialog = NULL; rlm@1: poXml->get_widget_derived("JoypadConfigDialog", poDialog); rlm@1: poDialog->set_transient_for(*this); rlm@1: poDialog->vSetConfig(m_oJoypads[_iJoypad - 1]); rlm@1: rlm@1: if (poDialog->run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: m_oJoypads[_iJoypad - 1] = poDialog->stGetConfig(); rlm@1: if (_iJoypad == m_poInputConfig->oGetKey("active_joypad")) rlm@1: { rlm@1: if (m_poKeymap != NULL) rlm@1: { rlm@1: delete m_poKeymap; rlm@1: } rlm@1: m_poKeymap = m_oJoypads[_iJoypad - 1].poCreateKeymap(); rlm@1: } rlm@1: } rlm@1: rlm@1: delete poDialog; rlm@1: } rlm@1: rlm@1: void Window::vOnJoypadToggled(Gtk::CheckMenuItem * _poCMI, int _iJoypad) rlm@1: { rlm@1: if (! _poCMI->get_active()) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: if (m_poKeymap != NULL) rlm@1: { rlm@1: delete m_poKeymap; rlm@1: } rlm@1: m_poKeymap = m_oJoypads[_iJoypad - 1].poCreateKeymap(); rlm@1: rlm@1: m_poInputConfig->vSetKey("active_joypad", _iJoypad); rlm@1: } rlm@1: rlm@1: void Window::vOnAutofireToggled(Gtk::CheckMenuItem * _poCMI, u32 _uiKeyFlag) rlm@1: { rlm@1: if (_poCMI->get_active()) rlm@1: { rlm@1: m_uiAutofireState |= _uiKeyFlag; rlm@1: } rlm@1: else rlm@1: { rlm@1: m_uiAutofireState &= ~_uiKeyFlag; rlm@1: } rlm@1: rlm@1: std::string sKey; rlm@1: if (_uiKeyFlag == KeyFlagA) rlm@1: { rlm@1: sKey = "autofire_A"; rlm@1: } rlm@1: else if (_uiKeyFlag == KeyFlagB) rlm@1: { rlm@1: sKey = "autofire_B"; rlm@1: } rlm@1: else if (_uiKeyFlag == KeyFlagL) rlm@1: { rlm@1: sKey = "autofire_L"; rlm@1: } rlm@1: else if (_uiKeyFlag == KeyFlagR) rlm@1: { rlm@1: sKey = "autofire_R"; rlm@1: } rlm@1: m_poInputConfig->vSetKey(sKey, _poCMI->get_active()); rlm@1: } rlm@1: rlm@1: void Window::vOnGDBWait() rlm@1: { rlm@1: Glib::RefPtr poXml; rlm@1: poXml = Xml::create(PKGDATADIR "/vba.glade", "TcpPortDialog"); rlm@1: rlm@1: Gtk::Dialog * poDialog = dynamic_cast(poXml->get_widget("TcpPortDialog")); rlm@1: Gtk::SpinButton * poSpin = dynamic_cast(poXml->get_widget("TcpPortSpin")); rlm@1: rlm@1: poDialog->set_transient_for(*this); rlm@1: rlm@1: int iPort = 55555; rlm@1: poSpin->set_value(iPort); rlm@1: rlm@1: bool bOk = false; rlm@1: if (poDialog->run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: bOk = true; rlm@1: iPort = poSpin->get_value_as_int(); rlm@1: } rlm@1: delete poDialog; rlm@1: rlm@1: if (! bOk) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: m_eCartridge = CartridgeGBA; rlm@1: m_sRomFile = "gnu_stub"; rlm@1: m_stEmulator = GBASystem; rlm@1: rlm@1: rom = (u8 *) malloc(0x2000000); rlm@1: workRAM = (u8 *) calloc(1, 0x40000); rlm@1: bios = (u8 *) calloc(1, 0x4000); rlm@1: internalRAM = (u8 *) calloc(1, 0x8000); rlm@1: paletteRAM = (u8 *) calloc(1, 0x400); rlm@1: vram = (u8 *) calloc(1, 0x20000); rlm@1: oam = (u8 *) calloc(1, 0x400); rlm@1: pix = (u8 *) calloc(1, 4 * m_iGBAScreenWidth * m_iGBAScreenHeight); rlm@1: ioMem = (u8 *) calloc(1, 0x400); rlm@1: rlm@1: useBios = m_poCoreConfig->oGetKey("use_bios_file"); rlm@1: //CPUInit(m_poCoreConfig->sGetKey("bios_file").c_str(), useBios); rlm@1: CPUInit(); rlm@1: CPUReset(); rlm@1: rlm@1: for (std::list::iterator it = m_listSensitiveWhenPlaying.begin(); rlm@1: it != m_listSensitiveWhenPlaying.end(); rlm@1: it++) rlm@1: { rlm@1: (*it)->set_sensitive(); rlm@1: } rlm@1: rlm@1: if (m_poCoreConfig->oGetKey("load_game_auto")) rlm@1: { rlm@1: vOnLoadGameMostRecent(); rlm@1: } rlm@1: rlm@1: vStartEmu(); rlm@1: rlm@1: emulating = 1; rlm@1: rlm@1: dbgMain = remoteStubMain; rlm@1: dbgSignal = remoteStubSignal; rlm@1: dbgOutput = remoteOutput; rlm@1: debugger = true; rlm@1: rlm@1: remoteSetProtocol(0); rlm@1: remoteSetPort(iPort); rlm@1: remoteInit(); rlm@1: } rlm@1: rlm@1: void Window::vOnGDBLoadAndWait() rlm@1: { rlm@1: bool bLoaded = false; rlm@1: rlm@1: while (m_poFileOpenDialog->run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: if (bLoadROM(m_poFileOpenDialog->get_filename())) rlm@1: { rlm@1: bLoaded = true; rlm@1: break; rlm@1: } rlm@1: } rlm@1: m_poFileOpenDialog->hide(); rlm@1: rlm@1: if (! bLoaded) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: if (m_eCartridge != CartridgeGBA) rlm@1: { rlm@1: vPopupError(_("Only GBA images are supported.")); rlm@1: vOnFileClose(); rlm@1: return; rlm@1: } rlm@1: rlm@1: Glib::RefPtr poXml; rlm@1: poXml = Xml::create(PKGDATADIR "/vba.glade", "TcpPortDialog"); rlm@1: rlm@1: Gtk::Dialog * poDialog = dynamic_cast(poXml->get_widget("TcpPortDialog")); rlm@1: Gtk::SpinButton * poSpin = dynamic_cast(poXml->get_widget("TcpPortSpin")); rlm@1: rlm@1: poDialog->set_transient_for(*this); rlm@1: rlm@1: int iPort = 55555; rlm@1: poSpin->set_value(iPort); rlm@1: rlm@1: bool bOk = false; rlm@1: if (poDialog->run() == Gtk::RESPONSE_OK) rlm@1: { rlm@1: bOk = true; rlm@1: iPort = poSpin->get_value_as_int(); rlm@1: } rlm@1: delete poDialog; rlm@1: rlm@1: if (! bOk) rlm@1: { rlm@1: return; rlm@1: } rlm@1: rlm@1: dbgMain = remoteStubMain; rlm@1: dbgSignal = remoteStubSignal; rlm@1: dbgOutput = remoteOutput; rlm@1: debugger = true; rlm@1: rlm@1: remoteSetProtocol(0); rlm@1: remoteSetPort(iPort); rlm@1: remoteInit(); rlm@1: } rlm@1: rlm@1: void Window::vOnGDBBreak() rlm@1: { rlm@1: if (armState) rlm@1: { rlm@1: armNextPC -= 4; rlm@1: reg[15].I -= 4; rlm@1: } rlm@1: else rlm@1: { rlm@1: armNextPC -= 2; rlm@1: reg[15].I -= 2; rlm@1: } rlm@1: rlm@1: debugger = true; rlm@1: } rlm@1: rlm@1: void Window::vOnGDBDisconnect() rlm@1: { rlm@1: remoteCleanUp(); rlm@1: debugger = false; rlm@1: } rlm@1: rlm@1: void Window::vOnHelpAbout() rlm@1: { rlm@1: Glib::RefPtr poXml; rlm@1: poXml = Xml::create(PKGDATADIR "/vba.glade", "AboutDialog"); rlm@1: rlm@1: Gtk::Dialog * poDialog = dynamic_cast(poXml->get_widget("AboutDialog")); rlm@1: poDialog->set_transient_for(*this); rlm@1: rlm@1: Gtk::Image oIcon(PKGDATADIR "/vba-64.png"); rlm@1: oIcon.show(); rlm@1: Gtk::Container * poIconContainer = dynamic_cast(poXml->get_widget("AboutIconContainer")); rlm@1: poIconContainer->add(oIcon); rlm@1: rlm@1: Gtk::Label * poLabel = dynamic_cast(poXml->get_widget("VersionLabel")); rlm@1: poLabel->set_markup("" PACKAGE " " VERSION ""); rlm@1: rlm@1: poDialog->run(); rlm@1: delete poDialog; rlm@1: } rlm@1: rlm@1: bool Window::bOnEmuIdle() rlm@1: { rlm@1: if (debugger && m_stEmulator.emuHasDebugger) rlm@1: { rlm@1: dbgMain(); rlm@1: return true; rlm@1: } rlm@1: rlm@1: if (m_uiThrottleDelay != 0) rlm@1: { rlm@1: u32 uiTime = SDL_GetTicks(); rlm@1: if (uiTime - m_uiThrottleLastTime >= m_uiThrottleDelay) rlm@1: { rlm@1: m_uiThrottleDelay = 0; rlm@1: m_uiThrottleLastTime = uiTime; rlm@1: } rlm@1: else rlm@1: { rlm@1: return true; rlm@1: } rlm@1: } rlm@1: rlm@1: m_stEmulator.emuMain(m_stEmulator.emuCount); rlm@1: return true; rlm@1: } rlm@1: rlm@1: bool Window::on_focus_in_event(GdkEventFocus * _pstEvent) rlm@1: { rlm@1: if (emulating rlm@1: && ! m_bPaused rlm@1: && m_poDisplayConfig->oGetKey("pause_when_inactive")) rlm@1: { rlm@1: vStartEmu(); rlm@1: soundResume(); rlm@1: } rlm@1: return false; rlm@1: } rlm@1: rlm@1: bool Window::on_focus_out_event(GdkEventFocus * _pstEvent) rlm@1: { rlm@1: if (emulating rlm@1: && ! m_bPaused rlm@1: && m_poDisplayConfig->oGetKey("pause_when_inactive")) rlm@1: { rlm@1: vStopEmu(); rlm@1: soundPause(); rlm@1: } rlm@1: return false; rlm@1: } rlm@1: rlm@1: bool Window::on_key_press_event(GdkEventKey * _pstEvent) rlm@1: { rlm@1: EKey eKey; rlm@1: rlm@1: if ((_pstEvent->state & Gtk::AccelGroup::get_default_mod_mask()) rlm@1: || (eKey = m_poKeymap->eGetKey(_pstEvent->hardware_keycode)) == KeyNone) rlm@1: { rlm@1: return Gtk::Window::on_key_press_event(_pstEvent); rlm@1: } rlm@1: rlm@1: switch (eKey) rlm@1: { rlm@1: case KeyA: rlm@1: m_uiJoypadState |= KeyFlagA; rlm@1: break; rlm@1: case KeyB: rlm@1: m_uiJoypadState |= KeyFlagB; rlm@1: break; rlm@1: case KeySelect: rlm@1: m_uiJoypadState |= KeyFlagSelect; rlm@1: break; rlm@1: case KeyStart: rlm@1: m_uiJoypadState |= KeyFlagStart; rlm@1: break; rlm@1: case KeyRight: rlm@1: m_uiJoypadState |= KeyFlagRight; rlm@1: m_uiJoypadState &= ~KeyFlagLeft; rlm@1: break; rlm@1: case KeyLeft: rlm@1: m_uiJoypadState |= KeyFlagLeft; rlm@1: m_uiJoypadState &= ~KeyFlagRight; rlm@1: break; rlm@1: case KeyUp: rlm@1: m_uiJoypadState |= KeyFlagUp; rlm@1: m_uiJoypadState &= ~KeyFlagDown; rlm@1: break; rlm@1: case KeyDown: rlm@1: m_uiJoypadState |= KeyFlagDown; rlm@1: m_uiJoypadState &= ~KeyFlagUp; rlm@1: break; rlm@1: case KeyR: rlm@1: m_uiJoypadState |= KeyFlagR; rlm@1: break; rlm@1: case KeyL: rlm@1: m_uiJoypadState |= KeyFlagL; rlm@1: break; rlm@1: case KeySpeed: rlm@1: m_uiJoypadState |= KeyFlagSpeed; rlm@1: break; rlm@1: case KeyCapture: rlm@1: m_uiJoypadState |= KeyFlagCapture; rlm@1: break; rlm@1: case KeyNone: rlm@1: break; rlm@1: } rlm@1: return true; rlm@1: } rlm@1: rlm@1: bool Window::on_key_release_event(GdkEventKey * _pstEvent) rlm@1: { rlm@1: EKey eKey; rlm@1: rlm@1: if ((_pstEvent->state & Gtk::AccelGroup::get_default_mod_mask()) rlm@1: || (eKey = m_poKeymap->eGetKey(_pstEvent->hardware_keycode)) == KeyNone) rlm@1: { rlm@1: return Gtk::Window::on_key_release_event(_pstEvent); rlm@1: } rlm@1: rlm@1: switch (eKey) rlm@1: { rlm@1: case KeyA: rlm@1: m_uiJoypadState &= ~KeyFlagA; rlm@1: break; rlm@1: case KeyB: rlm@1: m_uiJoypadState &= ~KeyFlagB; rlm@1: break; rlm@1: case KeySelect: rlm@1: m_uiJoypadState &= ~KeyFlagSelect; rlm@1: break; rlm@1: case KeyStart: rlm@1: m_uiJoypadState &= ~KeyFlagStart; rlm@1: break; rlm@1: case KeyRight: rlm@1: m_uiJoypadState &= ~KeyFlagRight; rlm@1: break; rlm@1: case KeyLeft: rlm@1: m_uiJoypadState &= ~KeyFlagLeft; rlm@1: break; rlm@1: case KeyUp: rlm@1: m_uiJoypadState &= ~KeyFlagUp; rlm@1: break; rlm@1: case KeyDown: rlm@1: m_uiJoypadState &= ~KeyFlagDown; rlm@1: break; rlm@1: case KeyR: rlm@1: m_uiJoypadState &= ~KeyFlagR; rlm@1: break; rlm@1: case KeyL: rlm@1: m_uiJoypadState &= ~KeyFlagL; rlm@1: break; rlm@1: case KeySpeed: rlm@1: m_uiJoypadState &= ~KeyFlagSpeed; rlm@1: break; rlm@1: case KeyCapture: rlm@1: m_uiJoypadState &= ~KeyFlagCapture; rlm@1: break; rlm@1: case KeyNone: rlm@1: break; rlm@1: } rlm@1: return true; rlm@1: } rlm@1: rlm@1: } // namespace VBA