Bug fix for segmentation fault when deleting all cheats. Instead of using callback based iterator function to delete each cheat, added a new function that will just cleanly delete all cheats without the need for a callback.
This commit is contained in:
parent
b97bf287b2
commit
974d2aefba
|
@ -886,7 +886,8 @@ void FCEU_CheatSetByte(uint32 A, uint8 V)
|
||||||
}
|
}
|
||||||
|
|
||||||
// disable all cheats
|
// disable all cheats
|
||||||
int FCEU_DisableAllCheats(){
|
int FCEU_DisableAllCheats(void)
|
||||||
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
struct CHEATF *next = cheats;
|
struct CHEATF *next = cheats;
|
||||||
while(next)
|
while(next)
|
||||||
|
@ -902,6 +903,28 @@ int FCEU_DisableAllCheats(){
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// delete all cheats
|
||||||
|
int FCEU_DeleteAllCheats(void)
|
||||||
|
{
|
||||||
|
struct CHEATF *cur = cheats;
|
||||||
|
struct CHEATF *next = NULL;
|
||||||
|
while (cur)
|
||||||
|
{
|
||||||
|
next = cur->next;
|
||||||
|
if ( cur->name )
|
||||||
|
{
|
||||||
|
free(cur->name);
|
||||||
|
}
|
||||||
|
free(cur);
|
||||||
|
cur = next;
|
||||||
|
}
|
||||||
|
cheats = cheatsl = 0;
|
||||||
|
savecheats = 1;
|
||||||
|
RebuildSubCheats();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int FCEUI_FindCheatMapByte(uint16 address)
|
int FCEUI_FindCheatMapByte(uint16 address)
|
||||||
{
|
{
|
||||||
return cheatMap[address / 8] >> (address % 8) & 1;
|
return cheatMap[address / 8] >> (address % 8) & 1;
|
||||||
|
|
|
@ -30,7 +30,8 @@ extern int savecheats;
|
||||||
extern int globalCheatDisabled;
|
extern int globalCheatDisabled;
|
||||||
extern int disableAutoLSCheats;
|
extern int disableAutoLSCheats;
|
||||||
|
|
||||||
int FCEU_DisableAllCheats();
|
int FCEU_DisableAllCheats(void);
|
||||||
|
int FCEU_DeleteAllCheats(void);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16 addr;
|
uint16 addr;
|
||||||
|
|
|
@ -2846,20 +2846,23 @@ void QHexEdit::contextMenuEvent(QContextMenuEvent *event)
|
||||||
|
|
||||||
subMenu = menu.addMenu(tr("&Freeze/Unfreeze Address"));
|
subMenu = menu.addMenu(tr("&Freeze/Unfreeze Address"));
|
||||||
|
|
||||||
act = new QAction(tr("&Toggle State"), &menu);
|
if ( frzRamAddrValid( addr ) )
|
||||||
act->setShortcut( QKeySequence(tr("Ctrl+L")));
|
{
|
||||||
subMenu->addAction(act);
|
act = new QAction(tr("&Toggle State"), &menu);
|
||||||
connect( act, SIGNAL(triggered(void)), this, SLOT(frzRamToggle(void)) );
|
act->setShortcut( QKeySequence(tr("Ctrl+L")));
|
||||||
|
subMenu->addAction(act);
|
||||||
|
connect( act, SIGNAL(triggered(void)), this, SLOT(frzRamToggle(void)) );
|
||||||
|
|
||||||
act = new QAction(tr("&Freeze"), &menu);
|
act = new QAction(tr("&Freeze"), &menu);
|
||||||
subMenu->addAction(act);
|
subMenu->addAction(act);
|
||||||
connect( act, SIGNAL(triggered(void)), this, SLOT(frzRamSet(void)) );
|
connect( act, SIGNAL(triggered(void)), this, SLOT(frzRamSet(void)) );
|
||||||
|
|
||||||
act = new QAction(tr("&Unfreeze"), &menu);
|
act = new QAction(tr("&Unfreeze"), &menu);
|
||||||
subMenu->addAction(act);
|
subMenu->addAction(act);
|
||||||
connect( act, SIGNAL(triggered(void)), this, SLOT(frzRamUnset(void)) );
|
connect( act, SIGNAL(triggered(void)), this, SLOT(frzRamUnset(void)) );
|
||||||
|
|
||||||
subMenu->addSeparator();
|
subMenu->addSeparator();
|
||||||
|
}
|
||||||
|
|
||||||
act = new QAction(tr("Unfreeze &All"), &menu);
|
act = new QAction(tr("Unfreeze &All"), &menu);
|
||||||
subMenu->addAction(act);
|
subMenu->addAction(act);
|
||||||
|
@ -3016,6 +3019,8 @@ int QHexEdit::FreezeRam( const char *name, uint32_t a, uint8_t v, int c, int s,
|
||||||
if ( s )
|
if ( s )
|
||||||
{
|
{
|
||||||
FCEUI_DelCheat( frzIdx );
|
FCEUI_DelCheat( frzIdx );
|
||||||
|
frzRamAddr = -1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -3101,7 +3106,7 @@ void QHexEdit::frzRamUnsetAll(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
fceuWrapperLock();
|
fceuWrapperLock();
|
||||||
FCEUI_ListCheats( RamFreezeCB, this);
|
FCEU_DeleteAllCheats();
|
||||||
updateCheatDialog();
|
updateCheatDialog();
|
||||||
fceuWrapperUnLock();
|
fceuWrapperUnLock();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue