Additional changes to af8befd: Fixed that unloaded skin is not deleted properly in rare case.

This commit is contained in:
spx
2013-03-11 06:06:02 +09:00
parent 27fe4a1e1c
commit 6ad5d56498
3 changed files with 49 additions and 2 deletions

View File

@ -728,6 +728,7 @@ CRainmeter::~CRainmeter()
{
KillTimer(m_Window, TIMER_NETSTATS);
DeleteAllUnmanagedMeterWindows();
DeleteAllMeterWindows();
delete m_TrayWindow;
@ -1540,8 +1541,18 @@ void CRainmeter::DeleteAllMeterWindows()
CDialogAbout::UpdateSkins();
}
void CRainmeter::DeleteAllUnmanagedMeterWindows()
{
for (auto it = m_UnmanagedMeterWindows.cbegin(); it != m_UnmanagedMeterWindows.end(); ++it)
{
delete (*it);
}
m_UnmanagedMeterWindows.clear();
}
/*
** Removes the skin from m_MeterWindow. The skin should delete itself.
** Removes the skin from m_MeterWindows. The skin should delete itself.
**
*/
void CRainmeter::RemoveMeterWindow(CMeterWindow* meterWindow)
@ -1558,6 +1569,35 @@ void CRainmeter::RemoveMeterWindow(CMeterWindow* meterWindow)
}
}
/*
** Adds the skin to m_UnmanagedMeterWindows. The skin should remove itself by calling RemoveUnmanagedMeterWindow().
**
*/
void CRainmeter::AddUnmanagedMeterWindow(CMeterWindow* meterWindow)
{
for (auto it = m_UnmanagedMeterWindows.cbegin(); it != m_UnmanagedMeterWindows.cend(); ++it)
{
if ((*it) == meterWindow) // already added
{
return;
}
}
m_UnmanagedMeterWindows.push_back(meterWindow);
}
void CRainmeter::RemoveUnmanagedMeterWindow(CMeterWindow* meterWindow)
{
for (auto it = m_UnmanagedMeterWindows.cbegin(); it != m_UnmanagedMeterWindows.cend(); ++it)
{
if ((*it) == meterWindow)
{
m_UnmanagedMeterWindows.erase(it);
break;
}
}
}
CMeterWindow* CRainmeter::GetMeterWindow(const std::wstring& folderPath)
{
const WCHAR* folderSz = folderPath.c_str();
@ -2590,6 +2630,7 @@ bool CRainmeter::LoadLayout(const std::wstring& name)
return false;
}
DeleteAllUnmanagedMeterWindows();
DeleteAllMeterWindows();
std::wstring backup = GetLayoutPath();