summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2023-03-30 22:06:05 +0300
committerGeorge Hazan <ghazan@miranda.im>2023-03-30 22:06:05 +0300
commit0106b105c7ac842eec10c5683be41cb50fd2e26c (patch)
tree062f27951606187a00b252784ebd0f39ce7e12b1
parent357540d5d8f0e67a2b3efdef7bc40c8db91fccf8 (diff)
fix for #3471 applied to StdMsg & Scriver
-rw-r--r--include/m_chat_int.h6
-rw-r--r--libs/win32/mir_app.libbin240514 -> 241120 bytes
-rw-r--r--libs/win64/mir_app.libbin237462 -> 238072 bytes
-rw-r--r--plugins/Scriver/src/chat_options.cpp1
-rw-r--r--plugins/Scriver/src/msgdialog.cpp40
-rw-r--r--plugins/TabSRMM/src/chat.h3
-rw-r--r--plugins/TabSRMM/src/chat_main.cpp2
-rw-r--r--plugins/TabSRMM/src/chat_manager.cpp11
-rw-r--r--plugins/TabSRMM/src/chat_options.cpp2
-rw-r--r--plugins/TabSRMM/src/chat_tools.cpp42
-rw-r--r--plugins/TabSRMM/src/msgdialog.cpp3
-rw-r--r--plugins/TabSRMM/src/msgdlgother.cpp12
-rw-r--r--plugins/TabSRMM/src/msglog.cpp2
-rw-r--r--src/core/stdmsg/src/chat_options.cpp31
-rw-r--r--src/core/stdmsg/src/chat_window.cpp36
-rw-r--r--src/core/stdmsg/src/msgdialog.cpp7
-rw-r--r--src/mir_app/src/chat_log.cpp2
-rw-r--r--src/mir_app/src/chat_opts.cpp1
-rw-r--r--src/mir_app/src/chat_tools.cpp53
-rw-r--r--src/mir_app/src/mir_app.def2
-rw-r--r--src/mir_app/src/mir_app64.def2
-rw-r--r--src/mir_app/src/srmm_base.cpp13
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
--- a/libs/win32/mir_app.lib
+++ b/libs/win32/mir_app.lib
Binary files differ
diff --git a/libs/win64/mir_app.lib b/libs/win64/mir_app.lib
index d3bd81fbae..2dae456529 100644
--- a/libs/win64/mir_app.lib
+++ b/libs/win64/mir_app.lib
Binary files 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
@@ -67,9 +67,27 @@ void AddIcons(void)
}
/////////////////////////////////////////////////////////////////////////////////////////
+
+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
@@ -839,6 +839,59 @@ MIR_APP_DLL(int) Chat_GetTextPixelSize(const wchar_t *pszText, HFONT hFont, bool
}
/////////////////////////////////////////////////////////////////////////////////////////
+// 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
CMStringW Chat_GetFolderName(SESSION_INFO *si)
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);
}