Memory management fix for QT dialog windows. Ensure that window is marked for deletion when it is closed.

This commit is contained in:
Matthew Budd 2020-08-25 20:59:36 -04:00
parent a624278fca
commit c23fa5dc60
20 changed files with 175 additions and 55 deletions

View File

@ -416,12 +416,22 @@ GuiCheatsDialog_t::~GuiCheatsDialog_t(void)
}
wasPausedByCheats = false;
printf("Destroy Cheat Window Event\n");
}
//----------------------------------------------------------------------------
void GuiCheatsDialog_t::closeEvent(QCloseEvent *event)
{
printf("Cheat Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void GuiCheatsDialog_t::closeWindow(void)
{
//printf("Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------------------------------
int GuiCheatsDialog_t::addSearchResult (uint32_t a, uint8_t last, uint8_t current)

View File

@ -33,6 +33,7 @@ class GuiCheatsDialog_t : public QDialog
int activeCheatListCB (char *name, uint32 a, uint8 v, int c, int s, int type, void *data);
protected:
void closeEvent(QCloseEvent *event);
QGroupBox *actCheatFrame;
QGroupBox *cheatSearchFrame;

View File

@ -1,5 +1,7 @@
// ConsoleSoundConf.cpp
//
#include <QCloseEvent>
#include "../../fceu.h"
#include "../../driver.h"
#include "Qt/ConsoleSoundConf.h"
@ -217,7 +219,22 @@ ConsoleSndConfDialog_t::ConsoleSndConfDialog_t(QWidget *parent)
//----------------------------------------------------
ConsoleSndConfDialog_t::~ConsoleSndConfDialog_t(void)
{
printf("Destroy Sound Config Window\n");
}
//----------------------------------------------------------------------------
void ConsoleSndConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Sound Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void ConsoleSndConfDialog_t::closeWindow(void)
{
//printf("Sound Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------
void ConsoleSndConfDialog_t::setCheckBoxFromProperty( QCheckBox *cbx, const char *property )

View File

@ -25,6 +25,8 @@ class ConsoleSndConfDialog_t : public QDialog
~ConsoleSndConfDialog_t(void);
protected:
void closeEvent(QCloseEvent *event);
QCheckBox *enaChkbox;
QCheckBox *enaLowPass;
QCheckBox *swapDutyChkbox;
@ -44,6 +46,7 @@ class ConsoleSndConfDialog_t : public QDialog
void setSliderFromProperty( QSlider *slider, QLabel *lbl, const char *property );
private slots:
void closeWindow(void);
void bufSizeChanged(int value);
void volumeChanged(int value);
void triangleChanged(int value);

View File

@ -1,5 +1,7 @@
// ConsoleVideoConf.cpp
//
#include <QCloseEvent>
#include "../../fceu.h"
#include "Qt/main.h"
#include "Qt/dface.h"
@ -105,7 +107,7 @@ ConsoleVideoConfDialog_t::ConsoleVideoConfDialog_t(QWidget *parent)
button = new QPushButton( tr("Close") );
hbox1->addWidget( button );
connect(button, SIGNAL(clicked()), this, SLOT(closewindow(void)) );
connect(button, SIGNAL(clicked()), this, SLOT(closeWindow(void)) );
main_vbox->addLayout( hbox1 );
@ -115,8 +117,24 @@ ConsoleVideoConfDialog_t::ConsoleVideoConfDialog_t(QWidget *parent)
//----------------------------------------------------
ConsoleVideoConfDialog_t::~ConsoleVideoConfDialog_t(void)
{
printf("Destroy Video Config Window\n");
}
//----------------------------------------------------------------------------
void ConsoleVideoConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Video Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void ConsoleVideoConfDialog_t::closeWindow(void)
{
//printf("Video Config Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------
void ConsoleVideoConfDialog_t::resetVideo(void)
{
@ -237,8 +255,3 @@ void ConsoleVideoConfDialog_t::applyChanges( void )
resetVideo();
}
//----------------------------------------------------
void ConsoleVideoConfDialog_t::closewindow( void )
{
done(0);
}
//----------------------------------------------------

View File

@ -25,6 +25,8 @@ class ConsoleVideoConfDialog_t : public QDialog
~ConsoleVideoConfDialog_t(void);
protected:
void closeEvent(QCloseEvent *bar);
QComboBox *driverSelect;
QComboBox *regionSelect;
QCheckBox *gl_LF_chkBox;
@ -40,6 +42,9 @@ class ConsoleVideoConfDialog_t : public QDialog
void resetVideo(void);
public slots:
void closeWindow(void);
private slots:
void use_new_PPU_changed( int value );
void frameskip_changed( int value );
@ -49,7 +54,6 @@ class ConsoleVideoConfDialog_t : public QDialog
void regionChanged(int index);
void driverChanged(int index);
void applyChanges( void );
void closewindow( void );
};

View File

@ -75,8 +75,6 @@ consoleWin_t::consoleWin_t(QWidget *parent)
emulatorThread->start();
gamePadConfWin = NULL;
}
consoleWin_t::~consoleWin_t(void)
@ -85,10 +83,8 @@ consoleWin_t::~consoleWin_t(void)
gameTimer->stop();
if ( gamePadConfWin != NULL )
{
gamePadConfWin->closeWindow();
}
closeGamePadConfWindow();
fceuWrapperLock();
fceuWrapperClose();
fceuWrapperUnLock();
@ -144,11 +140,8 @@ void consoleWin_t::QueueErrorMsgWindow( const char *msg )
void consoleWin_t::closeEvent(QCloseEvent *event)
{
//printf("Main Window Close Event\n");
if ( gamePadConfWin != NULL )
{
//printf("Command Game Pad Close\n");
gamePadConfWin->closeWindow();
}
closeGamePadConfWindow();
event->accept();
closeApp();
@ -901,9 +894,9 @@ void consoleWin_t::loadLua(void)
luaCtrlWin = new LuaControlDialog_t(this);
luaCtrlWin->show();
luaCtrlWin->exec();
//luaCtrlWin->exec();
delete luaCtrlWin;
//delete luaCtrlWin;
//printf("Lua Control Window Destroyed\n");
#endif
@ -911,20 +904,9 @@ void consoleWin_t::loadLua(void)
void consoleWin_t::openGamePadConfWin(void)
{
if ( gamePadConfWin != NULL )
{
printf("GamePad Config Window Already Open\n");
return;
}
//printf("Open GamePad Config Window\n");
gamePadConfWin = new GamePadConfDialog_t(this);
gamePadConfWin->show();
gamePadConfWin->exec();
delete gamePadConfWin;
gamePadConfWin = NULL;
//printf("GamePad Config Window Destroyed\n");
openGamePadConfWindow(this);
}
void consoleWin_t::openGameSndConfWin(void)
@ -936,9 +918,9 @@ void consoleWin_t::openGameSndConfWin(void)
sndConfWin = new ConsoleSndConfDialog_t(this);
sndConfWin->show();
sndConfWin->exec();
//sndConfWin->exec();
delete sndConfWin;
//delete sndConfWin;
//printf("Sound Config Window Destroyed\n");
}
@ -952,9 +934,9 @@ void consoleWin_t::openGameVideoConfWin(void)
vidConfWin = new ConsoleVideoConfDialog_t(this);
vidConfWin->show();
vidConfWin->exec();
//vidConfWin->exec();
delete vidConfWin;
//delete vidConfWin;
//printf("Video Config Window Destroyed\n");
}
@ -968,9 +950,9 @@ void consoleWin_t::openHotkeyConfWin(void)
hkConfWin = new HotKeyConfDialog_t(this);
hkConfWin->show();
hkConfWin->exec();
//hkConfWin->exec();
delete hkConfWin;
//delete hkConfWin;
//printf("Hotkey Config Window Destroyed\n");
}
@ -984,9 +966,9 @@ void consoleWin_t::openPaletteConfWin(void)
paletteConfWin = new PaletteConfDialog_t(this);
paletteConfWin->show();
paletteConfWin->exec();
//paletteConfWin->exec();
delete paletteConfWin;
//delete paletteConfWin;
//printf("Palette Config Window Destroyed\n");
}
@ -1000,9 +982,9 @@ void consoleWin_t::openGuiConfWin(void)
guiConfWin = new GuiConfDialog_t(this);
guiConfWin->show();
guiConfWin->exec();
//guiConfWin->exec();
delete guiConfWin;
//delete guiConfWin;
//printf("GUI Config Window Destroyed\n");
}
@ -1016,9 +998,9 @@ void consoleWin_t::openCheats(void)
cheatWin = new GuiCheatsDialog_t(this);
cheatWin->show();
cheatWin->exec();
//cheatWin->exec();
delete cheatWin;
//delete cheatWin;
//printf("GUI Cheat Window Destroyed\n");
}
@ -1032,9 +1014,9 @@ void consoleWin_t::openHexEditor(void)
hexEditWin = new HexEditorDialog_t(this);
hexEditWin->show();
hexEditWin->exec();
//hexEditWin->exec();
delete hexEditWin;
//delete hexEditWin;
//printf("GUI Hex Editor Window Destroyed\n");
}
@ -1412,9 +1394,9 @@ void consoleWin_t::aboutFCEUX(void)
aboutWin = new AboutWindow(this);
aboutWin->show();
aboutWin->exec();
//aboutWin->exec();
delete aboutWin;
//delete aboutWin;
//printf("About Window Destroyed\n");
return;

