summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/m_database.h3
-rw-r--r--include/m_srmm_int.h6
-rw-r--r--libs/win32/mir_app.libbin291812 -> 292492 bytes
-rw-r--r--libs/win64/mir_app.libbin291568 -> 292264 bytes
-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
10 files changed, 42 insertions, 11 deletions
diff --git a/include/m_database.h b/include/m_database.h
index 4dd9e5dd8e..e29b04fa2e 100644
--- a/include/m_database.h
+++ b/include/m_database.h
@@ -695,10 +695,11 @@ namespace DB
explicit EventInfo(MEVENT hEvent, bool bFetchBlob = true);
~EventInfo();
- bool fetch(bool bFetchBlob = true);
+ bool fetch(MEVENT hEvent, bool bFetchBlob = true);
void unload();
void wipeNotify();
+ __forceinline MEVENT getEvent() const { return m_hEvent; }
__forceinline operator bool() const { return m_bValid; }
bool isSrmm() const; // could be displayed in a SRMM window
diff --git a/include/m_srmm_int.h b/include/m_srmm_int.h
index 712039e7d7..d1ef3109b5 100644
--- a/include/m_srmm_int.h
+++ b/include/m_srmm_int.h
@@ -26,6 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define M_SRMM_INT_H__ 1
#include <shellapi.h>
+#include <vector>
#include <m_gui.h>
@@ -287,6 +288,8 @@ class MIR_APP_EXPORT CSrmmBaseDialog : public CDlgBase
void OnNickListTimer(CTimer *);
void OnRedrawTimer(CTimer *);
+ std::vector<MEVENT> m_arDisplayedEvents;
+
protected:
CSrmmBaseDialog(CMPluginBase &pPlugin, int idDialog, struct SESSION_INFO *si = nullptr);
@@ -345,12 +348,13 @@ public:
int m_iLogFilterFlags;
bool m_bFilterEnabled, m_bNicklistEnabled, m_bReadOnly = false;
bool m_bFGSet, m_bBGSet;
- bool m_bInMenu;
+ bool m_bInMenu, m_bActive;
COLORREF m_iFG, m_iBG;
CTimer timerFlash, timerType, timerNickList, timerRedraw;
void ClearLog();
bool IsSuitableEvent(const LOGINFO &lin) const;
+ void MarkEventRead(const DB::EventInfo &dbei);
void RedrawLog();
void ScheduleRedrawLog();
void SetMessageText(const wchar_t *pwszText, bool bAppend = true);
diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib
index e17a24c630..0f146c19c9 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 2a1801716d..aacd437f12 100644
--- a/libs/win64/mir_app.lib
+++ b/libs/win64/mir_app.lib
Binary files differ
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) {