summaryrefslogtreecommitdiff
path: root/src/mir_app
diff options
context:
space:
mode:
authorGeorge Hazan <george.hazan@gmail.com>2024-03-10 13:17:27 +0300
committerGeorge Hazan <george.hazan@gmail.com>2024-03-10 13:17:27 +0300
commit315e30ceaec21a628df017db96c25d6a4d88ecc5 (patch)
tree0d6b801023738d3fd8fd1eb0fae1d257b6458fcd /src/mir_app
parent6b0eb25a146260e8e4a42eef18fcd51ad971e7a0 (diff)
fixes #4275 (any SRMM marks an event as read even if the window isn't active)
Diffstat (limited to 'src/mir_app')
-rw-r--r--src/mir_app/src/chat_log.cpp4
-rw-r--r--src/mir_app/src/db_events.cpp5
-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.cpp26
-rw-r--r--src/mir_app/src/srmm_log_rtf.cpp5
6 files changed, 35 insertions, 9 deletions
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) {