From 315e30ceaec21a628df017db96c25d6a4d88ecc5 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 10 Mar 2024 13:17:27 +0300 Subject: fixes #4275 (any SRMM marks an event as read even if the window isn't active) --- src/mir_app/src/chat_log.cpp | 4 ++-- src/mir_app/src/db_events.cpp | 5 +++-- src/mir_app/src/mir_app.def | 2 +- src/mir_app/src/mir_app64.def | 2 +- src/mir_app/src/srmm_base.cpp | 26 +++++++++++++++++++++++++- src/mir_app/src/srmm_log_rtf.cpp | 5 +++-- 6 files changed, 35 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/mir_app/src/chat_log.cpp b/src/mir_app/src/chat_log.cpp index e54fe9a108..b5479987b1 100644 --- a/src/mir_app/src/chat_log.cpp +++ b/src/mir_app/src/chat_log.cpp @@ -320,12 +320,12 @@ void CRtfLogWindow::CreateChatRtfMessage(RtfChatLogStreamData *streamData, const DB::EventInfo dbei(lin.hEvent); if (dbei) { if (dbei.eventType == EVENTTYPE_MESSAGE || dbei.eventType == EVENTTYPE_FILE || dbei.isSrmm()) - dbei.wipeNotify(); + m_pDlg.MarkEventRead(dbei); if (dbei.eventType == EVENTTYPE_FILE) { DB::FILE_BLOB blob(dbei); if (blob.isOffline()) { - dbei.wipeNotify(); + m_pDlg.MarkEventRead(dbei); InsertFileLink(buf, lin.hEvent, blob); return; } diff --git a/src/mir_app/src/db_events.cpp b/src/mir_app/src/db_events.cpp index 8d4348c0bd..3b44ee5280 100644 --- a/src/mir_app/src/db_events.cpp +++ b/src/mir_app/src/db_events.cpp @@ -254,7 +254,7 @@ DB::EventInfo::EventInfo(MEVENT hEvent, bool bFetchBlob) : m_hEvent(hEvent) { memset(this, 0, sizeof(*this)); - fetch(bFetchBlob); + fetch(hEvent, bFetchBlob); } DB::EventInfo::EventInfo() : @@ -269,8 +269,9 @@ DB::EventInfo::~EventInfo() mir_free(pBlob); } -bool DB::EventInfo::fetch(bool bFetchBlob) +bool DB::EventInfo::fetch(MEVENT hEvent, bool bFetchBlob) { + m_hEvent = hEvent; if (bFetchBlob) cbBlob = -1; return m_bValid = ::db_event_get(m_hEvent, this) == 0; diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def index 449e6af00c..bd6d09c773 100644 --- a/src/mir_app/src/mir_app.def +++ b/src/mir_app/src/mir_app.def @@ -902,7 +902,7 @@ Clist_GroupSaveExpanded @1003 NONAME ?addButton@CMPluginBase@@QAEPAXPBUBBButton@@@Z @1032 NONAME ?SetQuoteEvent@CSrmmBaseDialog@@QAEXI@Z @1033 NONAME ?onClick_CloseQuote@CSrmmBaseDialog@@IAEXPAVCCtrlButton@@@Z @1034 NONAME -?fetch@EventInfo@DB@@QAE_N_N@Z @1035 NONAME +?fetch@EventInfo@DB@@QAE_NI_N@Z @1035 NONAME ?unload@EventInfo@DB@@QAEXXZ @1036 NONAME ?isAlertable@EventInfo@DB@@QBE_NXZ @1037 NONAME ?Send@File@@YGPAUHWND__@@IQAPA_W@Z @1038 NONAME diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def index 5589f1a8b8..bdb810338c 100644 --- a/src/mir_app/src/mir_app64.def +++ b/src/mir_app/src/mir_app64.def @@ -902,7 +902,7 @@ Clist_GroupSaveExpanded @1003 NONAME ?addButton@CMPluginBase@@QEAAPEAXPEBUBBButton@@@Z @1032 NONAME ?SetQuoteEvent@CSrmmBaseDialog@@QEAAXI@Z @1033 NONAME ?onClick_CloseQuote@CSrmmBaseDialog@@IEAAXPEAVCCtrlButton@@@Z @1034 NONAME -?fetch@EventInfo@DB@@QEAA_N_N@Z @1035 NONAME +?fetch@EventInfo@DB@@QEAA_NI_N@Z @1035 NONAME ?unload@EventInfo@DB@@QEAAXXZ @1036 NONAME ?isAlertable@EventInfo@DB@@QEBA_NXZ @1037 NONAME ?Send@File@@YAPEAUHWND__@@IQEAPEA_W@Z @1038 NONAME diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp index c202986930..cdb5cc4c06 100644 --- a/src/mir_app/src/srmm_base.cpp +++ b/src/mir_app/src/srmm_base.cpp @@ -585,6 +585,12 @@ void CSrmmBaseDialog::OnDestroy() ///////////////////////////////////////////////////////////////////////////////////////// +static void doMarkEventRead(MCONTACT hContact, MEVENT hEvent) +{ + db_event_markRead(hContact, hEvent); + Clist_RemoveEvent(-1, hEvent); +} + INT_PTR CSrmmBaseDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { @@ -603,7 +609,13 @@ INT_PTR CSrmmBaseDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam) break; case WM_ACTIVATE: - if (m_si && LOWORD(wParam) == WA_INACTIVE) { + m_bActive = LOWORD(wParam) != WA_INACTIVE; + if (m_bActive) { + for (auto &it : m_arDisplayedEvents) + doMarkEventRead(m_hContact, it); + m_arDisplayedEvents.clear(); + } + else if (m_si) { m_si->wState &= ~GC_EVENT_HIGHLIGHT; m_si->wState &= ~STATE_TALK; } @@ -661,6 +673,18 @@ bool CSrmmBaseDialog::IsSuitableEvent(const LOGINFO &lin) const return (m_si->iType == GCW_SERVER || (m_iLogFilterFlags & lin.iType)); } +void CSrmmBaseDialog::MarkEventRead(const DB::EventInfo &dbei) +{ + if (dbei.markedRead()) + return; + + if (m_bActive) + doMarkEventRead(m_hContact, dbei.getEvent()); + else { + m_arDisplayedEvents.push_back(dbei.getEvent()); + } +} + void CSrmmBaseDialog::UpdateChatOptions() { UpdateFilterButton(); diff --git a/src/mir_app/src/srmm_log_rtf.cpp b/src/mir_app/src/srmm_log_rtf.cpp index 0363f90c20..164f8cb559 100644 --- a/src/mir_app/src/srmm_log_rtf.cpp +++ b/src/mir_app/src/srmm_log_rtf.cpp @@ -336,11 +336,12 @@ static bool CreateRtfFromDbEvent(RtfLogStreamData *dat) if (!(dbei.flags & DBEF_SENT)) { if (dbei.eventType == EVENTTYPE_MESSAGE || dbei.isSrmm()) - dbei.wipeNotify(); + dat->pLog->GetDialog().MarkEventRead(dbei); + else if (dbei.eventType == EVENTTYPE_FILE) { DB::FILE_BLOB blob(dbei); if (blob.isOffline()) - dbei.wipeNotify(); + dat->pLog->GetDialog().MarkEventRead(dbei); } } else if (dbei.eventType == EVENTTYPE_JABBER_CHATSTATES || dbei.eventType == EVENTTYPE_JABBER_PRESENCE) { -- cgit v1.2.3