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

@ -394,6 +394,7 @@ void CMeterWindow::Deactivate()
m_State = STATE_CLOSING; m_State = STATE_CLOSING;
Rainmeter->RemoveMeterWindow(this); Rainmeter->RemoveMeterWindow(this);
Rainmeter->AddUnmanagedMeterWindow(this);
HideFade(); HideFade();
SetTimer(m_Window, TIMER_DEACTIVATE, m_FadeDuration + 50, NULL); SetTimer(m_Window, TIMER_DEACTIVATE, m_FadeDuration + 50, NULL);
@ -2887,6 +2888,7 @@ LRESULT CMeterWindow::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam)
if (m_FadeStartTime == 0) if (m_FadeStartTime == 0)
{ {
KillTimer(m_Window, TIMER_DEACTIVATE); KillTimer(m_Window, TIMER_DEACTIVATE);
Rainmeter->RemoveUnmanagedMeterWindow(this);
delete this; delete this;
} }
break; break;

View File

@ -728,6 +728,7 @@ CRainmeter::~CRainmeter()
{ {
KillTimer(m_Window, TIMER_NETSTATS); KillTimer(m_Window, TIMER_NETSTATS);
DeleteAllUnmanagedMeterWindows();
DeleteAllMeterWindows(); DeleteAllMeterWindows();
delete m_TrayWindow; delete m_TrayWindow;
@ -1540,8 +1541,18 @@ void CRainmeter::DeleteAllMeterWindows()
CDialogAbout::UpdateSkins(); 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) 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) CMeterWindow* CRainmeter::GetMeterWindow(const std::wstring& folderPath)
{ {
const WCHAR* folderSz = folderPath.c_str(); const WCHAR* folderSz = folderPath.c_str();
@ -2590,6 +2630,7 @@ bool CRainmeter::LoadLayout(const std::wstring& name)
return false; return false;
} }
DeleteAllUnmanagedMeterWindows();
DeleteAllMeterWindows(); DeleteAllMeterWindows();
std::wstring backup = GetLayoutPath(); std::wstring backup = GetLayoutPath();

View File

@ -126,8 +126,9 @@ public:
const std::vector<SkinFolder>& GetFolders() { return m_SkinFolders; } const std::vector<SkinFolder>& GetFolders() { return m_SkinFolders; }
const std::vector<std::wstring>& GetAllLayouts() { return m_Layouts; } const std::vector<std::wstring>& GetAllLayouts() { return m_Layouts; }
void DeleteAllMeterWindows();
void RemoveMeterWindow(CMeterWindow* meterWindow); void RemoveMeterWindow(CMeterWindow* meterWindow);
void AddUnmanagedMeterWindow(CMeterWindow* meterWindow);
void RemoveUnmanagedMeterWindow(CMeterWindow* meterWindow);
void ActivateSkin(int folderIndex, int fileIndex); void ActivateSkin(int folderIndex, int fileIndex);
void DeactivateSkin(CMeterWindow* meterWindow, int folderIndex, bool save = true); void DeactivateSkin(CMeterWindow* meterWindow, int folderIndex, bool save = true);
@ -246,6 +247,8 @@ private:
void ActivateActiveSkins(); void ActivateActiveSkins();
void CreateMeterWindow(const std::wstring& folderPath, const std::wstring& file); void CreateMeterWindow(const std::wstring& folderPath, const std::wstring& file);
void DeleteAllMeterWindows();
void DeleteAllUnmanagedMeterWindows();
void WriteActive(const std::wstring& folderPath, int fileIndex); void WriteActive(const std::wstring& folderPath, int fileIndex);
void ScanForSkins(); void ScanForSkins();
void ScanForLayouts(); void ScanForLayouts();
@ -273,6 +276,7 @@ private:
std::vector<SkinFolder> m_SkinFolders; std::vector<SkinFolder> m_SkinFolders;
std::multimap<int, int> m_SkinOrders; std::multimap<int, int> m_SkinOrders;
std::map<std::wstring, CMeterWindow*> m_MeterWindows; std::map<std::wstring, CMeterWindow*> m_MeterWindows;
std::list<CMeterWindow*> m_UnmanagedMeterWindows;
std::vector<std::wstring> m_Layouts; std::vector<std::wstring> m_Layouts;
std::wstring m_Path; std::wstring m_Path;