From 249ad364f410c10a08bb6e05a2530d1f1b417a11 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 11 Aug 2022 19:52:53 +0300 Subject: fixes #3156 (TabSRMM: warning dialog) --- plugins/TabSRMM/src/utils.cpp | 62 ++++++++++++++++--------------------------- plugins/TabSRMM/src/utils.h | 1 - plugins/TabSRMM/src/version.h | 2 +- 3 files changed, 24 insertions(+), 41 deletions(-) diff --git a/plugins/TabSRMM/src/utils.cpp b/plugins/TabSRMM/src/utils.cpp index 926320e470..c2f54ba149 100644 --- a/plugins/TabSRMM/src/utils.cpp +++ b/plugins/TabSRMM/src/utils.cpp @@ -1011,17 +1011,6 @@ LRESULT CWarning::ShowDialog() const return ::DialogBoxParam(g_plugin.getInst(), MAKEINTRESOURCE(IDD_WARNING), nullptr, stubDlgProc, LPARAM(this)); } -__int64 CWarning::getMask() -{ - __int64 mask = 0; - - uint32_t dwLow = M.GetDword("cWarningsL", 0); - uint32_t dwHigh = M.GetDword("cWarningsH", 0); - - mask = ((((__int64)dwHigh) << 32) & 0xffffffff00000000) | dwLow; - return(mask); -} - ///////////////////////////////////////////////////////////////////////////////////////// // send cancel message to all open warning dialogs so they are destroyed // before TabSRMM is unloaded. @@ -1073,7 +1062,7 @@ LRESULT CWarning::show(const int uId, uint32_t dwFlags, const wchar_t* tszTxt) if ((mir_wstrlen(_s) > 3) && ((separator_pos = wcschr(_s, '|')) != nullptr)) { if (uId >= 0) { - mask = getMask(); + mask = M.GetDword("cWarningsL", 0); val = ((__int64)1L) << uId; } else mask = val = 0; @@ -1124,19 +1113,15 @@ INT_PTR CALLBACK CWarning::dlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP { switch (msg) { case WM_INITDIALOG: - { - UINT uResId = 0; - HICON hIcon = nullptr; - - m_hwnd = hwnd; - - ::SetWindowTextW(hwnd, TranslateT("TabSRMM warning message")); - ::Window_SetSkinIcon_IcoLib(hwnd, SKINICON_OTHER_MIRANDA); - ::SendDlgItemMessage(hwnd, IDC_WARNTEXT, EM_AUTOURLDETECT, TRUE, 0); - ::SendDlgItemMessage(hwnd, IDC_WARNTEXT, EM_SETEVENTMASK, 0, ENM_LINK); + m_hwnd = hwnd; - TranslateDialogDefault(hwnd); + ::SetWindowTextW(hwnd, TranslateT("TabSRMM warning message")); + ::Window_SetSkinIcon_IcoLib(hwnd, SKINICON_OTHER_MIRANDA); + ::SendDlgItemMessage(hwnd, IDC_WARNTEXT, EM_AUTOURLDETECT, TRUE, 0); + ::SendDlgItemMessage(hwnd, IDC_WARNTEXT, EM_SETEVENTMASK, 0, ENM_LINK); + TranslateDialogDefault(hwnd); + { CMStringW str(FORMAT, RTF_DEFAULT_HEADER, 0, 0, 0, 30 * 15); str.Append(m_szText); str.Append(L"}"); @@ -1158,6 +1143,8 @@ INT_PTR CALLBACK CWarning::dlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP Utils::showDlgControl(hwnd, IDNO, SW_HIDE); ::SetFocus(::GetDlgItem(hwnd, IDOK)); } + + UINT uResId = 0; if (m_dwFlags & MB_ICONERROR || m_dwFlags & MB_ICONHAND) uResId = 32513; else if (m_dwFlags & MB_ICONEXCLAMATION || m_dwFlags & MB_ICONWARNING) @@ -1167,12 +1154,13 @@ INT_PTR CALLBACK CWarning::dlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP else if (m_dwFlags & MB_ICONQUESTION) uResId = 32514; + HICON hIcon; if (uResId) hIcon = reinterpret_cast(::LoadImage(nullptr, MAKEINTRESOURCE(uResId), IMAGE_ICON, 0, 0, LR_SHARED | LR_DEFAULTSIZE)); else hIcon = ::Skin_LoadIcon(SKINICON_EVENT_MESSAGE, true); - ::SendDlgItemMessageW(hwnd, IDC_WARNICON, STM_SETICON, reinterpret_cast(hIcon), 0); + if (!(m_dwFlags & MB_YESNO || m_dwFlags & MB_YESNOCANCEL)) ::ShowWindow(hwnd, SW_SHOWNORMAL); @@ -1209,28 +1197,20 @@ INT_PTR CALLBACK CWarning::dlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: - case IDCANCEL: case IDYES: case IDNO: - ::SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); - delete this; - WindowList_Remove(hWindowList, hwnd); + if (::IsDlgButtonChecked(hwnd, IDC_DONTSHOWAGAIN)) { + uint32_t newVal = M.GetDword("cWarningsL", 0) | ((uint32_t)1L << m_uId); + db_set_dw(0, SRMSGMOD_T, "cWarningsL", newVal); + } + __fallthrough; + + case IDCANCEL: if (!m_fIsModal && (IDOK == LOWORD(wParam) || IDCANCEL == LOWORD(wParam))) // modeless dialogs can receive a IDCANCEL from destroyAll() ::DestroyWindow(hwnd); else ::EndDialog(hwnd, LOWORD(wParam)); break; - - case IDC_DONTSHOWAGAIN: - __int64 mask = getMask(), val64 = ((__int64)1L << m_uId), newVal = 0; - newVal = mask | val64; - - if (::IsDlgButtonChecked(hwnd, IDC_DONTSHOWAGAIN)) { - uint32_t val = (uint32_t)(newVal & 0x00000000ffffffff); - db_set_dw(0, SRMSGMOD_T, "cWarningsL", val); - val = (uint32_t)((newVal >> 32) & 0x00000000ffffffff); - db_set_dw(0, SRMSGMOD_T, "cWarningsH", val); - } } break; @@ -1251,6 +1231,10 @@ INT_PTR CALLBACK CWarning::dlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP break; case WM_DESTROY: + ::SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); + delete this; + + WindowList_Remove(hWindowList, hwnd); Window_FreeIcon_IcoLib(hwnd); break; } diff --git a/plugins/TabSRMM/src/utils.h b/plugins/TabSRMM/src/utils.h index f2c96ab7a0..bfabca23af 100644 --- a/plugins/TabSRMM/src/utils.h +++ b/plugins/TabSRMM/src/utils.h @@ -158,7 +158,6 @@ private: INT_PTR CALLBACK dlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK stubDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); - static __int64 getMask(); // get bit mask for disabled message classes private: static MWindowList hWindowList; diff --git a/plugins/TabSRMM/src/version.h b/plugins/TabSRMM/src/version.h index c81b057487..8711c82315 100644 --- a/plugins/TabSRMM/src/version.h +++ b/plugins/TabSRMM/src/version.h @@ -1,7 +1,7 @@ #define __MAJOR_VERSION 3 #define __MINOR_VERSION 6 #define __RELEASE_NUM 2 -#define __BUILD_NUM 4 +#define __BUILD_NUM 5 #include -- cgit v1.2.3