From 0106b105c7ac842eec10c5683be41cb50fd2e26c Mon Sep 17 00:00:00 2001 From: George Hazan Date: Thu, 30 Mar 2023 22:06:05 +0300 Subject: fix for #3471 applied to StdMsg & Scriver --- include/m_chat_int.h | 6 ++++ libs/win32/mir_app.lib | Bin 240514 -> 241120 bytes libs/win64/mir_app.lib | Bin 237462 -> 238072 bytes plugins/Scriver/src/chat_options.cpp | 1 + plugins/Scriver/src/msgdialog.cpp | 40 +++++++++++++++----------- plugins/TabSRMM/src/chat.h | 3 -- plugins/TabSRMM/src/chat_main.cpp | 2 -- plugins/TabSRMM/src/chat_manager.cpp | 11 -------- plugins/TabSRMM/src/chat_options.cpp | 2 +- plugins/TabSRMM/src/chat_tools.cpp | 42 --------------------------- plugins/TabSRMM/src/msgdialog.cpp | 3 -- plugins/TabSRMM/src/msgdlgother.cpp | 12 ++++---- plugins/TabSRMM/src/msglog.cpp | 2 +- src/core/stdmsg/src/chat_options.cpp | 31 ++++++++++++++------ src/core/stdmsg/src/chat_window.cpp | 36 ++++++++++++++---------- src/core/stdmsg/src/msgdialog.cpp | 7 +++-- src/mir_app/src/chat_log.cpp | 2 +- src/mir_app/src/chat_opts.cpp | 1 + src/mir_app/src/chat_tools.cpp | 53 +++++++++++++++++++++++++++++++++++ src/mir_app/src/mir_app.def | 2 ++ src/mir_app/src/mir_app64.def | 2 ++ src/mir_app/src/srmm_base.cpp | 13 ++++++--- 22 files changed, 155 insertions(+), 116 deletions(-) diff --git a/include/m_chat_int.h b/include/m_chat_int.h index a54d900cdd..cf0e1b5778 100644 --- a/include/m_chat_int.h +++ b/include/m_chat_int.h @@ -389,6 +389,12 @@ EXTERN_C MIR_APP_DLL(bool) Chat_GetDefaultEventDescr(const SESSION_INFO *si, con EXTERN_C MIR_APP_DLL(int) Chat_IsMuted(MCONTACT hContact); EXTERN_C MIR_APP_DLL(void) Chat_Mute(MCONTACT hContact, int mode); +// resets filters for all session +MIR_APP_DLL(void) Chat_ReconfigureFilters(); + +// sets filters for a session +MIR_APP_DLL(void) Chat_SetFilters(SESSION_INFO *si); + ///////////////////////////////////////////////////////////////////////////////////////// // common settings diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib index cecab7c652..5a657dcb1b 100644 Binary files a/libs/win32/mir_app.lib and b/libs/win32/mir_app.lib differ diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib index d3bd81fbae..2dae456529 100644 Binary files a/libs/win64/mir_app.lib and b/libs/win64/mir_app.lib differ diff --git a/plugins/Scriver/src/chat_options.cpp b/plugins/Scriver/src/chat_options.cpp index a9a6830c8b..3cfa295203 100644 --- a/plugins/Scriver/src/chat_options.cpp +++ b/plugins/Scriver/src/chat_options.cpp @@ -37,6 +37,7 @@ struct CChatOptionsBaseDlg : public CDlgBase { g_chatApi.ReloadSettings(); Chat_UpdateOptions(); + Chat_ReconfigureFilters(); } }; diff --git a/plugins/Scriver/src/msgdialog.cpp b/plugins/Scriver/src/msgdialog.cpp index a440cb82a5..4f65a5cd52 100644 --- a/plugins/Scriver/src/msgdialog.cpp +++ b/plugins/Scriver/src/msgdialog.cpp @@ -156,8 +156,10 @@ bool CMsgDialog::OnInitDialog() { CSuper::OnInitDialog(); - if (m_si) + if (m_si) { m_si->pDlg = this; + Chat_SetFilters(m_si); + } NotifyEvent(MSG_WINDOW_EVT_OPENING); @@ -680,21 +682,25 @@ void CMsgDialog::MessageDialogResize(int w, int h) INT_PTR CALLBACK CMsgDialog::FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { + int iFlags; static CMsgDialog *pDlg = nullptr; + switch (uMsg) { case WM_INITDIALOG: pDlg = (CMsgDialog *)lParam; - CheckDlgButton(hwndDlg, IDC_CHAT_1, pDlg->m_iLogFilterFlags & GC_EVENT_ACTION ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_2, pDlg->m_iLogFilterFlags & GC_EVENT_MESSAGE ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_3, pDlg->m_iLogFilterFlags & GC_EVENT_NICK ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_4, pDlg->m_iLogFilterFlags & GC_EVENT_JOIN ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_5, pDlg->m_iLogFilterFlags & GC_EVENT_PART ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_6, pDlg->m_iLogFilterFlags & GC_EVENT_TOPIC ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_7, pDlg->m_iLogFilterFlags & GC_EVENT_ADDSTATUS ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_8, pDlg->m_iLogFilterFlags & GC_EVENT_INFORMATION ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_9, pDlg->m_iLogFilterFlags & GC_EVENT_QUIT ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_10, pDlg->m_iLogFilterFlags & GC_EVENT_KICK ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_CHAT_11, pDlg->m_iLogFilterFlags & GC_EVENT_NOTICE ? BST_CHECKED : BST_UNCHECKED); + + iFlags = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "FilterFlags"); + CheckDlgButton(hwndDlg, IDC_CHAT_1, iFlags & GC_EVENT_ACTION ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_2, iFlags & GC_EVENT_MESSAGE ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_3, iFlags & GC_EVENT_NICK ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_4, iFlags & GC_EVENT_JOIN ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_5, iFlags & GC_EVENT_PART ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_6, iFlags & GC_EVENT_TOPIC ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_7, iFlags & GC_EVENT_ADDSTATUS ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_8, iFlags & GC_EVENT_INFORMATION ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_9, iFlags & GC_EVENT_QUIT ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_10, iFlags & GC_EVENT_KICK ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_CHAT_11, iFlags & GC_EVENT_NOTICE ? BST_CHECKED : BST_UNCHECKED); break; case WM_CTLCOLOREDIT: @@ -705,7 +711,7 @@ INT_PTR CALLBACK CMsgDialog::FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wPara case WM_ACTIVATE: if (LOWORD(wParam) == WA_INACTIVE) { - int iFlags = 0; + iFlags = 0; if (IsDlgButtonChecked(hwndDlg, IDC_CHAT_1) == BST_CHECKED) iFlags |= GC_EVENT_ACTION; @@ -733,9 +739,11 @@ INT_PTR CALLBACK CMsgDialog::FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wPara if (iFlags & GC_EVENT_ADDSTATUS) iFlags |= GC_EVENT_REMOVESTATUS; - pDlg->m_iLogFilterFlags = iFlags; - if (pDlg->m_bFilterEnabled) - pDlg->RedrawLog(); + db_set_dw(pDlg->m_hContact, CHAT_MODULE, "FilterFlags", iFlags); + db_set_dw(pDlg->m_hContact, CHAT_MODULE, "FilterMask", 0xFFFF); + + Chat_SetFilters(pDlg->getChat()); + pDlg->RedrawLog(); PostMessage(hwndDlg, WM_CLOSE, 0, 0); } break; diff --git a/plugins/TabSRMM/src/chat.h b/plugins/TabSRMM/src/chat.h index 08a4bf6a8d..0c4a88a64b 100644 --- a/plugins/TabSRMM/src/chat.h +++ b/plugins/TabSRMM/src/chat.h @@ -100,8 +100,6 @@ SESSION_INFO* SM_FindSessionByHWND(HWND h); SESSION_INFO* SM_FindSessionByHCONTACT(MCONTACT h); SESSION_INFO* SM_FindSessionAutoComplete(const char* pszModule, SESSION_INFO* currSession, SESSION_INFO* prevSession, const wchar_t* pszOriginal, const wchar_t* pszCurrent); -BOOL SM_ReconfigureFilters(); - void OnCreateNick(const SESSION_INFO *si, const LOGINFO *lin, CMStringW &wszNick); int UM_CompareItem(const USERINFO *u1, const USERINFO *u2); @@ -110,7 +108,6 @@ int UM_CompareItem(const USERINFO *u1, const USERINFO *u2); BOOL DoSoundsFlashPopupTrayStuff(SESSION_INFO *si, GCEVENT *gce, BOOL bHighlight, int bManyFix); bool IsHighlighted(SESSION_INFO *si, GCEVENT *pszText); char GetIndicator(SESSION_INFO *si, LPCTSTR ptszNick, int *iNickIndex); -void Chat_SetFilters(SESSION_INFO *si); BOOL DoPopup(SESSION_INFO *si, GCEVENT* gce); int ShowPopup(MCONTACT hContact, SESSION_INFO *si, HICON hIcon, char* pszProtoName, wchar_t* pszRoomName, COLORREF crBkg, const wchar_t* fmt, ...); diff --git a/plugins/TabSRMM/src/chat_main.cpp b/plugins/TabSRMM/src/chat_main.cpp index 395a51a05e..c095cc94e0 100644 --- a/plugins/TabSRMM/src/chat_main.cpp +++ b/plugins/TabSRMM/src/chat_main.cpp @@ -133,8 +133,6 @@ static void OnLoadSettings() if (g_Settings.SelectionBGBrush) DeleteObject(g_Settings.SelectionBGBrush); g_Settings.SelectionBGBrush = CreateSolidBrush(g_Settings.nickColors[5]); - - SM_ReconfigureFilters(); } ///////////////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/TabSRMM/src/chat_manager.cpp b/plugins/TabSRMM/src/chat_manager.cpp index d8bef4f461..da423141cd 100644 --- a/plugins/TabSRMM/src/chat_manager.cpp +++ b/plugins/TabSRMM/src/chat_manager.cpp @@ -72,17 +72,6 @@ int UM_CompareItem(const USERINFO *u1, const USERINFO *u2) // Keeps track of all sessions and its windows //--------------------------------------------------- -BOOL SM_ReconfigureFilters() -{ - for (auto &si : g_chatApi.arSessions) { - Chat_SetFilters(si); - if (si->pDlg) - si->pDlg->RedrawLog(); - } - - return TRUE; -} - SESSION_INFO* SM_FindSessionByHWND(HWND hWnd) { for (auto &si : g_chatApi.arSessions) diff --git a/plugins/TabSRMM/src/chat_options.cpp b/plugins/TabSRMM/src/chat_options.cpp index 710a46a0af..93c78a9817 100644 --- a/plugins/TabSRMM/src/chat_options.cpp +++ b/plugins/TabSRMM/src/chat_options.cpp @@ -471,7 +471,7 @@ protected: g_chatApi.MM_IconsChanged(); g_chatApi.MM_FontsChanged(); Chat_UpdateOptions(); - SM_ReconfigureFilters(); + Chat_ReconfigureFilters(); PluginConfig.reloadSettings(); CacheMsgLogIcons(); diff --git a/plugins/TabSRMM/src/chat_tools.cpp b/plugins/TabSRMM/src/chat_tools.cpp index 7ad4525575..49063bf0a4 100644 --- a/plugins/TabSRMM/src/chat_tools.cpp +++ b/plugins/TabSRMM/src/chat_tools.cpp @@ -352,48 +352,6 @@ BOOL DoSoundsFlashPopupTrayStuff(SESSION_INFO *si, GCEVENT *gce, BOOL bHighlight } ///////////////////////////////////////////////////////////////////////////////////////// -// set all filters and notification config for a session -// uses per channel mask + filterbits, default config as backup - -void Chat_SetFilters(SESSION_INFO *si) -{ - bool bEnabled = db_get_b(si->hContact, CHAT_MODULE, "FilterEnabled") != 0; - - CMsgDialog *pDlg = si->pDlg; - if (pDlg) { - uint32_t dwFlags = Chat::iFilterFlags; - uint32_t dwFlags_local = db_get_dw(si->hContact, CHAT_MODULE, "FilterFlags", GC_EVENT_ALL); - uint32_t dwMask = (bEnabled) ? db_get_dw(si->hContact, CHAT_MODULE, "FilterMask") : 0; - - for (int i = 0; i < 32; i++) { - uint32_t dwBit = 1 << i; - if (dwMask & dwBit) - dwFlags = (dwFlags_local & dwBit) ? dwFlags | dwBit : dwFlags & ~dwBit; - } - - pDlg->m_iLogFilterFlags = dwFlags; - } - - uint32_t dwFlags_local = db_get_dw(si->hContact, CHAT_MODULE, "PopupFlags", GC_EVENT_HIGHLIGHT); - uint32_t dwMask = (bEnabled) ? db_get_dw(si->hContact, CHAT_MODULE, "PopupMask", 0) : 0; - - si->iPopupFlags = Chat::iPopupFlags; - for (int i = 0; i < 32; i++) { - uint32_t dwBit = 1 << i; - if (dwMask & dwBit) - si->iPopupFlags = (dwFlags_local & dwBit) ? si->iPopupFlags | dwBit : si->iPopupFlags & ~dwBit; - } - - dwFlags_local = db_get_dw(si->hContact, CHAT_MODULE, "TrayIconFlags", GC_EVENT_HIGHLIGHT); - dwMask = (bEnabled) ? db_get_dw(si->hContact, CHAT_MODULE, "TrayIconMask", 0) : 0; - - si->iTrayFlags = Chat::iTrayIconFlags; - for (int i = 0; i < 32; i++) { - uint32_t dwBit = 1 << i; - if (dwMask & dwBit) - si->iTrayFlags = (dwFlags_local & dwBit) ? si->iTrayFlags | dwBit : si->iTrayFlags & ~dwBit; - } -} char GetIndicator(SESSION_INFO *si, LPCTSTR ptszNick, int *iNickIndex) { diff --git a/plugins/TabSRMM/src/msgdialog.cpp b/plugins/TabSRMM/src/msgdialog.cpp index 75e977a799..5451beac4d 100644 --- a/plugins/TabSRMM/src/msgdialog.cpp +++ b/plugins/TabSRMM/src/msgdialog.cpp @@ -350,7 +350,6 @@ void CMsgDialog::Init() m_szProto = Proto_GetBaseAccountName(m_hContact); m_autoClose = CLOSE_ON_CANCEL; m_forceResizable = true; - m_bFilterEnabled = db_get_b(m_hContact, CHAT_MODULE, "FilterEnabled", m_bFilterEnabled) != 0; // refresh cache data for this contact m_cache = CContactCache::getContactCache(m_hContact); @@ -997,8 +996,6 @@ void CMsgDialog::onClick_Filter(CCtrlButton *pButton) m_bFilterEnabled = !m_bFilterEnabled; UpdateFilterButton(); - db_set_b(m_si->hContact, CHAT_MODULE, "FilterEnabled", m_bFilterEnabled); - Chat_SetFilters(m_si); if (m_bFilterEnabled && !g_chatApi.bRightClickFilter) ShowFilterMenu(); diff --git a/plugins/TabSRMM/src/msgdlgother.cpp b/plugins/TabSRMM/src/msgdlgother.cpp index 7fd05e5861..abf577fd40 100644 --- a/plugins/TabSRMM/src/msgdlgother.cpp +++ b/plugins/TabSRMM/src/msgdlgother.cpp @@ -2023,14 +2023,14 @@ INT_PTR CALLBACK CMsgDialog::FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wPara pDlg = (CMsgDialog *)lParam; SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); { - uint32_t dwMask = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "FilterMask", 0); - uint32_t dwFlags = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "FilterFlags", 0); + uint32_t dwMask = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "FilterMask"); + uint32_t dwFlags = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "FilterFlags"); - uint32_t dwPopupMask = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "PopupMask", 0); - uint32_t dwPopupFlags = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "PopupFlags", 0); + uint32_t dwPopupMask = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "PopupMask"); + uint32_t dwPopupFlags = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "PopupFlags"); - uint32_t dwTrayMask = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "TrayIconMask", 0); - uint32_t dwTrayFlags = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "TrayIconFlags", 0); + uint32_t dwTrayMask = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "TrayIconMask"); + uint32_t dwTrayFlags = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "TrayIconFlags"); for (int i = 0; i < _countof(_eventorder); i++) { CheckDlgButton(hwndDlg, IDC_1 + i, dwMask & _eventorder[i] ? (dwFlags & _eventorder[i] ? BST_CHECKED : BST_UNCHECKED) : BST_INDETERMINATE); diff --git a/plugins/TabSRMM/src/msglog.cpp b/plugins/TabSRMM/src/msglog.cpp index 2fb0e7fe9e..86b0caf93a 100644 --- a/plugins/TabSRMM/src/msglog.cpp +++ b/plugins/TabSRMM/src/msglog.cpp @@ -1327,7 +1327,7 @@ void CLogWindow::LogEvents(LOGINFO *lin, bool bRedraw) if (m_rtf.GetHwnd() == nullptr || lin == nullptr || si == nullptr) return; - if (!bRedraw && m_pDlg.AllowTyping() && m_pDlg.m_bFilterEnabled && (m_pDlg.m_iLogFilterFlags & lin->iType) == 0) + if (!bRedraw && m_pDlg.AllowTyping() && !(m_pDlg.m_iLogFilterFlags & lin->iType)) return; bool bFlag = false, bDoReplace, bAtBottom = AtBottom(); diff --git a/src/core/stdmsg/src/chat_options.cpp b/src/core/stdmsg/src/chat_options.cpp index b6b519ab10..da48cd223a 100644 --- a/src/core/stdmsg/src/chat_options.cpp +++ b/src/core/stdmsg/src/chat_options.cpp @@ -66,10 +66,28 @@ void AddIcons(void) g_plugin.registerIcon(LPGEN("Messaging") "/" LPGEN("Group chats log"), iconList2, "chat"); } +///////////////////////////////////////////////////////////////////////////////////////// + +struct CChatOptionsBaseDlg : public CDlgBase +{ + CChatOptionsBaseDlg(int iDlgId) : + CDlgBase(g_plugin, iDlgId) + { + m_OnFinishWizard = Callback(this, &CChatOptionsBaseDlg::onFinish); + } + + void onFinish(void *) + { + g_chatApi.ReloadSettings(); + Chat_UpdateOptions(); + Chat_ReconfigureFilters(); + } +}; + ///////////////////////////////////////////////////////////////////////////////////////// // General options -class COptMainDlg : public CDlgBase +class COptMainDlg : public CChatOptionsBaseDlg { uint32_t m_dwFlags; @@ -77,7 +95,7 @@ class COptMainDlg : public CDlgBase public: COptMainDlg() : - CDlgBase(g_plugin, IDD_OPTIONS1), + CChatOptionsBaseDlg(IDD_OPTIONS1), checkBoxes(this, IDC_CHECKBOXES) { m_dwFlags = db_get_dw(0, CHAT_MODULE, "IconFlags"); @@ -120,9 +138,6 @@ public: bool OnApply() override { db_set_dw(0, CHAT_MODULE, "IconFlags", m_dwFlags); - - g_chatApi.ReloadSettings(); - Chat_UpdateOptions(); return true; } }; @@ -146,7 +161,7 @@ static INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM p return 0; } -class COptLogDlg : public CDlgBase +class COptLogDlg : public CChatOptionsBaseDlg { CCtrlEdit edtGroup, edtLogDir, edtLogTimestamp, edtTimestamp, edtHighlight, edtInStamp, edtOutStamp, edtLimit; CCtrlSpin spin2, spin3, spin4; @@ -155,7 +170,7 @@ class COptLogDlg : public CDlgBase public: COptLogDlg() : - CDlgBase(g_plugin, IDD_OPTIONS2), + CChatOptionsBaseDlg(IDD_OPTIONS2), spin2(this, IDC_SPIN2, 5000), spin3(this, IDC_SPIN3, 10000), spin4(this, IDC_SPIN4, 255, 10), @@ -263,8 +278,6 @@ public: else db_unset(0, CHAT_MODULE, "NicklistRowDist"); - g_chatApi.ReloadSettings(); - Chat_UpdateOptions(); return true; } diff --git a/src/core/stdmsg/src/chat_window.cpp b/src/core/stdmsg/src/chat_window.cpp index 4cc1fa7a3f..a8806f0cbc 100644 --- a/src/core/stdmsg/src/chat_window.cpp +++ b/src/core/stdmsg/src/chat_window.cpp @@ -213,21 +213,25 @@ void CLogWindow::LogEvents(LOGINFO *lin, bool bRedraw) INT_PTR CALLBACK CMsgDialog::FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { + int iFlags; static CMsgDialog *pDlg = nullptr; + switch (uMsg) { case WM_INITDIALOG: pDlg = (CMsgDialog*)lParam; - CheckDlgButton(hwndDlg, IDC_1, pDlg->m_iLogFilterFlags & GC_EVENT_ACTION ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_2, pDlg->m_iLogFilterFlags & GC_EVENT_MESSAGE ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_3, pDlg->m_iLogFilterFlags & GC_EVENT_NICK ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_4, pDlg->m_iLogFilterFlags & GC_EVENT_JOIN ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_5, pDlg->m_iLogFilterFlags & GC_EVENT_PART ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_6, pDlg->m_iLogFilterFlags & GC_EVENT_TOPIC ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_7, pDlg->m_iLogFilterFlags & GC_EVENT_ADDSTATUS ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_8, pDlg->m_iLogFilterFlags & GC_EVENT_INFORMATION ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_9, pDlg->m_iLogFilterFlags & GC_EVENT_QUIT ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_10, pDlg->m_iLogFilterFlags & GC_EVENT_KICK ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwndDlg, IDC_11, pDlg->m_iLogFilterFlags & GC_EVENT_NOTICE ? BST_CHECKED : BST_UNCHECKED); + + iFlags = db_get_dw(pDlg->m_hContact, CHAT_MODULE, "FilterFlags"); + CheckDlgButton(hwndDlg, IDC_1, iFlags & GC_EVENT_ACTION ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_2, iFlags & GC_EVENT_MESSAGE ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_3, iFlags & GC_EVENT_NICK ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_4, iFlags & GC_EVENT_JOIN ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_5, iFlags & GC_EVENT_PART ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_6, iFlags & GC_EVENT_TOPIC ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_7, iFlags & GC_EVENT_ADDSTATUS ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_8, iFlags & GC_EVENT_INFORMATION ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_9, iFlags & GC_EVENT_QUIT ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_10, iFlags & GC_EVENT_KICK ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(hwndDlg, IDC_11, iFlags & GC_EVENT_NOTICE ? BST_CHECKED : BST_UNCHECKED); break; case WM_CTLCOLOREDIT: @@ -238,7 +242,7 @@ INT_PTR CALLBACK CMsgDialog::FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wPara case WM_ACTIVATE: if (LOWORD(wParam) == WA_INACTIVE) { - int iFlags = 0; + iFlags = 0; if (IsDlgButtonChecked(hwndDlg, IDC_1) == BST_CHECKED) iFlags |= GC_EVENT_ACTION; @@ -266,9 +270,11 @@ INT_PTR CALLBACK CMsgDialog::FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wPara if (iFlags & GC_EVENT_ADDSTATUS) iFlags |= GC_EVENT_REMOVESTATUS; - pDlg->m_iLogFilterFlags = iFlags; - if (pDlg->m_bFilterEnabled) - pDlg->RedrawLog(); + db_set_dw(pDlg->m_hContact, CHAT_MODULE, "FilterFlags", iFlags); + db_set_dw(pDlg->m_hContact, CHAT_MODULE, "FilterMask", 0xFFFF); + + Chat_SetFilters(pDlg->getChat()); + pDlg->RedrawLog(); PostMessage(hwndDlg, WM_CLOSE, 0, 0); } break; diff --git a/src/core/stdmsg/src/msgdialog.cpp b/src/core/stdmsg/src/msgdialog.cpp index 14e25a9ef1..d7d4a14e25 100644 --- a/src/core/stdmsg/src/msgdialog.cpp +++ b/src/core/stdmsg/src/msgdialog.cpp @@ -55,8 +55,6 @@ CMsgDialog::CMsgDialog(CTabbedWindow *pOwner, SESSION_INFO *si) : m_cmdList(20), m_pOwner(pOwner) { - m_si->pDlg = this; - m_iSplitterX = g_Settings.iSplitterX; m_iSplitterY = g_Settings.iSplitterY; @@ -95,6 +93,11 @@ bool CMsgDialog::OnInitDialog() { CSuper::OnInitDialog(); + if (m_si) { + m_si->pDlg = this; + Chat_SetFilters(m_si); + } + m_szProto = Proto_GetBaseAccountName(m_hContact); m_bIsMeta = db_mc_isMeta(m_hContact) != 0; m_hTimeZone = TimeZone_CreateByContact(m_hContact, nullptr, TZF_KNOWNONLY); diff --git a/src/mir_app/src/chat_log.cpp b/src/mir_app/src/chat_log.cpp index 582c7b4851..151662ab5d 100644 --- a/src/mir_app/src/chat_log.cpp +++ b/src/mir_app/src/chat_log.cpp @@ -290,7 +290,7 @@ char* Log_CreateRTF(LOGSTREAMDATA *streamData) for (LOGINFO *lin = streamData->lin; lin; lin = lin->prev) { // filter if (si->iType == GCW_CHATROOM || si->iType == GCW_PRIVMESS) - if (si->pDlg->m_bFilterEnabled && (si->pDlg->m_iLogFilterFlags & lin->iType) == 0) + if (!(si->pDlg->m_iLogFilterFlags & lin->iType)) continue; // create new line, and set font and color diff --git a/src/mir_app/src/chat_opts.cpp b/src/mir_app/src/chat_opts.cpp index af2b8c5176..22c7be9fa2 100644 --- a/src/mir_app/src/chat_opts.cpp +++ b/src/mir_app/src/chat_opts.cpp @@ -254,6 +254,7 @@ void LoadGlobalSettings(void) LoadMsgDlgFont(19, &lf, nullptr); g_Settings->UserListHeadingsFont = CreateFontIndirect(&lf); + Chat_ReconfigureFilters(); SetIndentSize(); } diff --git a/src/mir_app/src/chat_tools.cpp b/src/mir_app/src/chat_tools.cpp index 5e5c164597..938db7b19c 100644 --- a/src/mir_app/src/chat_tools.cpp +++ b/src/mir_app/src/chat_tools.cpp @@ -838,6 +838,59 @@ MIR_APP_DLL(int) Chat_GetTextPixelSize(const wchar_t *pszText, HFONT hFont, bool return bWidth ? rc.right - rc.left : rc.bottom - rc.top; } +///////////////////////////////////////////////////////////////////////////////////////// +// set all filters and notification config for a session +// uses per channel mask + filterbits, default config as backup + +MIR_APP_DLL(void) Chat_ReconfigureFilters() +{ + for (auto &si : g_arSessions) { + Chat_SetFilters(si); + if (si->pDlg) + si->pDlg->RedrawLog(); + } +} + +MIR_APP_DLL(void) Chat_SetFilters(SESSION_INFO *si) +{ + bool bEnabled = db_get_b(si->hContact, CHAT_MODULE, "FilterEnabled") != 0; + + CMsgDialog *pDlg = si->pDlg; + if (pDlg) { + uint32_t dwFlags = Chat::iFilterFlags; + uint32_t dwFlags_local = db_get_dw(si->hContact, CHAT_MODULE, "FilterFlags", GC_EVENT_ALL); + uint32_t dwMask = (bEnabled) ? db_get_dw(si->hContact, CHAT_MODULE, "FilterMask") : 0; + + for (int i = 0; i < 32; i++) { + uint32_t dwBit = 1 << i; + if (dwMask & dwBit) + dwFlags = (dwFlags_local & dwBit) ? dwFlags | dwBit : dwFlags & ~dwBit; + } + + pDlg->m_iLogFilterFlags = dwFlags; + } + + uint32_t dwFlags_local = db_get_dw(si->hContact, CHAT_MODULE, "PopupFlags", GC_EVENT_HIGHLIGHT); + uint32_t dwMask = (bEnabled) ? db_get_dw(si->hContact, CHAT_MODULE, "PopupMask") : 0; + + si->iPopupFlags = Chat::iPopupFlags; + for (int i = 0; i < 32; i++) { + uint32_t dwBit = 1 << i; + if (dwMask & dwBit) + si->iPopupFlags = (dwFlags_local & dwBit) ? si->iPopupFlags | dwBit : si->iPopupFlags & ~dwBit; + } + + dwFlags_local = db_get_dw(si->hContact, CHAT_MODULE, "TrayIconFlags", GC_EVENT_HIGHLIGHT); + dwMask = (bEnabled) ? db_get_dw(si->hContact, CHAT_MODULE, "TrayIconMask") : 0; + + si->iTrayFlags = Chat::iTrayIconFlags; + for (int i = 0; i < 32; i++) { + uint32_t dwBit = 1 << i; + if (dwMask & dwBit) + si->iTrayFlags = (dwFlags_local & dwBit) ? si->iTrayFlags | dwBit : si->iTrayFlags & ~dwBit; + } +} + ///////////////////////////////////////////////////////////////////////////////////////// // Chat serialization diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index b413153316..c454bed1ca 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -831,3 +831,5 @@ Chat_IsMuted @941 NONAME ?iSoundFlags@Chat@@3V?$CMOption@I@@A @946 NONAME ?iTrayIconFlags@Chat@@3V?$CMOption@I@@A @947 NONAME ?UpdateFilterButton@CSrmmBaseDialog@@UAEXXZ @948 NONAME +?Chat_SetFilters@@YGXPAUSESSION_INFO@@@Z @949 NONAME +?Chat_ReconfigureFilters@@YGXXZ @950 NONAME diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 7577223e3f..1f447d3ff0 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -831,3 +831,5 @@ Chat_IsMuted @941 NONAME ?iSoundFlags@Chat@@3V?$CMOption@I@@A @946 NONAME ?iTrayIconFlags@Chat@@3V?$CMOption@I@@A @947 NONAME ?UpdateFilterButton@CSrmmBaseDialog@@UEAAXXZ @948 NONAME +?Chat_SetFilters@@YAXPEAUSESSION_INFO@@@Z @949 NONAME +?Chat_ReconfigureFilters@@YAXXZ @950 NONAME diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp index 0dfe3e31ca..1b3350552c 100644 --- a/src/mir_app/src/srmm_base.cpp +++ b/src/mir_app/src/srmm_base.cpp @@ -53,10 +53,6 @@ CSrmmBaseDialog::CSrmmBaseDialog(CMPluginBase &pPlugin, int idDialog, SESSION_IN m_hContact(0), m_clrInputBG(GetSysColor(COLOR_WINDOW)) { - m_bFilterEnabled = Chat::bFilterEnabled; - m_iLogFilterFlags = Chat::iFilterFlags; - m_bNicklistEnabled = Chat::bShowNicklist; - m_btnColor.OnClick = Callback(this, &CSrmmBaseDialog::onClick_Color); m_btnBkColor.OnClick = Callback(this, &CSrmmBaseDialog::onClick_BkColor); m_btnBold.OnClick = m_btnItalic.OnClick = m_btnUnderline.OnClick = Callback(this, &CSrmmBaseDialog::onClick_BIU); @@ -77,6 +73,10 @@ CSrmmBaseDialog::CSrmmBaseDialog(CMPluginBase &pPlugin, int idDialog, SESSION_IN m_iBG = 2; m_bBGSet = true; } + + m_bFilterEnabled = m_bFilterEnabled = db_get_b(m_hContact, CHAT_MODULE, "FilterEnabled", Chat::bFilterEnabled) != 0; + m_iLogFilterFlags = Chat::iFilterFlags; + m_bNicklistEnabled = Chat::bShowNicklist; } } @@ -690,6 +690,11 @@ void CSrmmBaseDialog::UpdateChatLog() void CSrmmBaseDialog::UpdateFilterButton() { + db_set_b(m_hContact, CHAT_MODULE, "FilterEnabled", m_bFilterEnabled); + + if (m_si) + Chat_SetFilters(m_si); + m_btnFilter.SendMsg(BUTTONADDTOOLTIP, (WPARAM)(m_bFilterEnabled ? TranslateT("Disable the event filter (Ctrl+F)") : TranslateT("Enable the event filter (Ctrl+F)")), BATF_UNICODE); } -- cgit v1.2.3