From d998a3c0151a074f28f7d9cbda50df9d7a5c2258 Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 26 May 2008 07:34:40 +0000 Subject: [PATCH] change extensions to fm2 (but we still claim we'll load fcm; even though it is not supported now) added dialog accelerator framework support new improved savestate-with-movie-running naming convention --- src/drivers/win/main.cpp | 8 ++- src/drivers/win/memwatch.cpp | 5 +- src/drivers/win/replay.cpp | 122 +++++++++++++++++++---------------- src/drivers/win/res.rc | Bin 152050 -> 152046 bytes src/drivers/win/resource.h | 2 +- src/file.cpp | 62 +++++++++--------- src/movie.cpp | 7 +- src/types.h | 1 + src/utils/xstring.cpp | 55 ++++++++++++++++ src/utils/xstring.h | 3 +- 10 files changed, 164 insertions(+), 101 deletions(-) diff --git a/src/drivers/win/main.cpp b/src/drivers/win/main.cpp index cd883311..9dfd50e3 100644 --- a/src/drivers/win/main.cpp +++ b/src/drivers/win/main.cpp @@ -280,10 +280,12 @@ int BlockingCheck() { if( GetMessage( &msg, 0, 0, 0)>0 ) { + //other accelerator capable dialogs could be added here extern HWND hwndMemWatch; int accelerated = 0; - /*if(hwndMemWatch) - accelerated = TranslateAccelerator(hwndMemWatch,fceu_hAccel,&msg);*/ + if(IsChild(hwndMemWatch,msg.hwnd)) + accelerated = TranslateAccelerator(hwndMemWatch,fceu_hAccel,&msg); + if(!accelerated) { TranslateMessage(&msg); @@ -567,7 +569,7 @@ int main(int argc,char *argv[]) ApplyDefaultCommandMapping(); fceu_hInstance = GetModuleHandle(0); - LoadAccelerators(fceu_hInstance,"IDR_ACCELERATOR1"); + fceu_hAccel = LoadAccelerators(fceu_hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1)); // Get the base directory GetBaseDirectory(); diff --git a/src/drivers/win/memwatch.cpp b/src/drivers/win/memwatch.cpp index add02786..089517b9 100644 --- a/src/drivers/win/memwatch.cpp +++ b/src/drivers/win/memwatch.cpp @@ -771,9 +771,6 @@ static BOOL CALLBACK MemWatchCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA //Menu Items switch(LOWORD(wParam)) { - case ID_ACCELERATOR_CTRL_O: - MessageBox(hwndDlg,"Someone hit ctrl+o","test",0); - break; case 600: //First item in recent menu OpenMemwatchRecentFile(0); break; @@ -793,7 +790,7 @@ static BOOL CALLBACK MemWatchCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARA case MEMW_FILE_CLOSE: CloseMemoryWatch(); break; - + case MEMW_FILE_OPEN: LoadMemWatch(); break; diff --git a/src/drivers/win/replay.cpp b/src/drivers/win/replay.cpp index e03c7ac6..d972c135 100644 --- a/src/drivers/win/replay.cpp +++ b/src/drivers/win/replay.cpp @@ -149,46 +149,52 @@ void UpdateReplayDialog(HWND hwndDlg) SendDlgItemMessage(hwndDlg,IDC_CHECK_READONLY,BM_SETCHECK,info.read_only ? BST_CHECKED : (ReplayDialogReadOnlyStatus ? BST_CHECKED : BST_UNCHECKED), 0); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_RECORDEDFROM),info.poweron ? "Power-On" : (info.reset?"Soft-Reset":"Savestate")); - if(info.movie_version > 1) - { + + //----------- + //mbg 5/26/08 - getting rid of old movie formats + + //if(info.movie_version > 1) + //{ char emuStr[128]; SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),info.name_of_rom_used.c_str()); SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),md5_asciistr(info.md5_of_rom_used)); - if(info.emu_version_used > 64) + + //if(info.emu_version_used > 64) sprintf(emuStr, "FCEU %d.%02d.%02d%s", info.emu_version_used/10000, (info.emu_version_used/100)%100, (info.emu_version_used)%100, info.emu_version_used < 9813 ? " (blip)" : ""); - else - { - if(info.emu_version_used == 1) - strcpy(emuStr, "Famtasia"); - else if(info.emu_version_used == 2) - strcpy(emuStr, "Nintendulator"); - else if(info.emu_version_used == 3) - strcpy(emuStr, "VirtuaNES"); - else - { - strcpy(emuStr, "(unknown)"); - char* dot = strrchr(fn,'.'); - if(dot) - { - if(!stricmp(dot,".fmv")) - strcpy(emuStr, "Famtasia? (unknown version)"); - else if(!stricmp(dot,".nmv")) - strcpy(emuStr, "Nintendulator? (unknown version)"); - else if(!stricmp(dot,".vmv")) - strcpy(emuStr, "VirtuaNES? (unknown version)"); - else if(!stricmp(dot,".fcm")) - strcpy(emuStr, "FCEU? (unknown version)"); - } - } - } + //else + //{ + // if(info.emu_version_used == 1) + // strcpy(emuStr, "Famtasia"); + // else if(info.emu_version_used == 2) + // strcpy(emuStr, "Nintendulator"); + // else if(info.emu_version_used == 3) + // strcpy(emuStr, "VirtuaNES"); + // else + // { + // strcpy(emuStr, "(unknown)"); + // char* dot = strrchr(fn,'.'); + // if(dot) + // { + // if(!stricmp(dot,".fmv")) + // strcpy(emuStr, "Famtasia? (unknown version)"); + // else if(!stricmp(dot,".nmv")) + // strcpy(emuStr, "Nintendulator? (unknown version)"); + // else if(!stricmp(dot,".vmv")) + // strcpy(emuStr, "VirtuaNES? (unknown version)"); + // else if(!stricmp(dot,".fcm")) + // strcpy(emuStr, "FCEU? (unknown version)"); + // } + // } + //} SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),emuStr); - } - else - { - SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),"unknown"); - SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),"unknown"); - SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),"FCEU 0.98.10 (blip)"); - } + //} + //else + //{ + // SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMUSED),"unknown"); + // SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_ROMCHECKSUM),"unknown"); + // SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_EMULATORUSED),"FCEU 0.98.10 (blip)"); + //} + //-------------------- SetWindowText(GetDlgItem(hwndDlg,IDC_LABEL_CURRCHECKSUM),md5_asciistr(GameInfo->MD5)); EnableWindow(GetDlgItem(hwndDlg,1),TRUE); // enable OK @@ -314,7 +320,7 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; - // filter out everything that's not *.fcm, *.fmv, *.vmv, or *.nmv + // filter out everything that's not *.fcm, *.fm2 // (because FindFirstFile is too dumb to do that) { char* dot=strrchr(wfd.cFileName,'.'); @@ -325,7 +331,7 @@ BOOL CALLBACK ReplayDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lP int k, extlen=strlen(ext); for(k=0;kMD5)); - if(fcm) strcpy(md52, md5_asciistr(info.md5_of_rom_used)); - if(!fcm || strcmp(md51, md52)) + strcpy(md51, md5_asciistr(GameInfo->MD5)); + strcpy(md52, md5_asciistr(info.md5_of_rom_used)); + if(strcmp(md51, md52)) { - if(fcm) - { - unsigned int k, count1=0, count2=0; //mbg merge 7/17/06 changed to uint - for(k=0;kszFilename); p->szFilename = 0; - /* Populate the "record from..." dialog */ + // Populate the "record from..." dialog { char* findGlob=FCEU_MakeFName(FCEUMKF_STATEGLOB, 0, 0); WIN32_FIND_DATA wfd; @@ -633,7 +641,7 @@ static BOOL CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP continue; if (strlen(wfd.cFileName) < 4 || - !strcmp(wfd.cFileName + (strlen(wfd.cFileName) - 4), ".fcm")) + !strcmp(wfd.cFileName + (strlen(wfd.cFileName) - 4), ".fm2")) continue; SendDlgItemMessage(hwndDlg, IDC_COMBO_RECORDFROM, CB_INSERTSTRING, i++, (LPARAM)wfd.cFileName); @@ -674,7 +682,7 @@ static BOOL CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwndDlg; - ofn.lpstrFilter = "FCE Ultra Save State(*.fc?)\0*.fc?\0\0"; + ofn.lpstrFilter = "FCEU Save State(*.fc?)\0*.fc?\0\0"; ofn.lpstrFile = szChoice; ofn.lpstrDefExt = "fcs"; ofn.nMaxFile = MAX_PATH; @@ -721,9 +729,9 @@ static BOOL CALLBACK RecordDialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = hwndDlg; - ofn.lpstrFilter = "FCE Ultra Movie File(*.fcm)\0*.fcm\0All files(*.*)\0*.*\0\0"; + ofn.lpstrFilter = "FCEUX Movie File (*.fm2)\0*.fm2\0FCEU Movie File(*.fcm)\0*.fcm\0All files(*.*)\0*.*\0\0"; ofn.lpstrFile = szChoice; - ofn.lpstrDefExt = "fcm"; + ofn.lpstrDefExt = "fm2"; ofn.nMaxFile = MAX_PATH; ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; if(GetSaveFileName(&ofn)) diff --git a/src/drivers/win/res.rc b/src/drivers/win/res.rc index 6ad0e750bc6674306859ae88312736e8cd33653c..efa6571962c5f2085d47ffb1f6b43ad4e6f78605 100644 GIT binary patch delta 60 zcmeygnDgCY&JA)*(=TZ-Eowf*)P9JGar+@Arb*t@15BAj*!>v-7+e|rCOdMAZg25p NYJe!5z9Nvx3jnD#6sQ0I delta 72 zcmV-O0Js0{qY3h(39udllY|GPgTMlZzyblczybo2OOucx2AAYb0u~Qn07C#&08#)< e0AB!404%qCP6CAjm)H^lq?fi40veaTQ35cueiz*U diff --git a/src/drivers/win/resource.h b/src/drivers/win/resource.h index fb1e48aa..15a4056a 100644 --- a/src/drivers/win/resource.h +++ b/src/drivers/win/resource.h @@ -338,7 +338,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 109 -#define _APS_NEXT_COMMAND_VALUE 40121 +#define _APS_NEXT_COMMAND_VALUE 40123 #define _APS_NEXT_CONTROL_VALUE 1130 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/src/file.cpp b/src/file.cpp index 5afb1181..df88df2b 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -19,6 +19,7 @@ */ #include +#include #include #include #include @@ -39,6 +40,7 @@ #include "state.h" #include "movie.h" #include "driver.h" +#include "utils/xstring.h" typedef struct { uint8 *data; @@ -715,46 +717,41 @@ char *FCEU_MakeFName(int type, int id1, char *cd1) { case FCEUMKF_NPTEMP: asprintf(&ret,"%s"PSS"m590plqd94fo.tmp",BaseDirectory);break; case FCEUMKF_MOVIE: - if(id1>=0) - { - if(odirs[FCEUIOD_MOVIES]) - asprintf(&ret,"%s"PSS"%s.%d.fcm",odirs[FCEUIOD_MOVIES],FileBase,id1); - else - asprintf(&ret,"%s"PSS"movies"PSS"%s.%d.fcm",BaseDirectory,FileBase,id1); - if(stat(ret,&tmpstat)==-1) - { - if(odirs[FCEUIOD_MOVIES]) - asprintf(&ret,"%s"PSS"%s.%d.fcm",odirs[FCEUIOD_MOVIES],FileBase,id1); - else - asprintf(&ret,"%s"PSS"movies"PSS"%s.%d.fcm",BaseDirectory,FileBase,id1); - } - } + if(odirs[FCEUIOD_MOVIES]) + asprintf(&ret,"%s"PSS"%s.fm2",odirs[FCEUIOD_MOVIES],FileBase); else - { - if(odirs[FCEUIOD_MOVIES]) - asprintf(&ret,"%s"PSS"%s.fcm",odirs[FCEUIOD_MOVIES],FileBase); - else - asprintf(&ret,"%s"PSS"movies"PSS"%s.fcm",BaseDirectory,FileBase); - } + asprintf(&ret,"%s"PSS"movies"PSS"%s.fm2",BaseDirectory,FileBase); break; case FCEUMKF_STATE: - if(odirs[FCEUIOD_STATES]) - { - asprintf(&ret,"%s"PSS"%s.fc%d",odirs[FCEUIOD_STATES],FileBase,id1); - } - else - { - asprintf(&ret,"%s"PSS"fcs"PSS"%s.fc%d",BaseDirectory,FileBase,id1); - } - if(stat(ret,&tmpstat)==-1) { + std::string movieFilenamePart; + extern char curMovieFilename[512]; + if(*curMovieFilename) + { + char drv[PATH_MAX], dir[PATH_MAX], name[PATH_MAX], ext[PATH_MAX]; + splitpath(curMovieFilename,drv,dir,name,ext); + movieFilenamePart = std::string(".") + name; + } + const char* mfn = movieFilenamePart.c_str(); + if(odirs[FCEUIOD_STATES]) { - asprintf(&ret,"%s"PSS"%s.fc%d",odirs[FCEUIOD_STATES],FileBase,id1); + asprintf(&ret,"%s"PSS"%s%s.fc%d",odirs[FCEUIOD_STATES],FileBase,mfn,id1); } else { - asprintf(&ret,"%s"PSS"fcs"PSS"%s.fc%d",BaseDirectory,FileBase,id1); + asprintf(&ret,"%s"PSS"fcs"PSS"%s%s.fc%d",BaseDirectory,FileBase,mfn,id1); + } + if(stat(ret,&tmpstat)==-1) + { + if(odirs[FCEUIOD_STATES]) + { + asprintf(&ret,"%s"PSS"%s%s.fc%d",odirs[FCEUIOD_STATES],FileBase,mfn,id1); + } + else + { + asprintf(&ret,"%s"PSS"fcs"PSS"%s%s.fc%d",BaseDirectory,FileBase,mfn,id1); + } } } break; @@ -830,11 +827,10 @@ char *FCEU_MakeFName(int type, int id1, char *cd1) break; case FCEUMKF_PALETTE:asprintf(&ret,"%s"PSS"%s.pal",BaseDirectory,FileBase);break; case FCEUMKF_MOVIEGLOB: + //these globs use ??? because we can load multiple formats if(odirs[FCEUIOD_MOVIES]) -// asprintf(&ret,"%s"PSS"%s*.fcm",odirs[FCEUIOD_MOVIES],FileBase); asprintf(&ret,"%s"PSS"*.???",odirs[FCEUIOD_MOVIES]); else -// asprintf(&ret,"%s"PSS"fcs"PSS"%s*.fcm",BaseDirectory,FileBase); asprintf(&ret,"%s"PSS"movies"PSS"*.???",BaseDirectory); break; case FCEUMKF_MOVIEGLOB2:asprintf(&ret,"%s"PSS"*.???",BaseDirectory);break; diff --git a/src/movie.cpp b/src/movie.cpp index d8713e9d..49113399 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -65,7 +65,7 @@ SFORMAT FCEUMOV_STATEINFO[]={ { 0 } }; -char curMovieFilename[512]; +char curMovieFilename[512] = {0}; class MovieRecord { @@ -382,6 +382,8 @@ void FCEUI_StopMovie() StopPlayback(); else if(movieMode == MOVIEMODE_RECORD) StopRecording(); + + curMovieFilename[0] = 0; } @@ -460,7 +462,8 @@ void FCEUI_LoadMovie(char *fname, bool _read_only, int _pauseframe) //TODO - handle reset flag - //...why do we have to do this. isnt it setup by the rom? + //if there is no savestate, we won't have this crucial piece of information at the start of the movie. + //so, we have to include it with the movie if(currMovieData.palFlag) FCEUI_SetVidSystem(1); else diff --git a/src/types.h b/src/types.h index 454ed40f..59bbbe71 100644 --- a/src/types.h +++ b/src/types.h @@ -60,6 +60,7 @@ typedef signed int int32; #define R_OK 2 #define X_OK 1 #define F_OK 0 +#define PATH_MAX 260 #else //mingw32 doesnt prototype this for some reason diff --git a/src/utils/xstring.cpp b/src/utils/xstring.cpp index c90dfc38..b691cd02 100644 --- a/src/utils/xstring.cpp +++ b/src/utils/xstring.cpp @@ -309,3 +309,58 @@ std::vector tokenize_str(const std::string & str, return tokens; } + +//this code was taken from WINE (LGPL) +//http://google.com/codesearch?hl=en&q=+lang:c+splitpath+show:CPvw9Z-euls:_RSotQzmLeU:KGzljMEYFbY&sa=N&cd=9&ct=rc&cs_p=http://gentoo.osuosl.org/distfiles/Wine-20050524.tar.gz&cs_f=wine-20050524/programs/winefile/splitpath.c +void splitpath(const char* path, char* drv, char* dir, char* name, char* ext) +{ + const char* end; /* end of processed string */ + const char* p; /* search pointer */ + const char* s; /* copy pointer */ + + /* extract drive name */ + if (path[0] && path[1]==':') { + if (drv) { + *drv++ = *path++; + *drv++ = *path++; + *drv = '\0'; + } + } else if (drv) + *drv = '\0'; + + /* search for end of string or stream separator */ + for(end=path; *end && *end!=':'; ) + end++; + + /* search for begin of file extension */ + for(p=end; p>path && *--p!='\\' && *p!='/'; ) + if (*p == '.') { + end = p; + break; + } + + if (ext) + for(s=end; (*ext=*s++); ) + ext++; + + /* search for end of directory name */ + for(p=end; p>path; ) + if (*--p=='\\' || *p=='/') { + p++; + break; + } + + if (name) { + for(s=p; s tokenize_str(const std::string & str,const std::string & delims); \ No newline at end of file +std::vector tokenize_str(const std::string & str,const std::string & delims); +void splitpath(const char* path, char* drv, char* dir, char* name, char* ext); \ No newline at end of file