View File

@ -99,8 +99,6 @@ class consoleWin_t : public QMainWindow
emulatorThread_t *emulatorThread;
GamePadConfDialog_t *gamePadConfWin;
std::string errorMsg;
bool errorMsgValid;

View File

@ -36,6 +36,30 @@ struct GamePadConfigLocalData_t
static GamePadConfigLocalData_t lcl[GAMEPAD_NUM_DEVICES];
static GamePadConfDialog_t *gamePadConfWin = NULL;
//----------------------------------------------------
int openGamePadConfWindow( QWidget *parent )
{
if ( gamePadConfWin != NULL )
{
return -1;
}
gamePadConfWin = new GamePadConfDialog_t(parent);
gamePadConfWin->show();
return 0;
}
//----------------------------------------------------
int closeGamePadConfWindow(void)
{
if ( gamePadConfWin != NULL )
{
gamePadConfWin->closeWindow();
}
return 0;
}
//----------------------------------------------------
GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
: QDialog( parent )
@ -56,6 +80,8 @@ GamePadConfDialog_t::GamePadConfDialog_t(QWidget *parent)
std::string prefix;
char stmp[256];
gamePadConfWin = this;
// Ensure that joysticks are enabled, no harm calling init again.
InitJoysticks();
@ -279,6 +305,9 @@ GamePadConfDialog_t::~GamePadConfDialog_t(void)
{
inputTimer->stop();
buttonConfigStatus = 0;
gamePadConfWin = NULL;
printf("GamePad Window Deleted\n");
}
void GamePadConfDialog_t::keyPressEvent(QKeyEvent *event)
{
@ -500,6 +529,7 @@ void GamePadConfDialog_t::closeEvent(QCloseEvent *event)
printf("GamePad Close Window Event\n");
buttonConfigStatus = 0;
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------
@ -510,6 +540,7 @@ void GamePadConfDialog_t::closeWindow(void)
printf("Close Window\n");
buttonConfigStatus = 0;
done(0);
deleteLater();
}
//----------------------------------------------------
void GamePadConfDialog_t::changeButton0(void)

