diff --git a/desmume/src/common.cpp b/desmume/src/common.cpp index fedd23a22..e5cc3e5f8 100644 --- a/desmume/src/common.cpp +++ b/desmume/src/common.cpp @@ -37,56 +37,6 @@ u8 logo_data[156] = { 0x78,0x00,0x90,0xCB,0x88,0x11,0x3A,0x94,0x65,0xC0,0x7C,0x63,0x87,0xF0,0x3C,0xAF, 0xD6,0x25,0xE4,0x8B,0x38,0x0A,0xAC,0x72,0x21,0xD4,0xF8,0x07}; -#ifdef WIN32 -char IniName[MAX_PATH]; - -void GetINIPath() -{ - char vPath[MAX_PATH], *szPath; - /*if (*vPath) - szPath = vPath; - else - {*/ - char *p; - ZeroMemory(vPath, sizeof(vPath)); - GetModuleFileName(NULL, vPath, sizeof(vPath)); - p = vPath + lstrlen(vPath); - while (p >= vPath && *p != '\\') p--; - if (++p >= vPath) *p = 0; - szPath = vPath; - //} - if (strlen(szPath) + strlen("\\desmume.ini") < MAX_PATH) - { - sprintf(IniName, "%s\\desmume.ini",szPath); - } else if (MAX_PATH> strlen(".\\desmume.ini")) { - sprintf(IniName, ".\\desmume.ini"); - } else - { - memset(IniName,0,MAX_PATH) ; - } -} - -void WritePrivateProfileBool(char* appname, char* keyname, bool val, char* file) -{ - char temp[256] = ""; - sprintf(temp, "%d", val?1:0); - WritePrivateProfileString(appname, keyname, temp, file); -} - -bool GetPrivateProfileBool(const char* appname, const char* keyname, bool defval, const char* filename) -{ - return GetPrivateProfileInt(appname,keyname,defval?1:0,filename) != 0; -} - -void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file) -{ - char temp[256] = ""; - sprintf(temp, "%d", val); - WritePrivateProfileString(appname, keyname, temp, file); -} - -#endif - u8 reverseBitsInByte(u8 x) { u8 h = 0; diff --git a/desmume/src/common.h b/desmume/src/common.h index b559dfaeb..818f73ab4 100644 --- a/desmume/src/common.h +++ b/desmume/src/common.h @@ -34,33 +34,7 @@ extern u8 logo_data[156]; #include #include - #define IDT_VIEW_DISASM7 50001 - #define IDT_VIEW_DISASM9 50002 - #define IDT_VIEW_MEM7 50003 - #define IDT_VIEW_MEM9 50004 - #define IDT_VIEW_IOREG 50005 - #define IDT_VIEW_PAL 50006 - #define IDT_VIEW_TILE 50007 - #define IDT_VIEW_MAP 50008 - #define IDT_VIEW_OAM 50009 - #define IDT_VIEW_MATRIX 50010 - #define IDT_VIEW_LIGHTS 50011 - #define IDM_EXEC 50112 - - #define IDM_RECENT_RESERVED0 65500 - #define IDM_RECENT_RESERVED1 65501 - #define IDM_RECENT_RESERVED2 65502 - #define IDM_RECENT_RESERVED3 65503 - #define IDM_RECENT_RESERVED4 65504 - #define IDM_RECENT_RESERVED5 65505 - #define IDM_RECENT_RESERVED6 65506 - #define IDM_RECENT_RESERVED7 65507 - #define IDM_RECENT_RESERVED8 65508 - #define IDM_RECENT_RESERVED9 65509 - #define IDM_RECENT_RESERVED10 65510 - #define IDM_RECENT_RESERVED11 65511 - #define IDM_RECENT_RESERVED12 65512 - #define IDM_RECENT_RESERVED13 65513 + #define CLASSNAME "DeSmuME" diff --git a/desmume/src/gfx3d.cpp b/desmume/src/gfx3d.cpp index e52ba1502..0416edc86 100644 --- a/desmume/src/gfx3d.cpp +++ b/desmume/src/gfx3d.cpp @@ -1,7 +1,5 @@ -/* Copyright (C) 2006 yopyop - yopyop156@ifrance.com - yopyop156.ifrance.com - +/* gfx3d.cpp + Copyright (C) 2006 yopyop Copyright (C) 2008-2009 DeSmuME team This file is part of DeSmuME diff --git a/desmume/src/saves.cpp b/desmume/src/saves.cpp index 31fc47a5c..f3aa50c65 100644 --- a/desmume/src/saves.cpp +++ b/desmume/src/saves.cpp @@ -64,11 +64,6 @@ static const char* magic = "DeSmuME SState\0"; //a savestate chunk loader can set this if it wants to permit a silent failure (for compatibility) static bool SAV_silent_fail_flag; -#ifndef MAX_PATH -#define MAX_PATH 256 -#endif - - SFORMAT SF_ARM7[]={ { "7INS", 4, 1, &NDS_ARM7.instruction }, { "7INA", 4, 1, &NDS_ARM7.instruct_adr }, diff --git a/desmume/src/windows/CWindow.cpp b/desmume/src/windows/CWindow.cpp index 23e121f34..ddced281b 100644 --- a/desmume/src/windows/CWindow.cpp +++ b/desmume/src/windows/CWindow.cpp @@ -336,7 +336,7 @@ void WINCLASS::setMinSize(int width, int height) minHeight = height; } -void MyAdjustWindowRectEx(RECT* rect, HWND hwnd) +static void MyAdjustWindowRectEx(RECT* rect, HWND hwnd) { AdjustWindowRectEx(rect,GetWindowStyle(hwnd),TRUE,GetWindowExStyle(hwnd)); @@ -363,18 +363,6 @@ void WINCLASS::sizingMsg(WPARAM wParam, LPARAM lParam, LONG keepRatio) int _minWidth, _minHeight; - int xborder, yborder; - int ymenu, ymenunew; - int ycaption; - - MENUBARINFO mbi; - - /* Get the size of the menu bar */ - ZeroMemory(&mbi, sizeof(mbi)); - mbi.cbSize = sizeof(mbi); - GetMenuBarInfo(hwnd, OBJID_MENU, 0, &mbi); - ymenu = (mbi.rcBar.bottom - mbi.rcBar.top + 1); - RECT adjr; SetRect(&adjr,0,0,minWidth,minHeight); MyAdjustWindowRectEx(&adjr,hwnd); @@ -389,7 +377,6 @@ void WINCLASS::sizingMsg(WPARAM wParam, LPARAM lParam, LONG keepRatio) _minWidth = adjr.right-adjr.left; _minHeight = adjr.bottom-adjr.top; - /* Clamp the size to the minimum size (256x384) */ rect->right = (rect->left + std::max(_minWidth, (int)(rect->right - rect->left))); rect->bottom = (rect->top + std::max(_minHeight, (int)(rect->bottom - rect->top))); @@ -439,15 +426,6 @@ void WINCLASS::sizingMsg(WPARAM wParam, LPARAM lParam, LONG keepRatio) } } - /* Check if the height of the menu has changed during the resize */ - ZeroMemory(&mbi, sizeof(mbi)); - mbi.cbSize = sizeof(mbi); - GetMenuBarInfo(hwnd, OBJID_MENU, 0, &mbi); - ymenunew = (mbi.rcBar.bottom - mbi.rcBar.top + 1); - - if(ymenunew != ymenu) - rect->bottom += (ymenunew - ymenu); - // prevent "pushing" the window across the screen when resizing from the left or top if(wParam == WMSZ_LEFT || wParam == WMSZ_TOPLEFT || wParam == WMSZ_BOTTOMLEFT) { diff --git a/desmume/src/windows/DeSmuME_2005.vcproj b/desmume/src/windows/DeSmuME_2005.vcproj index 8f7872ba8..fc33eef94 100644 --- a/desmume/src/windows/DeSmuME_2005.vcproj +++ b/desmume/src/windows/DeSmuME_2005.vcproj @@ -846,6 +846,14 @@ RelativePath=".\ramwatch.h" > + + + + @@ -898,6 +906,14 @@ RelativePath=".\windriver.h" > + + + + diff --git a/desmume/src/windows/DeSmuME_2008.vcproj b/desmume/src/windows/DeSmuME_2008.vcproj index 0af7adec3..2dad57227 100644 --- a/desmume/src/windows/DeSmuME_2008.vcproj +++ b/desmume/src/windows/DeSmuME_2008.vcproj @@ -1304,14 +1304,6 @@ RelativePath=".\gbaslot_config.h" > - - - - @@ -1364,6 +1356,14 @@ RelativePath=".\pathsettings.h" > + + + + @@ -1392,6 +1392,14 @@ RelativePath=".\throttle.h" > + + + + @@ -1443,6 +1451,14 @@ RelativePath=".\disView.h" > + + + + diff --git a/desmume/src/windows/disView.cpp b/desmume/src/windows/disView.cpp index 842b8f529..ebe0425d7 100644 --- a/desmume/src/windows/disView.cpp +++ b/desmume/src/windows/disView.cpp @@ -28,6 +28,7 @@ #include "disView.h" #include #include "resource.h" +#include "main.h" typedef struct { diff --git a/desmume/src/windows/lightView.cpp b/desmume/src/windows/lightView.cpp index ca6e778c2..0f04ec817 100644 --- a/desmume/src/windows/lightView.cpp +++ b/desmume/src/windows/lightView.cpp @@ -23,6 +23,7 @@ #include "gfx3d.h" #include "resource.h" #include "debug.h" +#include "main.h" // Convert B5G5R5 color format into R8G8B8 color format unsigned int ColorConv_B5R5R5ToR8G8B8(const unsigned int color) diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index 66e82faab..0ce2d5c09 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -24,32 +24,69 @@ // RGB(246, 246, 251) to RGB(128, 128, 192) #include "windriver.h" + #include -#include -#include +#include +#include +//#include + #include #include #include +#include +#include +#include #include #include -#include -#include -#include -#include #include -#include "gthread.h" -#include "version.h" -#include "CWindow.h" + +#include + +//emulator core +#include "../common.h" //wtf this needs to disappear #include "../MMU.h" #include "../armcpu.h" #include "../NDSSystem.h" #include "../debug.h" #include "../saves.h" #include "../addons.h" +#include "../GPU_osd.h" +#include "../OGLRender.h" +#include "../rasterize.h" +#include "../gfx3d.h" +#include "../render3D.h" +#include "../gdbstub.h" +#include "../cheatSystem.h" +#include "../mic.h" +#include "../movie.h" +#include "../firmware.h" +#include "../lua-engine.h" +#include "../path.h" + +//other random stuff +#include "recentroms.h" +#include "main.h" #include "resource.h" -#include "GPU_osd.h" -#include "memView.h" -#include "disView.h" +#include "CWindow.h" +#include "gthread.h" +#include "version.h" +#include "inputdx.h" +#include "console.h" +#include "throttle.h" +#include "hotkey.h" +#include "snddx.h" +#include "commandline.h" +#include "7zip.h" +#include "OpenArchive.h" +#include "utils/xstring.h" +#include "directx/ddraw.h" +#include "video.h" +#include "aggdraw.h" +#include "agg2d.h" + +//tools and dialogs +#include "pathsettings.h" +#include "colorctrl.h" #include "ginfo.h" #include "IORegView.h" #include "palView.h" @@ -58,44 +95,17 @@ #include "mapview.h" #include "matrixview.h" #include "lightview.h" -#include "inputdx.h" -#include "FirmConfig.h" -#include "AboutBox.h" -#include "OGLRender.h" -#include "rasterize.h" -#include "../gfx3d.h" -#include "../render3D.h" -#include "../gdbstub.h" -#include "colorctrl.h" -#include "console.h" -#include "throttle.h" #include "gbaslot_config.h" #include "cheatsWin.h" -#include "../cheatSystem.h" -#include "Mmsystem.h" -#include "../mic.h" -#include "../common.h" -#include "main.h" -#include "hotkey.h" -#include "../movie.h" -#include "../replay.h" -#include "snddx.h" +#include "memView.h" +#include "disView.h" +#include "FirmConfig.h" +#include "AboutBox.h" +#include "replay.h" #include "ramwatch.h" #include "ram_search.h" #include "aviout.h" #include "soundView.h" -#include "commandline.h" -#include "../lua-engine.h" -#include "7zip.h" -#include "pathsettings.h" -#include "utils/xstring.h" -#include "directx/ddraw.h" -#include "video.h" -#include "path.h" -#include "../firmware.h" - -#include "aggdraw.h" -#include "agg2d.h" using namespace std; @@ -164,18 +174,11 @@ static BOOL OpenCore(const char* filename); BOOL Mic_DeInit_Physical(); BOOL Mic_Init_Physical(); -//----Recent ROMs menu globals---------- -vector RecentRoms; //The list of recent ROM filenames -const unsigned int MAX_RECENT_ROMS = 10; //To change the recent rom max, simply change this number -const unsigned int clearid = IDM_RECENT_RESERVED0; // ID for the Clear recent ROMs item -const unsigned int baseid = IDM_RECENT_RESERVED1; //Base identifier for the recent ROMs items -static HMENU recentromsmenu; //Handle to the recent ROMs submenu -//-------------------------------------- static bool _cheatsDisabled = false; void UpdateHotkeyAssignments(); //Appends hotkey mappings to corresponding menu items -static HMENU mainMenu; //Holds handle to the main DeSmuME menu +HMENU mainMenu; //Holds handle to the main DeSmuME menu DWORD hKeyInputTimer; @@ -661,197 +664,7 @@ static void SetStyle(u32 dws) static u32 GetStyle() { return currWindowStyle; } //--------- -void UpdateRecentRomsMenu() -{ - //This function will be called to populate the Recent Menu - //The array must be in the proper order ahead of time - //UpdateRecentRoms will always call this - //This will be always called by GetRecentRoms on DesMume startup - - - //---------------------------------------------------------------------- - //Get Menu item info - - MENUITEMINFO moo; - moo.cbSize = sizeof(moo); - moo.fMask = MIIM_SUBMENU | MIIM_STATE; - - GetMenuItemInfo(GetSubMenu(mainMenu, 0), ID_FILE_RECENTROM, FALSE, &moo); - moo.hSubMenu = GetSubMenu(recentromsmenu, 0); - //moo.fState = RecentRoms[0].c_str() ? MFS_ENABLED : MFS_GRAYED; - moo.fState = MFS_ENABLED; - SetMenuItemInfo(GetSubMenu(mainMenu, 0), ID_FILE_RECENTROM, FALSE, &moo); - - //----------------------------------------------------------------------- - - //----------------------------------------------------------------------- - //Clear the current menu items - for(int x = 0; x < MAX_RECENT_ROMS; x++) - { - DeleteMenu(GetSubMenu(recentromsmenu, 0), baseid + x, MF_BYCOMMAND); - } - - if(RecentRoms.size() == 0) - { - EnableMenuItem(GetSubMenu(recentromsmenu, 0), clearid, MF_GRAYED); - - moo.cbSize = sizeof(moo); - moo.fMask = MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE; - - moo.cch = 5; - moo.fType = 0; - moo.wID = baseid; - moo.dwTypeData = "None"; - moo.fState = MF_GRAYED; - - InsertMenuItem(GetSubMenu(recentromsmenu, 0), 0, TRUE, &moo); - - return; - } - - EnableMenuItem(GetSubMenu(recentromsmenu, 0), clearid, MF_ENABLED); - DeleteMenu(GetSubMenu(recentromsmenu, 0), baseid, MF_BYCOMMAND); - - HDC dc = GetDC(MainWindow->getHWnd()); - - //----------------------------------------------------------------------- - //Update the list using RecentRoms vector - for(int x = RecentRoms.size()-1; x >= 0; x--) //Must loop in reverse order since InsertMenuItem will insert as the first on the list - { - string tmp = RecentRoms[x]; - LPSTR tmp2 = (LPSTR)tmp.c_str(); - - PathCompactPath(dc, tmp2, 500); - - moo.cbSize = sizeof(moo); - moo.fMask = MIIM_DATA | MIIM_ID | MIIM_TYPE; - - moo.cch = tmp.size(); - moo.fType = 0; - moo.wID = baseid + x; - moo.dwTypeData = tmp2; - //LOG("Inserting: %s\n",tmp.c_str()); //Debug - InsertMenuItem(GetSubMenu(recentromsmenu, 0), 0, 1, &moo); - } - - ReleaseDC(MainWindow->getHWnd(), dc); - //----------------------------------------------------------------------- - - HWND temp = MainWindow->getHWnd(); - DrawMenuBar(temp); -} - -void UpdateRecentRoms(const char* filename) -{ - //This function assumes filename is a ROM filename that was successfully loaded - - string newROM = filename; //Convert to std::string - - //-------------------------------------------------------------- - //Check to see if filename is in list - vector::iterator x; - vector::iterator theMatch; - bool match = false; - for (x = RecentRoms.begin(); x < RecentRoms.end(); ++x) - { - if (newROM == *x) - { - //We have a match - match = true; //Flag that we have a match - theMatch = x; //Hold on to the iterator (Note: the loop continues, so if for some reason we had a duplicate (which wouldn't happen under normal circumstances, it would pick the last one in the list) - } - } - //---------------------------------------------------------------- - //If there was a match, remove it - if (match) - RecentRoms.erase(theMatch); - - RecentRoms.insert(RecentRoms.begin(), newROM); //Add to the array - - //If over the max, we have too many, so remove the last entry - if (RecentRoms.size() > MAX_RECENT_ROMS) - RecentRoms.pop_back(); - - //Debug - //for (int x = 0; x < RecentRoms.size(); x++) - // LOG("Recent ROM: %s\n",RecentRoms[x].c_str()); - - UpdateRecentRomsMenu(); -} - -void RemoveRecentRom(std::string filename) -{ - - vector::iterator x; - vector::iterator theMatch; - bool match = false; - for (x = RecentRoms.begin(); x < RecentRoms.end(); ++x) - { - if (filename == *x) - { - //We have a match - match = true; //Flag that we have a match - theMatch = x; //Hold on to the iterator (Note: the loop continues, so if for some reason we had a duplicate (which wouldn't happen under normal circumstances, it would pick the last one in the list) - } - } - //---------------------------------------------------------------- - //If there was a match, remove it - if (match) - RecentRoms.erase(theMatch); - - UpdateRecentRomsMenu(); -} - -void GetRecentRoms() -{ - //This function retrieves the recent ROMs stored in the .ini file - //Then is populates the RecentRomsMenu array - //Then it calls Update RecentRomsMenu() to populate the menu - - stringstream temp; - char tempstr[256]; - - // Avoids duplicating when changing the language. - RecentRoms.clear(); - - //Loops through all available recent slots - for (int x = 0; x < MAX_RECENT_ROMS; x++) - { - temp.str(""); - temp << "Recent Rom " << (x+1); - - GetPrivateProfileString("General",temp.str().c_str(),"", tempstr, 256, IniName); - if (tempstr[0]) - RecentRoms.push_back(tempstr); - } - UpdateRecentRomsMenu(); -} - -void SaveRecentRoms() -{ - //This function stores the RecentRomsMenu array to the .ini file - - stringstream temp; - - //Loops through all available recent slots - for (int x = 0; x < MAX_RECENT_ROMS; x++) - { - temp.str(""); - temp << "Recent Rom " << (x+1); - if (x < (int)RecentRoms.size()) //If it exists in the array, save it - WritePrivateProfileString("General",temp.str().c_str(),RecentRoms[x].c_str(),IniName); - else //Else, make it empty - WritePrivateProfileString("General",temp.str().c_str(), "",IniName); - } -} - -void ClearRecentRoms() -{ - RecentRoms.clear(); - SaveRecentRoms(); - UpdateRecentRomsMenu(); -} static HMENU GetMenuItemParent(UINT itemId, HMENU hMenu = mainMenu) { @@ -1325,7 +1138,7 @@ static void DD_DoDisplay() } } -//tripple buffering logic +//triple buffering logic u16 displayBuffers[3][256*192*4]; volatile int currDisplayBuffer=-1; volatile int newestDisplayBuffer=-2; @@ -1898,6 +1711,31 @@ static BOOL LoadROM(const char * filename, const char * logicalName) return FALSE; } +void OpenRecentROM(int listNum) +{ + if (listNum > MAX_RECENT_ROMS) return; //Just in case + char filename[MAX_PATH]; + strcpy(filename, RecentRoms[listNum].c_str()); + //LOG("Attempting to load %s\n",filename); + if(OpenCore(filename)) + { + romloaded = TRUE; + } + else + //Rom failed to load, ask the user how to handle it + { + string str = "Could not open "; + str.append(filename); + str.append("\n\nRemove from list?"); + if (MessageBox(MainWindow->getHWnd(), str.c_str(), "File error", MB_YESNO) == IDYES) + { + RemoveRecentRom(RecentRoms[listNum]); + } + } + + NDS_UnPause(); +} + /* * The thread handling functions needed by the GDB stub code. */ @@ -1921,8 +1759,7 @@ int MenuInit() mainMenu = LoadMenu(hAppInst, MAKEINTRESOURCE(MENU_PRINCIPAL)); //Load Menu, and store handle if (!MainWindow->setMenu(mainMenu)) return 0; - recentromsmenu = LoadMenu(hAppInst, MAKEINTRESOURCE(RECENTROMS)); - GetRecentRoms(); + InitRecentRoms(); ResetSaveStateTimes(); @@ -2653,7 +2490,6 @@ int _main() KillDisplay(); - SaveRecentRoms(); DRV_AviEnd(); WAV_End(); @@ -3177,33 +3013,9 @@ void WavRecordTo(int wavmode) NDS_UnPause(); } -void OpenRecentROM(int listNum) -{ - if (listNum > MAX_RECENT_ROMS) return; //Just in case - char filename[MAX_PATH]; - strcpy(filename, RecentRoms[listNum].c_str()); - //LOG("Attempting to load %s\n",filename); - if(OpenCore(filename)) - { - romloaded = TRUE; - } - else - //Rom failed to load, ask the user how to handle it - { - string str = "Could not open "; - str.append(filename); - str.append("\n\nRemove from list?"); - if (MessageBox(MainWindow->getHWnd(), str.c_str(), "File error", MB_YESNO) == IDYES) - { - RemoveRecentRom(RecentRoms[listNum]); - } - } - NDS_UnPause(); -} -#include "OpenArchive.h" -#include "utils/xstring.h" + static BOOL OpenCore(const char* filename) { @@ -3676,7 +3488,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM } //Gray the recent ROM menu item if there are no recent ROMs - DesEnableMenuItem(mainMenu, ID_FILE_RECENTROM, RecentRoms.size()>0); + DesEnableMenuItem(mainMenu, ID_FILE_RECENTROM, RecentRoms.size()>0); //Updated Checked menu items @@ -4235,12 +4047,12 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM //wParam &= 0xFFFF; // A menu item from the recent files menu was clicked. - if(wParam >= baseid && wParam <= baseid + MAX_RECENT_ROMS - 1) + if(wParam >= recentRoms_baseid && wParam <= recentRoms_baseid + MAX_RECENT_ROMS - 1) { - int x = wParam - baseid; + int x = wParam - recentRoms_baseid; OpenRecentROM(x); } - else if(wParam == clearid) + else if(wParam == recentRoms_clearid) { /* Clear all the recent ROMs */ if(IDOK == MessageBox(hwnd, "OK to clear recent ROMs list?","DeSmuME",MB_OKCANCEL)) diff --git a/desmume/src/windows/main.h b/desmume/src/windows/main.h index c531f73db..ededb7550 100644 --- a/desmume/src/windows/main.h +++ b/desmume/src/windows/main.h @@ -3,6 +3,8 @@ #include "CWindow.h" extern WINCLASS *MainWindow; +extern HINSTANCE hAppInst; +extern HMENU mainMenu; //Holds handle to the main DeSmuME menu extern volatile bool execute, paused; void NDS_Pause(bool showMsg = true); @@ -34,4 +36,32 @@ extern u32 backupmemorysize; void WIN_InstallCFlash(); +#define IDM_RECENT_RESERVED0 65500 +#define IDM_RECENT_RESERVED1 65501 +#define IDM_RECENT_RESERVED2 65502 +#define IDM_RECENT_RESERVED3 65503 +#define IDM_RECENT_RESERVED4 65504 +#define IDM_RECENT_RESERVED5 65505 +#define IDM_RECENT_RESERVED6 65506 +#define IDM_RECENT_RESERVED7 65507 +#define IDM_RECENT_RESERVED8 65508 +#define IDM_RECENT_RESERVED9 65509 +#define IDM_RECENT_RESERVED10 65510 +#define IDM_RECENT_RESERVED11 65511 +#define IDM_RECENT_RESERVED12 65512 +#define IDM_RECENT_RESERVED13 65513 + +#define IDT_VIEW_DISASM7 50001 +#define IDT_VIEW_DISASM9 50002 +#define IDT_VIEW_MEM7 50003 +#define IDT_VIEW_MEM9 50004 +#define IDT_VIEW_IOREG 50005 +#define IDT_VIEW_PAL 50006 +#define IDT_VIEW_TILE 50007 +#define IDT_VIEW_MAP 50008 +#define IDT_VIEW_OAM 50009 +#define IDT_VIEW_MATRIX 50010 +#define IDT_VIEW_LIGHTS 50011 +#define IDM_EXEC 50112 + #endif diff --git a/desmume/src/windows/mapView.cpp b/desmume/src/windows/mapView.cpp index cfa3478e1..8f54bf152 100644 --- a/desmume/src/windows/mapView.cpp +++ b/desmume/src/windows/mapView.cpp @@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "../MMU.h" #include "../NDSSystem.h" #include "debug.h" +#include "main.h" #include "windriver.h" using namespace GPU_EXT; diff --git a/desmume/src/windows/matrixView.cpp b/desmume/src/windows/matrixView.cpp index 47893fd65..b8c442d80 100644 --- a/desmume/src/windows/matrixView.cpp +++ b/desmume/src/windows/matrixView.cpp @@ -21,6 +21,7 @@ #include #include "debug.h" #include "resource.h" +#include "main.h" #include "gfx3d.h" typedef struct diff --git a/desmume/src/windows/oamView.cpp b/desmume/src/windows/oamView.cpp index 1d592d35a..33110f587 100644 --- a/desmume/src/windows/oamView.cpp +++ b/desmume/src/windows/oamView.cpp @@ -21,6 +21,7 @@ #include "oamView.h" #include +#include "main.h" #include "debug.h" #include "resource.h" #include "../MMU.h" diff --git a/desmume/src/windows/palView.cpp b/desmume/src/windows/palView.cpp index e9dd6f889..838477fec 100644 --- a/desmume/src/windows/palView.cpp +++ b/desmume/src/windows/palView.cpp @@ -21,6 +21,7 @@ #include "palView.h" #include +#include "main.h" #include "debug.h" #include "resource.h" #include "../MMU.h" diff --git a/desmume/src/windows/recentroms.cpp b/desmume/src/windows/recentroms.cpp new file mode 100644 index 000000000..463732ea5 --- /dev/null +++ b/desmume/src/windows/recentroms.cpp @@ -0,0 +1,232 @@ +/* recentroms.cpp + + Copyright (C) 2008-2009 DeSmuME team + + This file is part of DeSmuME + + DeSmuME 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. + + DeSmuME 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 DeSmuME; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include +#include + +#include "recentroms.h" +#include "common.h" +#include "resource.h" +#include "main.h" +#include "winutil.h" + +#include + +std::vector RecentRoms; //The list of recent ROM filenames +static HMENU recentromsmenu; //Handle to the recent ROMs submenu + +void PopulateRecentRomsMenu() +{ + //This function will be called to populate the Recent Menu + //The array must be in the proper order ahead of time + + //UpdateRecentRoms will always call this + //This will be always called by GetRecentRoms on DesMume startup + + + //---------------------------------------------------------------------- + //Get Menu item info + + MENUITEMINFO moo; + moo.cbSize = sizeof(moo); + moo.fMask = MIIM_SUBMENU | MIIM_STATE; + + GetMenuItemInfo(GetSubMenu(mainMenu, 0), ID_FILE_RECENTROM, FALSE, &moo); + moo.hSubMenu = GetSubMenu(recentromsmenu, 0); + //moo.fState = RecentRoms[0].c_str() ? MFS_ENABLED : MFS_GRAYED; + moo.fState = MFS_ENABLED; + SetMenuItemInfo(GetSubMenu(mainMenu, 0), ID_FILE_RECENTROM, FALSE, &moo); + + //----------------------------------------------------------------------- + + //----------------------------------------------------------------------- + //Clear the current menu items + for(int x = 0; x < MAX_RECENT_ROMS; x++) + { + DeleteMenu(GetSubMenu(recentromsmenu, 0), recentRoms_baseid + x, MF_BYCOMMAND); + } + + if(RecentRoms.size() == 0) + { + EnableMenuItem(GetSubMenu(recentromsmenu, 0), recentRoms_clearid, MF_GRAYED); + + moo.cbSize = sizeof(moo); + moo.fMask = MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_TYPE; + + moo.cch = 5; + moo.fType = 0; + moo.wID = recentRoms_baseid; + moo.dwTypeData = "None"; + moo.fState = MF_GRAYED; + + InsertMenuItem(GetSubMenu(recentromsmenu, 0), 0, TRUE, &moo); + + return; + } + + EnableMenuItem(GetSubMenu(recentromsmenu, 0), recentRoms_clearid, MF_ENABLED); + DeleteMenu(GetSubMenu(recentromsmenu, 0), recentRoms_baseid, MF_BYCOMMAND); + + HDC dc = GetDC(MainWindow->getHWnd()); + + //----------------------------------------------------------------------- + //Update the list using RecentRoms vector + for(int x = RecentRoms.size()-1; x >= 0; x--) //Must loop in reverse order since InsertMenuItem will insert as the first on the list + { + string tmp = RecentRoms[x]; + LPSTR tmp2 = (LPSTR)tmp.c_str(); + + PathCompactPath(dc, tmp2, 500); + + moo.cbSize = sizeof(moo); + moo.fMask = MIIM_DATA | MIIM_ID | MIIM_TYPE; + + moo.cch = tmp.size(); + moo.fType = 0; + moo.wID = recentRoms_baseid + x; + moo.dwTypeData = tmp2; + //LOG("Inserting: %s\n",tmp.c_str()); //Debug + InsertMenuItem(GetSubMenu(recentromsmenu, 0), 0, 1, &moo); + } + + ReleaseDC(MainWindow->getHWnd(), dc); + //----------------------------------------------------------------------- + + HWND temp = MainWindow->getHWnd(); + DrawMenuBar(temp); +} + +void RemoveRecentRom(const std::string& filename) +{ + vector::iterator x; + vector::iterator theMatch; + bool match = false; + for (x = RecentRoms.begin(); x < RecentRoms.end(); ++x) + { + if (filename == *x) + { + //We have a match + match = true; //Flag that we have a match + theMatch = x; //Hold on to the iterator (Note: the loop continues, so if for some reason we had a duplicate (which wouldn't happen under normal circumstances, it would pick the last one in the list) + } + } + //---------------------------------------------------------------- + //If there was a match, remove it + if (match) + RecentRoms.erase(theMatch); + + PopulateRecentRomsMenu(); +} + +void LoadRecentRoms() +{ + //This function retrieves the recent ROMs stored in the .ini file + //Then is populates the RecentRomsMenu array + + char tempstr[256]; + + // Avoids duplicating when changing the language. + RecentRoms.clear(); + + //Loops through all available recent slots + for (int x = 0; x < MAX_RECENT_ROMS; x++) + { + char keyName[100]; + sprintf(keyName,"Recent Rom %d",x); + + GetPrivateProfileString("General",keyName,"", tempstr, 256, IniName); + if (tempstr[0]) + RecentRoms.push_back(tempstr); + } +} + +void SaveRecentRoms() +{ + //This function stores the RecentRomsMenu array to the .ini file + + //Loops through all available recent slots + for (int x = 0; x < MAX_RECENT_ROMS; x++) + { + char keyName[100]; + sprintf(keyName,"Recent Rom %d",x); + + if (x < (int)RecentRoms.size()) //If it exists in the array, save it + WritePrivateProfileString("General",keyName,RecentRoms[x].c_str(),IniName); + else //Else, make it empty + WritePrivateProfileString("General",keyName, "",IniName); + } +} + +void ClearRecentRoms() +{ + RecentRoms.clear(); + SaveRecentRoms(); + PopulateRecentRomsMenu(); +} + + +void UpdateRecentRoms(const char* filename) +{ + //This function assumes filename is a ROM filename that was successfully loaded + + string newROM = filename; //Convert to std::string + + //-------------------------------------------------------------- + //Check to see if filename is in list + vector::iterator x; + vector::iterator theMatch; + bool match = false; + for (x = RecentRoms.begin(); x < RecentRoms.end(); ++x) + { + if (newROM == *x) + { + //We have a match + match = true; //Flag that we have a match + theMatch = x; //Hold on to the iterator (Note: the loop continues, so if for some reason we had a duplicate (which wouldn't happen under normal circumstances, it would pick the last one in the list) + } + } + //---------------------------------------------------------------- + //If there was a match, remove it + if (match) + RecentRoms.erase(theMatch); + + RecentRoms.insert(RecentRoms.begin(), newROM); //Add to the array + + //If over the max, we have too many, so remove the last entry + if (RecentRoms.size() > MAX_RECENT_ROMS) + RecentRoms.pop_back(); + + //Debug + //for (int x = 0; x < RecentRoms.size(); x++) + // LOG("Recent ROM: %s\n",RecentRoms[x].c_str()); + + PopulateRecentRomsMenu(); + SaveRecentRoms(); +} + + +void InitRecentRoms() +{ + recentromsmenu = LoadMenu(hAppInst, MAKEINTRESOURCE(RECENTROMS)); + LoadRecentRoms(); + PopulateRecentRomsMenu(); +} diff --git a/desmume/src/windows/recentroms.h b/desmume/src/windows/recentroms.h new file mode 100644 index 000000000..419605fdb --- /dev/null +++ b/desmume/src/windows/recentroms.h @@ -0,0 +1,43 @@ +/* recentroms.h + + Copyright (C) 2008-2009 DeSmuME team + + This file is part of DeSmuME + + DeSmuME 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. + + DeSmuME 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 DeSmuME; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __RECENTROMS_H_ +#define __RECENTROMS_H_ + +#include +#include + +#include "main.h" + +static const unsigned int MAX_RECENT_ROMS = 10; //To change the recent rom max, simply change this number +static const unsigned int recentRoms_clearid = IDM_RECENT_RESERVED0; // ID for the Clear recent ROMs item +static const unsigned int recentRoms_baseid = IDM_RECENT_RESERVED1; //Base identifier for the recent ROMs items + +extern std::vector RecentRoms; //The list of recent ROM filenames + +void UpdateRecentRoms(const char* filename); +void InitRecentRoms(); +void OpenRecentROM(int listNum); +void ClearRecentRoms(); +void RemoveRecentRom(const std::string& filename); + + +#endif __RECENTROMS_H_ diff --git a/desmume/src/windows/tileView.cpp b/desmume/src/windows/tileView.cpp index d12415463..e4f5404ed 100644 --- a/desmume/src/windows/tileView.cpp +++ b/desmume/src/windows/tileView.cpp @@ -23,6 +23,7 @@ #include "commctrl.h" #include "resource.h" #include "debug.h" +#include "main.h" #include "../MMU.h" #include "../gpu.h" diff --git a/desmume/src/windows/winutil.cpp b/desmume/src/windows/winutil.cpp new file mode 100644 index 000000000..e907f9219 --- /dev/null +++ b/desmume/src/windows/winutil.cpp @@ -0,0 +1,74 @@ +/* winutil.cpp + + Copyright (C) 2008-2009 DeSmuME team + + This file is part of DeSmuME + + DeSmuME 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. + + DeSmuME 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 DeSmuME; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "winutil.h" +#include +#include +#include +#include + +char IniName[MAX_PATH]; + +void GetINIPath() +{ + char vPath[MAX_PATH], *szPath; + /*if (*vPath) + szPath = vPath; + else + {*/ + char *p; + ZeroMemory(vPath, sizeof(vPath)); + GetModuleFileName(NULL, vPath, sizeof(vPath)); + p = vPath + lstrlen(vPath); + while (p >= vPath && *p != '\\') p--; + if (++p >= vPath) *p = 0; + szPath = vPath; + //} + if (strlen(szPath) + strlen("\\desmume.ini") < MAX_PATH) + { + sprintf(IniName, "%s\\desmume.ini",szPath); + } else if (MAX_PATH> strlen(".\\desmume.ini")) { + sprintf(IniName, ".\\desmume.ini"); + } else + { + memset(IniName,0,MAX_PATH) ; + } +} + +void WritePrivateProfileBool(char* appname, char* keyname, bool val, char* file) +{ + char temp[256] = ""; + sprintf(temp, "%d", val?1:0); + WritePrivateProfileString(appname, keyname, temp, file); +} + +bool GetPrivateProfileBool(const char* appname, const char* keyname, bool defval, const char* filename) +{ + return GetPrivateProfileInt(appname,keyname,defval?1:0,filename) != 0; +} + +void WritePrivateProfileInt(char* appname, char* keyname, int val, char* file) +{ + char temp[256] = ""; + sprintf(temp, "%d", val); + WritePrivateProfileString(appname, keyname, temp, file); +} + diff --git a/desmume/src/windows/winutil.h b/desmume/src/windows/winutil.h new file mode 100644 index 000000000..a248e68d0 --- /dev/null +++ b/desmume/src/windows/winutil.h @@ -0,0 +1,32 @@ +/* winutil.h + + Copyright (C) 2008-2009 DeSmuME team + + This file is part of DeSmuME + + DeSmuME 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. + + DeSmuME 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 DeSmuME; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __WINUTIL_H_ +#define __WINUTIL_H_ + +#include +#include + +extern char IniName[MAX_PATH]; + +void GetINIPath(); + +#endif