From 18f47c388bfc624918358517246d1756ed340ef3 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 19 Jan 2014 10:50:55 +0000 Subject: fix for deadlock on messages in tabSRMM git-svn-id: http://svn.miranda-ng.org/main/trunk@7749 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/TabSRMM/src/container.cpp | 16 ++++++++++++++++ plugins/TabSRMM/src/functions.h | 1 + plugins/TabSRMM/src/globals.cpp | 7 +------ plugins/TabSRMM/src/msgoptions.cpp | 17 ++++------------- plugins/TabSRMM/src/themes.cpp | 4 +--- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/plugins/TabSRMM/src/container.cpp b/plugins/TabSRMM/src/container.cpp index 1b10afe812..9c3e27b556 100644 --- a/plugins/TabSRMM/src/container.cpp +++ b/plugins/TabSRMM/src/container.cpp @@ -2473,3 +2473,19 @@ void TSAPI BroadCastContainer(const TContainerData *pContainer, UINT message, WP } } } + +void TSAPI CloseAllContainers() +{ + BOOL fOldHideSetting = PluginConfig.m_HideOnClose; + + while (pFirstContainer != NULL) { + if (!IsWindow(pFirstContainer->hwnd)) + pFirstContainer = pFirstContainer->pNext; + else { + PluginConfig.m_HideOnClose = FALSE; + ::SendMessage(pFirstContainer->hwnd, WM_CLOSE, 0, 1); + } + } + + PluginConfig.m_HideOnClose = fOldHideSetting; +} diff --git a/plugins/TabSRMM/src/functions.h b/plugins/TabSRMM/src/functions.h index a7369efe7e..c090228b07 100644 --- a/plugins/TabSRMM/src/functions.h +++ b/plugins/TabSRMM/src/functions.h @@ -97,6 +97,7 @@ HMENU TSAPI BuildMCProtocolMenu(HWND hwndDlg); TContainerData* TSAPI AppendToContainerList(TContainerData *pContainer); TContainerData* TSAPI RemoveContainerFromList(TContainerData *pContainer); +void TSAPI CloseAllContainers(); void TSAPI DeleteContainer(int iIndex); void TSAPI RenameContainer(int iIndex, const TCHAR *newName); int TSAPI GetContainerNameForContact(HANDLE hContact, TCHAR *szName, int iNameLen); diff --git a/plugins/TabSRMM/src/globals.cpp b/plugins/TabSRMM/src/globals.cpp index e10b9d2253..a2bf75563f 100644 --- a/plugins/TabSRMM/src/globals.cpp +++ b/plugins/TabSRMM/src/globals.cpp @@ -540,12 +540,7 @@ int CGlobals::MetaContactEvent(WPARAM wParam, LPARAM lParam) int CGlobals::PreshutdownSendRecv(WPARAM wParam, LPARAM lParam) { ::TN_ModuleDeInit(); - - while(pFirstContainer){ - if (PluginConfig.m_HideOnClose) - PluginConfig.m_HideOnClose = FALSE; - ::SendMessage(pFirstContainer->hwnd, WM_CLOSE, 0, 1); - } + ::CloseAllContainers(); for (HANDLE hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) db_set_dw(hContact, SRMSGMOD_T, "messagecount", 0); diff --git a/plugins/TabSRMM/src/msgoptions.cpp b/plugins/TabSRMM/src/msgoptions.cpp index 2e97d7a33f..b136c44603 100644 --- a/plugins/TabSRMM/src/msgoptions.cpp +++ b/plugins/TabSRMM/src/msgoptions.cpp @@ -354,18 +354,10 @@ static INT_PTR CALLBACK DlgProcSkinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, L CallService(MS_UTILS_OPENURL, 1, (LPARAM)"http://wiki.miranda.or.at/TabSRMM/UsingSkins"); break; - case IDC_SKIN_CLOSENOW: { - BOOL fOldHideSetting = PluginConfig.m_HideOnClose; - - PluginConfig.m_HideOnClose = FALSE; - - while(pFirstContainer) - if (pFirstContainer->hwnd) - SendMessage(pFirstContainer->hwnd, WM_CLOSE, 0, 1); - - PluginConfig.m_HideOnClose = fOldHideSetting; + case IDC_SKIN_CLOSENOW: + CloseAllContainers(); break; - } + case IDC_SKINNAME: { if (HIWORD(wParam) == CBN_SELCHANGE) { LRESULT lr = SendDlgItemMessage(hwndDlg, IDC_SKINNAME, CB_GETCURSEL, 0 ,0); @@ -385,8 +377,7 @@ static INT_PTR CALLBACK DlgProcSkinOpts(HWND hwndDlg, UINT msg, WPARAM wParam, L break; } } - if ((LOWORD(wParam) == IDC_SKINNAME) - && (HIWORD(wParam) != CBN_SELCHANGE || (HWND) lParam != GetFocus())) + if ((LOWORD(wParam) == IDC_SKINNAME) && (HIWORD(wParam) != CBN_SELCHANGE || (HWND) lParam != GetFocus())) return 0; SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0); break; diff --git a/plugins/TabSRMM/src/themes.cpp b/plugins/TabSRMM/src/themes.cpp index f0486c071b..04fda1e79e 100644 --- a/plugins/TabSRMM/src/themes.cpp +++ b/plugins/TabSRMM/src/themes.cpp @@ -1088,9 +1088,7 @@ bool CSkin::warnToClose() const TranslateT("Change skin"), MB_YESNO | MB_ICONQUESTION) != IDYES) return false; - TContainerData *pContainer = ::pFirstContainer; - while (pFirstContainer) - SendMessage(pFirstContainer->hwnd, WM_CLOSE, 0, 1); + CloseAllContainers(); return true; } -- cgit v1.2.3