View File

@ -99,3 +99,7 @@ class GamePadConfDialog_t : public QDialog
void updatePeriodic(void);
};
int openGamePadConfWindow( QWidget *parent );
int closeGamePadConfWindow(void);

View File

@ -46,13 +46,22 @@ GuiConfDialog_t::GuiConfDialog_t(QWidget *parent)
//----------------------------------------------------
GuiConfDialog_t::~GuiConfDialog_t(void)
{
printf("Destroy GUI Config Close Window\n");
}
//----------------------------------------------------------------------------
void GuiConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("GUI Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------
void GuiConfDialog_t::closeWindow(void)
{
//printf("Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------
void GuiConfDialog_t::useNativeFileDialogChanged(int state)

View File

@ -26,6 +26,8 @@ class GuiConfDialog_t : public QDialog
~GuiConfDialog_t(void);
protected:
void closeEvent(QCloseEvent *event);
QCheckBox *useNativeFileDialog;
QCheckBox *useNativeMenuBar;
private:

View File

@ -468,6 +468,7 @@ HexEditorDialog_t::HexEditorDialog_t(QWidget *parent)
//----------------------------------------------------------------------------
HexEditorDialog_t::~HexEditorDialog_t(void)
{
printf("Hex Editor Deleted\n");
periodicTimer->stop();
}
//----------------------------------------------------------------------------
@ -487,10 +488,19 @@ void HexEditorDialog_t::populateBookmarkMenu(void)
bookmarkMenu->addSeparator();
}
//----------------------------------------------------------------------------
void HexEditorDialog_t::closeEvent(QCloseEvent *event)
{
printf("Hex Editor Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void HexEditorDialog_t::closeWindow(void)
{
//printf("Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------------------------------
void HexEditorDialog_t::pickForeGroundColor(void)

View File

@ -138,6 +138,7 @@ class HexEditorDialog_t : public QDialog
~HexEditorDialog_t(void);
protected:
void closeEvent(QCloseEvent *bar);
void gotoAddress(int newAddr);
void populateBookmarkMenu(void);

View File

@ -7,6 +7,7 @@
#include <SDL.h>
#include <QHeaderView>
#include <QCloseEvent>
#include "Qt/main.h"
#include "Qt/dface.h"
@ -68,13 +69,22 @@ HotKeyConfDialog_t::HotKeyConfDialog_t(QWidget *parent)
//----------------------------------------------------------------------------
HotKeyConfDialog_t::~HotKeyConfDialog_t(void)
{
printf("Destroy Hot Key Config Window\n");
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Hot Key Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::closeWindow(void)
{
//printf("Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------------------------------
void HotKeyConfDialog_t::assignHotkey(QKeyEvent *event)

View File

@ -27,6 +27,7 @@ class HotKeyConfDialog_t : public QDialog
~HotKeyConfDialog_t(void);
protected:
void closeEvent(QCloseEvent *event);
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
void assignHotkey(QKeyEvent *event);

View File

@ -102,6 +102,8 @@ LuaControlDialog_t::~LuaControlDialog_t(void)
{
std::list <LuaControlDialog_t*>::iterator it;
printf("Destroy Lua Control Window\n");
for (it = winList.begin(); it != winList.end(); it++)
{
if ( (*it) == this )
@ -113,10 +115,19 @@ LuaControlDialog_t::~LuaControlDialog_t(void)
}
}
//----------------------------------------------------
void LuaControlDialog_t::closeEvent(QCloseEvent *event)
{
printf("Lua Control Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------
void LuaControlDialog_t::closeWindow(void)
{
//printf("Close Window\n");
//printf("Lua Control Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------
void LuaControlDialog_t::openLuaScriptFile(void)

View File

@ -29,6 +29,8 @@ class LuaControlDialog_t : public QDialog
void refreshState(void);
protected:
void closeEvent(QCloseEvent *bar);
QLineEdit *scriptPath;
QLineEdit *scriptArgs;
QPushButton *browseButton;

View File

@ -148,13 +148,22 @@ PaletteConfDialog_t::PaletteConfDialog_t(QWidget *parent)
//----------------------------------------------------
PaletteConfDialog_t::~PaletteConfDialog_t(void)
{
printf("Destroy Palette Config Window\n");
}
//----------------------------------------------------------------------------
void PaletteConfDialog_t::closeEvent(QCloseEvent *event)
{
printf("Palette Config Close Window Event\n");
done(0);
deleteLater();
event->accept();
}
//----------------------------------------------------
void PaletteConfDialog_t::closeWindow(void)
{
//printf("Close Window\n");
done(0);
deleteLater();
}
//----------------------------------------------------
void PaletteConfDialog_t::hueChanged(int v)

View File

@ -26,6 +26,8 @@ class PaletteConfDialog_t : public QDialog
~PaletteConfDialog_t(void);
protected:
void closeEvent(QCloseEvent *event);
QLineEdit *custom_palette_path;
QCheckBox *useCustom;
QCheckBox *GrayScale;