summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2023-04-19 14:56:25 +0300
committerGeorge Hazan <ghazan@miranda.im>2023-04-19 14:56:25 +0300
commit744977cc61a0e729f5615ecaa506cba4818b0d58 (patch)
treec75d3d45474bc3debfd2c2ac0ec4e8fe707a9f22
parente0d5440d5cd44ba757b9496ecbe71de53cdb1a2f (diff)
redundant CRtfLogWindow::LogEvents parameter removed, passing LOGINFO* is enough
-rw-r--r--include/m_srmm_int.h11
-rw-r--r--libs/win32/mir_app.libbin249726 -> 249786 bytes
-rw-r--r--libs/win64/mir_app.libbin246958 -> 247022 bytes
-rw-r--r--plugins/IEView/src/ieview_logger.cpp113
-rw-r--r--plugins/NewStory/src/history_log.cpp9
-rw-r--r--plugins/Scriver/src/msglog.cpp31
-rw-r--r--plugins/TabSRMM/src/chat_log.cpp4
-rw-r--r--plugins/TabSRMM/src/msgdlgother.cpp4
-rw-r--r--plugins/TabSRMM/src/msglog.cpp28
-rw-r--r--plugins/TabSRMM/src/msgs.h4
-rw-r--r--src/core/stdmsg/src/msglog.cpp25
-rw-r--r--src/mir_app/src/chat.h4
-rw-r--r--src/mir_app/src/chat_log.cpp38
-rw-r--r--src/mir_app/src/chat_manager.cpp9
-rw-r--r--src/mir_app/src/chat_svc.cpp13
-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
-rw-r--r--src/mir_app/src/srmm_log_hpp.cpp118
19 files changed, 221 insertions, 207 deletions
diff --git a/include/m_srmm_int.h b/include/m_srmm_int.h
index 97e132e0a8..f18b2fa4c1 100644
--- a/include/m_srmm_int.h
+++ b/include/m_srmm_int.h
@@ -128,7 +128,7 @@ public:
virtual HWND GetHwnd() = 0;
virtual wchar_t* GetSelection() = 0;
virtual void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) = 0;
- virtual void LogEvents(struct SESSION_INFO *si, int iStart, bool bAppend) = 0;
+ virtual void LogEvents(const struct LOGINFO *lin) = 0;
virtual void Resize() = 0;
virtual void ScrollToBottom() = 0;
virtual void UpdateOptions() {};
@@ -163,11 +163,12 @@ struct RtfLogStreamBase
struct RtfChatLogStreamData
{
- int iStage = 0, iStartEvent = 0;
- bool bStripFormat, bAppend = false, bIsFirst = false;
+ int iStage = 0, idx = 0;
+ bool bStripFormat, bRedraw, bIsFirst = false;
CMStringA buf;
struct SESSION_INFO *si;
+ const struct LOGINFO *lin;
class CRtfLogWindow *pLog;
};
@@ -195,7 +196,7 @@ public:
virtual bool CreateRtfEvent(RtfLogStreamData *dat, DB::EventInfo &dbei) = 0;
virtual void CreateRtfTail(RtfLogStreamData *dat);
- void StreamChatRtfEvents(RtfChatLogStreamData *dat, bool bAppend);
+ void StreamChatRtfEvents(RtfChatLogStreamData *dat, bool bRedraw);
virtual void CreateChatRtfHeader(RtfChatLogStreamData *dat);
virtual void CreateChatRtfEvent(RtfChatLogStreamData *dat, const struct LOGINFO &lin);
virtual void CreateChatRtfTail(RtfChatLogStreamData *dat);
@@ -293,7 +294,7 @@ public:
void RedrawLog();
void ShowColorChooser(int iCtrlId);
- virtual void AddLog();
+ virtual void AddLog(const LOGINFO &lin);
virtual void CloseTab() {}
virtual void DrawNickList(USERINFO *ui, DRAWITEMSTRUCT *dis) PURE;
virtual void EventAdded(MEVENT, const DB::EventInfo &dbei) PURE;
diff --git a/libs/win32/mir_app.lib b/libs/win32/mir_app.lib
index 193a1a891e..f7997fdee4 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 92c848965b..f33ef41fdf 100644
--- a/libs/win64/mir_app.lib
+++ b/libs/win64/mir_app.lib
Binary files differ
diff --git a/plugins/IEView/src/ieview_logger.cpp b/plugins/IEView/src/ieview_logger.cpp
index 6f613882c2..5ab19373d0 100644
--- a/plugins/IEView/src/ieview_logger.cpp
+++ b/plugins/IEView/src/ieview_logger.cpp
@@ -103,7 +103,9 @@ public:
HandleIEEvent(0, LPARAM(&event));
}
- void LogEvents(SESSION_INFO *si, int iStart, bool bRedraw) override
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ void LogEvent(const LOGINFO *lin)
{
IEVIEWEVENTDATA ied = {};
ied.dwFlags = IEEDF_UNICODE_NICK;
@@ -116,60 +118,65 @@ public:
event.eventData = &ied;
event.count = 1;
- for (int i = iStart; i < si->arEvents.getCount(); i++) {
- auto &lin = si->arEvents[i];
-
- ied.szNick.w = lin.ptszNick;
- ied.szText.w = lin.ptszText;
- ied.time = lin.time;
- ied.bIsMe = lin.bIsMe;
-
- switch (lin.iType) {
- case GC_EVENT_MESSAGE:
- ied.iType = IEED_GC_EVENT_MESSAGE;
- ied.dwData = IEEDD_GC_SHOW_NICK;
- break;
- case GC_EVENT_ACTION:
- ied.iType = IEED_GC_EVENT_ACTION;
- break;
- case GC_EVENT_JOIN:
- ied.iType = IEED_GC_EVENT_JOIN;
- break;
- case GC_EVENT_PART:
- ied.iType = IEED_GC_EVENT_PART;
- break;
- case GC_EVENT_QUIT:
- ied.iType = IEED_GC_EVENT_QUIT;
- break;
- case GC_EVENT_NICK:
- ied.iType = IEED_GC_EVENT_NICK;
- break;
- case GC_EVENT_KICK:
- ied.iType = IEED_GC_EVENT_KICK;
- break;
- case GC_EVENT_NOTICE:
- ied.iType = IEED_GC_EVENT_NOTICE;
- break;
- case GC_EVENT_TOPIC:
- ied.iType = IEED_GC_EVENT_TOPIC;
- break;
- case GC_EVENT_INFORMATION:
- ied.iType = IEED_GC_EVENT_INFORMATION;
- break;
- case GC_EVENT_ADDSTATUS:
- ied.iType = IEED_GC_EVENT_ADDSTATUS;
- break;
- case GC_EVENT_REMOVESTATUS:
- ied.iType = IEED_GC_EVENT_REMOVESTATUS;
- break;
- }
-
- ied.dwData |= IEEDD_GC_SHOW_TIME | IEEDD_GC_SHOW_ICON;
- ied.dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK;
- HandleIEEvent(0, LPARAM(&event));
+ ied.szNick.w = lin->ptszNick;
+ ied.szText.w = lin->ptszText;
+ ied.time = lin->time;
+ ied.bIsMe = lin->bIsMe;
+
+ switch (lin->iType) {
+ case GC_EVENT_MESSAGE:
+ ied.iType = IEED_GC_EVENT_MESSAGE;
+ ied.dwData = IEEDD_GC_SHOW_NICK;
+ break;
+ case GC_EVENT_ACTION:
+ ied.iType = IEED_GC_EVENT_ACTION;
+ break;
+ case GC_EVENT_JOIN:
+ ied.iType = IEED_GC_EVENT_JOIN;
+ break;
+ case GC_EVENT_PART:
+ ied.iType = IEED_GC_EVENT_PART;
+ break;
+ case GC_EVENT_QUIT:
+ ied.iType = IEED_GC_EVENT_QUIT;
+ break;
+ case GC_EVENT_NICK:
+ ied.iType = IEED_GC_EVENT_NICK;
+ break;
+ case GC_EVENT_KICK:
+ ied.iType = IEED_GC_EVENT_KICK;
+ break;
+ case GC_EVENT_NOTICE:
+ ied.iType = IEED_GC_EVENT_NOTICE;
+ break;
+ case GC_EVENT_TOPIC:
+ ied.iType = IEED_GC_EVENT_TOPIC;
+ break;
+ case GC_EVENT_INFORMATION:
+ ied.iType = IEED_GC_EVENT_INFORMATION;
+ break;
+ case GC_EVENT_ADDSTATUS:
+ ied.iType = IEED_GC_EVENT_ADDSTATUS;
+ break;
+ case GC_EVENT_REMOVESTATUS:
+ ied.iType = IEED_GC_EVENT_REMOVESTATUS;
+ break;
+ }
+
+ ied.dwData |= IEEDD_GC_SHOW_TIME | IEEDD_GC_SHOW_ICON;
+ ied.dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK;
+ HandleIEEvent(0, LPARAM(&event));
+ }
+
+ void LogEvents(const LOGINFO *lin) override
+ {
+ if (lin == nullptr) {
+ for (auto &it : m_pDlg.getChat()->arEvents)
+ LogEvent(it);
}
+ else LogEvent(lin);
- if (bRedraw)
+ if (lin)
ScrollToBottom();
}
diff --git a/plugins/NewStory/src/history_log.cpp b/plugins/NewStory/src/history_log.cpp
index 87b0b7fc9d..35f3b47c97 100644
--- a/plugins/NewStory/src/history_log.cpp
+++ b/plugins/NewStory/src/history_log.cpp
@@ -60,10 +60,13 @@ public:
SendMessage(m_hwnd, NSM_ADDEVENTS, (LPARAM)&tmp, 0);
}
- void LogEvents(SESSION_INFO *si, int iStart, bool) override
+ void LogEvents(const LOGINFO *lin) override
{
- for (int i=iStart; i < si->arEvents.getCount(); i++)
- SendMessage(m_hwnd, NSM_ADDCHATEVENT, (WPARAM)m_pDlg.getChat(), (LPARAM)&si->arEvents[i]);
+ if (lin == nullptr) {
+ for (auto &it: m_pDlg.getChat()->arEvents)
+ SendMessage(m_hwnd, NSM_ADDCHATEVENT, (WPARAM)m_pDlg.getChat(), (LPARAM)it);
+ }
+ else SendMessage(m_hwnd, NSM_ADDCHATEVENT, (WPARAM)m_pDlg.getChat(), (LPARAM)lin);
}
void Resize() override
diff --git a/plugins/Scriver/src/msglog.cpp b/plugins/Scriver/src/msglog.cpp
index cf5d714c83..8715878381 100644
--- a/plugins/Scriver/src/msglog.cpp
+++ b/plugins/Scriver/src/msglog.cpp
@@ -318,6 +318,8 @@ public:
m_rtf.SendMsg(EM_AUTOURLDETECT, TRUE, 0);
}
+ ////////////////////////////////////////////////////////////////////////////////////////
+
void CreateRtfHeader(RtfLogStreamData *streamData) override
{
HDC hdc = GetDC(nullptr);
@@ -355,6 +357,8 @@ public:
buf.Append("}");
}
+ ////////////////////////////////////////////////////////////////////////////////////////
+
bool CreateRtfEvent(RtfLogStreamData *streamData, DB::EventInfo &dbei) override
{
if (!DbEventIsShown(dbei))
@@ -549,6 +553,8 @@ public:
return true;
}
+ ////////////////////////////////////////////////////////////////////////////////////////
+
void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override
{
if (!bAppend)
@@ -643,21 +649,20 @@ public:
////////////////////////////////////////////////////////////////////////////////////////
- void LogEvents(SESSION_INFO *si, int iStart, bool bAppend) override
+ void LogEvents(const LOGINFO *lin) override
{
- if (m_rtf.GetHwnd() == nullptr || si == nullptr)
+ if (m_rtf.GetHwnd() == nullptr)
return;
- auto &lin = si->arEvents[iStart];
- if (!bAppend && (si->iType == GCW_CHATROOM || si->iType == GCW_PRIVMESS) && !(m_pDlg.m_iLogFilterFlags & lin.iType))
- return;
+ auto *si = m_pDlg.getChat();
+ bool bRedraw = lin == nullptr;
RtfChatLogStreamData streamData;
streamData.pLog = this;
streamData.si = si;
- streamData.iStartEvent = iStart;
+ streamData.lin = lin;
streamData.bStripFormat = FALSE;
- streamData.bIsFirst = bAppend ? 1 : m_rtf.GetRichTextLength() == 0;
+ streamData.bIsFirst = bRedraw ? 1 : m_rtf.GetRichTextLength() == 0;
SCROLLINFO scroll;
scroll.cbSize = sizeof(SCROLLINFO);
@@ -680,20 +685,20 @@ public:
// fix for the indent... must be a M$ bug
if (sel.cpMax == 0)
- bAppend = TRUE;
+ bRedraw = TRUE;
// get the number of pixels per logical inch
bool bFlag = false;
- if (bAppend) {
+ if (bRedraw) {
m_rtf.SetDraw(false);
bFlag = true;
}
// stream in the event(s)
- StreamChatRtfEvents(&streamData, bAppend);
+ StreamChatRtfEvents(&streamData, bRedraw);
// do smileys
- if (g_dat.smileyAddInstalled && (bAppend || (lin.ptszText && lin.iType != GC_EVENT_JOIN && lin.iType != GC_EVENT_NICK && lin.iType != GC_EVENT_ADDSTATUS && lin.iType != GC_EVENT_REMOVESTATUS))) {
+ if (g_dat.smileyAddInstalled && (bRedraw || (lin && lin->ptszText && lin->iType != GC_EVENT_JOIN && lin->iType != GC_EVENT_NICK && lin->iType != GC_EVENT_ADDSTATUS && lin->iType != GC_EVENT_REMOVESTATUS))) {
newsel.cpMax = -1;
newsel.cpMin = sel.cpMin;
if (newsel.cpMin < 0)
@@ -702,7 +707,7 @@ public:
SMADD_RICHEDIT3 sm = { sizeof(sm) };
sm.hwndRichEditControl = m_rtf.GetHwnd();
sm.Protocolname = si->pszModule;
- sm.rangeToReplace = bAppend ? nullptr : &newsel;
+ sm.rangeToReplace = bRedraw ? nullptr : &newsel;
sm.flags = 0;
sm.disableRedraw = TRUE;
sm.hContact = m_pDlg.m_hContact;
@@ -710,7 +715,7 @@ public:
}
// scroll log to bottom if the log was previously scrolled to bottom, else restore old position
- if (bAppend || (UINT)scroll.nPos >= (UINT)scroll.nMax - scroll.nPage - 5 || scroll.nMax - scroll.nMin - scroll.nPage < 50)
+ if (bRedraw || (UINT)scroll.nPos >= (UINT)scroll.nMax - scroll.nPage - 5 || scroll.nMax - scroll.nMin - scroll.nPage < 50)
ScrollToBottom();
else
m_rtf.SendMsg(EM_SETSCROLLPOS, 0, (LPARAM)&point);
diff --git a/plugins/TabSRMM/src/chat_log.cpp b/plugins/TabSRMM/src/chat_log.cpp
index 49e573aed3..a5e18db220 100644
--- a/plugins/TabSRMM/src/chat_log.cpp
+++ b/plugins/TabSRMM/src/chat_log.cpp
@@ -296,7 +296,7 @@ void CLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const LOGI
SESSION_INFO *si = streamData->si;
CMStringA &str = streamData->buf;
- if (streamData->iStartEvent != 0)
+ if (streamData->idx != 0)
str.Append("\\par ");
if (m_pDlg.m_bDividerWanted) {
@@ -304,7 +304,7 @@ void CLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const LOGI
if (szStyle_div[0] == 0)
mir_snprintf(szStyle_div, "\\f%u\\cf%u\\ul0\\b%d\\i%d\\fs%u", 17, 18, 0, 0, 5);
- if (streamData->iStartEvent != si->arEvents.getCount() - 1 || !streamData->bAppend)
+ if (streamData->idx != si->arEvents.getCount()-1 || !streamData->bRedraw)
str.AppendFormat("\\qc\\sl-1\\highlight%d %s ---------------------------------------------------------------------------------------\\par ", 18, szStyle_div);
m_pDlg.m_bDividerWanted = false;
}
diff --git a/plugins/TabSRMM/src/msgdlgother.cpp b/plugins/TabSRMM/src/msgdlgother.cpp
index 5043f45e8d..b04236acfb 100644
--- a/plugins/TabSRMM/src/msgdlgother.cpp
+++ b/plugins/TabSRMM/src/msgdlgother.cpp
@@ -41,7 +41,7 @@ void CMsgDialog::ActivateTooltip(int iCtrlId, const wchar_t *pwszMessage)
/////////////////////////////////////////////////////////////////////////////////////////
-void CMsgDialog::AddLog()
+void CMsgDialog::AddLog(const LOGINFO &lin)
{
if (g_plugin.bUseDividers) {
if (g_plugin.bDividersUsePopupConfig) {
@@ -56,7 +56,7 @@ void CMsgDialog::AddLog()
}
}
- CSuper::AddLog();
+ CSuper::AddLog(lin);
}
/////////////////////////////////////////////////////////////////////////////////////////
diff --git a/plugins/TabSRMM/src/msglog.cpp b/plugins/TabSRMM/src/msglog.cpp
index 89cd3e7d34..04045292b2 100644
--- a/plugins/TabSRMM/src/msglog.cpp
+++ b/plugins/TabSRMM/src/msglog.cpp
@@ -1226,21 +1226,20 @@ void CLogWindow::LogEvents(MEVENT hDbEventFirst, int count, bool fAppend, DB::Ev
/////////////////////////////////////////////////////////////////////////////////////////
-void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend)
+void CLogWindow::LogEvents(const LOGINFO *lin)
{
- if (m_rtf.GetHwnd() == nullptr || si == nullptr)
+ if (m_rtf.GetHwnd() == nullptr)
return;
- auto &lin = si->arEvents[iStart];
- if (!bAppend && m_pDlg.AllowTyping() && !(m_pDlg.m_iLogFilterFlags & lin.iType))
- return;
+ auto si = m_pDlg.getChat();
+ bool bRedraw = lin == nullptr;
bool bFlag = false, bDoReplace, bAtBottom = AtBottom();
RtfChatLogStreamData streamData;
streamData.pLog = this;
streamData.si = si;
- streamData.iStartEvent = iStart;
+ streamData.lin = lin;
streamData.bStripFormat = FALSE;
POINT point = { 0 };
@@ -1258,13 +1257,10 @@ void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend)
// fix for the indent... must be a M$ bug
if (sel.cpMax == 0)
- bAppend = TRUE;
-
- // should the event(s) be appended to the current log
- WPARAM wp = bAppend ? SF_RTF : SFF_SELECTION | SF_RTF;
+ bRedraw = TRUE;
// get the number of pixels per logical inch
- if (bAppend) {
+ if (bRedraw) {
HDC hdc = GetDC(nullptr);
g_chatApi.logPixelSY = GetDeviceCaps(hdc, LOGPIXELSY);
g_chatApi.logPixelSX = GetDeviceCaps(hdc, LOGPIXELSX);
@@ -1273,16 +1269,16 @@ void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend)
bFlag = true;
}
- StreamChatRtfEvents(&streamData, bAppend);
+ StreamChatRtfEvents(&streamData, bRedraw);
// for new added events, only replace in message or action events.
// no need to replace smileys or math formulas elsewhere
- bDoReplace = (bAppend || (lin.ptszText && (lin.iType == GC_EVENT_MESSAGE || lin.iType == GC_EVENT_ACTION)));
+ bDoReplace = (bRedraw || (lin && lin->ptszText && (lin->iType == GC_EVENT_MESSAGE || lin->iType == GC_EVENT_ACTION)));
// replace marked nicknames with hyperlinks to make the nicks clickable
if (g_Settings.bClickableNicks) {
FINDTEXTEX fi, fi2;
- fi.chrg.cpMin = bAppend ? 0 : sel.cpMin;
+ fi.chrg.cpMin = bRedraw ? 0 : sel.cpMin;
fi.chrg.cpMax = -1;
fi.lpstrText = CLICKNICK_BEGIN;
@@ -1326,7 +1322,7 @@ void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend)
SMADD_RICHEDIT3 sm = { sizeof(sm) };
sm.hwndRichEditControl = m_rtf.GetHwnd();
sm.Protocolname = si->pszModule;
- sm.rangeToReplace = bAppend ? nullptr : &newsel;
+ sm.rangeToReplace = bRedraw ? nullptr : &newsel;
sm.disableRedraw = TRUE;
sm.hContact = si->hContact;
CallService(MS_SMILEYADD_REPLACESMILEYS, 0, (LPARAM)&sm);
@@ -1350,7 +1346,7 @@ void CLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool bAppend)
}
// scroll log to bottom if the log was previously scrolled to bottom, else restore old position
- if (bAppend || bAtBottom)
+ if (bRedraw || bAtBottom)
ScrollToBottom(false, false);
else
m_rtf.SendMsg(EM_SETSCROLLPOS, 0, (LPARAM)&point);
diff --git a/plugins/TabSRMM/src/msgs.h b/plugins/TabSRMM/src/msgs.h
index 439f506308..69582f562d 100644
--- a/plugins/TabSRMM/src/msgs.h
+++ b/plugins/TabSRMM/src/msgs.h
@@ -593,7 +593,7 @@ public:
LRESULT WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) override;
LRESULT WndProc_Nicklist(UINT msg, WPARAM wParam, LPARAM lParam) override;
- void AddLog() override;
+ void AddLog(const LOGINFO &lin) override;
void CloseTab() override;
void DrawNickList(USERINFO *ui, DRAWITEMSTRUCT *dis) override;
void EventAdded(MEVENT, const DB::EventInfo &dbei) override;
@@ -696,7 +696,7 @@ public:
void AppendUnicodeString(CMStringA &str, const wchar_t *pwszBuf) override;
void Attach() override;
void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override;
- void LogEvents(SESSION_INFO *si, int iStart, bool) override;
+ void LogEvents(const LOGINFO *lin) override;
void ScrollToBottom() override;
void UpdateOptions() override;
diff --git a/src/core/stdmsg/src/msglog.cpp b/src/core/stdmsg/src/msglog.cpp
index 22486d106c..6331b6ec30 100644
--- a/src/core/stdmsg/src/msglog.cpp
+++ b/src/core/stdmsg/src/msglog.cpp
@@ -259,7 +259,6 @@ public:
buffer.Append("}");
}
-
bool CreateRtfEvent(RtfLogStreamData *dat, DB::EventInfo &dbei) override
{
if (!DbEventIsShown(dbei))
@@ -478,19 +477,15 @@ public:
/////////////////////////////////////////////////////////////////////////////////////////
- void LogEvents(SESSION_INFO *si, int iStart, bool bAppend) override
+ void LogEvents(const LOGINFO *lin) override
{
- if (si == nullptr)
- return;
-
- auto &lin = si->arEvents[iStart];
- if (!bAppend && si->iType == GCW_CHATROOM && (m_pDlg.m_iLogFilterFlags & lin.iType) == 0)
- return;
+ auto *si = m_pDlg.getChat();
+ bool bRedraw = lin == nullptr;
RtfChatLogStreamData streamData;
streamData.pLog = this;
streamData.si = si;
- streamData.iStartEvent = iStart;
+ streamData.lin = lin;
streamData.bStripFormat = false;
bool bFlag = false;
@@ -515,10 +510,10 @@ public:
// fix for the indent... must be a M$ bug
if (sel.cpMax == 0)
- bAppend = true;
+ bRedraw = true;
// get the number of pixels per logical inch
- if (bAppend) {
+ if (bRedraw) {
HDC hdc = GetDC(nullptr);
g_chatApi.logPixelSY = GetDeviceCaps(hdc, LOGPIXELSY);
g_chatApi.logPixelSX = GetDeviceCaps(hdc, LOGPIXELSX);
@@ -528,10 +523,10 @@ public:
}
// stream in the event(s)
- StreamChatRtfEvents(&streamData, bAppend);
+ StreamChatRtfEvents(&streamData, bRedraw);
// do smileys
- if (g_plugin.bSmileyInstalled && (bAppend || (lin.ptszText && lin.iType != GC_EVENT_JOIN && lin.iType != GC_EVENT_NICK && lin.iType != GC_EVENT_ADDSTATUS && lin.iType != GC_EVENT_REMOVESTATUS))) {
+ if (g_plugin.bSmileyInstalled && (bRedraw || (lin && lin->ptszText && lin->iType != GC_EVENT_JOIN && lin->iType != GC_EVENT_NICK && lin->iType != GC_EVENT_ADDSTATUS && lin->iType != GC_EVENT_REMOVESTATUS))) {
CHARRANGE newsel;
newsel.cpMax = -1;
newsel.cpMin = sel.cpMin;
@@ -542,14 +537,14 @@ public:
sm.cbSize = sizeof(sm);
sm.hwndRichEditControl = m_rtf.GetHwnd();
sm.Protocolname = si->pszModule;
- sm.rangeToReplace = bAppend ? nullptr : &newsel;
+ sm.rangeToReplace = bRedraw ? nullptr : &newsel;
sm.disableRedraw = TRUE;
sm.hContact = si->hContact;
CallService(MS_SMILEYADD_REPLACESMILEYS, 0, (LPARAM)&sm);
}
// scroll log to bottom if the log was previously scrolled to bottom, else restore old position
- if (bAppend || (UINT)scroll.nPos >= (UINT)scroll.nMax - scroll.nPage - 5 || scroll.nMax - scroll.nMin - scroll.nPage < 50)
+ if (bRedraw || (UINT)scroll.nPos >= (UINT)scroll.nMax - scroll.nPage - 5 || scroll.nMax - scroll.nMin - scroll.nPage < 50)
ScrollToBottom();
else
m_rtf.SendMsg(EM_SETSCROLLPOS, 0, (LPARAM)&point);
diff --git a/src/mir_app/src/chat.h b/src/mir_app/src/chat.h
index 5f6a1f0bde..1c50e3ac4a 100644
--- a/src/mir_app/src/chat.h
+++ b/src/mir_app/src/chat.h
@@ -61,15 +61,13 @@ void FreeMsgLogBitmaps(void);
void ValidateFilename (wchar_t *filename);
wchar_t* MakeTimeStamp(wchar_t *pszStamp, time_t time);
wchar_t* GetChatLogsFilename(SESSION_INFO *si, time_t tTime);
-char* Log_CreateRtfHeader();
-char* Log_CreateRTF(RtfChatLogStreamData *streamData);
char* Log_SetStyle(int style);
// chat_manager.cpp
MODULEINFO* MM_AddModule(const char *pszModule);
MODULEINFO* MM_FindModule(const char *pszModule);
-BOOL SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted);
+LOGINFO* SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted);
BOOL SM_ChangeNick(SESSION_INFO *si, GCEVENT *gce);
void SM_FreeSession(SESSION_INFO *si);
char* SM_GetUsers(SESSION_INFO *si);
diff --git a/src/mir_app/src/chat_log.cpp b/src/mir_app/src/chat_log.cpp
index 5bbf07065d..60a68c78cf 100644
--- a/src/mir_app/src/chat_log.cpp
+++ b/src/mir_app/src/chat_log.cpp
@@ -86,10 +86,9 @@ char* Log_SetStyle(int style)
return "";
}
-static int Log_AppendRTF(RtfChatLogStreamData *streamData, bool simpleMode, CMStringA &buf, const wchar_t *line)
+static int Log_AppendRTF(RtfChatLogStreamData *streamData, const LOGINFO &lin, bool simpleMode, CMStringA &buf, const wchar_t *line)
{
int textCharsCount = 0;
- auto &lin = streamData->si->arEvents[streamData->iStartEvent];
for (; *line; line++, textCharsCount++) {
if (*line == '\r' && line[1] == '\n') {
@@ -267,6 +266,7 @@ wchar_t* MakeTimeStamp(wchar_t *pszStamp, time_t time)
static DWORD CALLBACK ChatLogStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
RtfChatLogStreamData *dat = (RtfChatLogStreamData *)dwCookie;
+ auto *si = dat->si;
if (dat->buf.IsEmpty()) {
switch (dat->iStage) {
@@ -276,17 +276,17 @@ static DWORD CALLBACK ChatLogStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, L
break;
case STREAMSTAGE_EVENTS:
- {
- auto &events = dat->si->arEvents;
- if (dat->iStartEvent < events.getCount()) {
- auto *si = dat->si;
- auto &lin = events[dat->iStartEvent];
+ if (!dat->lin) {
+ auto &events = si->arEvents;
+ if (dat->idx < events.getCount()) {
+ auto &lin = events[dat->idx];
if (si->iType == GCW_SERVER || (si->pDlg->m_iLogFilterFlags & lin.iType) != 0)
dat->pLog->CreateChatRtfEvent(dat, lin);
- dat->iStartEvent++;
+ dat->idx++;
break;
}
}
+ else dat->pLog->CreateChatRtfEvent(dat, *dat->lin);
dat->iStage = STREAMSTAGE_TAIL;
__fallthrough;
@@ -312,14 +312,16 @@ static DWORD CALLBACK ChatLogStreamCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, L
return 0;
}
-void CRtfLogWindow::StreamChatRtfEvents(RtfChatLogStreamData *streamData, bool bAppend)
+void CRtfLogWindow::StreamChatRtfEvents(RtfChatLogStreamData *streamData, bool bRedraw)
{
- streamData->bAppend = bAppend;
+ streamData->bRedraw = bRedraw;
+ if (streamData->lin)
+ streamData->idx = streamData->si->arEvents.getCount()-1;
EDITSTREAM stream = {};
stream.pfnCallback = ChatLogStreamCallback;
stream.dwCookie = (DWORD_PTR)streamData;
- m_rtf.SendMsg(EM_STREAMIN, bAppend ? SF_RTF : SFF_SELECTION | SF_RTF, (LPARAM)&stream);
+ m_rtf.SendMsg(EM_STREAMIN, (bRedraw) ? SF_RTF : SFF_SELECTION | SF_RTF, (LPARAM)&stream);
}
/////////////////////////////////////////////////////////////////////////////////////////
@@ -377,7 +379,7 @@ void CRtfLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const L
CMStringA &buf = streamData->buf;
// create new line, and set font and color
- if (streamData->iStartEvent != 0)
+ if (streamData->idx != 0)
buf.Append("\\par ");
buf.AppendFormat("%s ", Log_SetStyle(0));
@@ -414,7 +416,7 @@ void CRtfLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const L
wcsncpy_s(szOldTimeStamp, MakeTimeStamp(g_Settings->pszTimeStamp, si->LastTime), _TRUNCATE);
if (!g_Settings->bShowTimeIfChanged || si->LastTime == 0 || mir_wstrcmp(szTimeStamp, szOldTimeStamp)) {
si->LastTime = lin.time;
- Log_AppendRTF(streamData, true, buf, szTimeStamp);
+ Log_AppendRTF(streamData, lin, true, buf, szTimeStamp);
}
buf.Append("\\tab ");
}
@@ -425,7 +427,7 @@ void CRtfLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const L
CMStringW tmp((lin.bIsMe) ? g_Settings->pszOutgoingNick : g_Settings->pszIncomingNick);
tmp.Replace(L"%n", lin.ptszNick);
- Log_AppendRTF(streamData, TRUE, buf, tmp);
+ Log_AppendRTF(streamData, lin, true, buf, tmp);
buf.AppendChar(' ');
}
@@ -435,11 +437,11 @@ void CRtfLogWindow::CreateChatRtfEvent(RtfChatLogStreamData *streamData, const L
CMStringW wszCaption;
bool bTextUsed = Chat_GetDefaultEventDescr(streamData->si, &lin, wszCaption);
if (!wszCaption.IsEmpty())
- Log_AppendRTF(streamData, !bTextUsed, buf, wszCaption);
+ Log_AppendRTF(streamData, lin, !bTextUsed, buf, wszCaption);
if (!bTextUsed && lin.ptszText) {
if (!wszCaption.IsEmpty())
- Log_AppendRTF(streamData, false, buf, L" ");
- Log_AppendRTF(streamData, false, buf, lin.ptszText);
+ Log_AppendRTF(streamData, lin, false, buf, L" ");
+ Log_AppendRTF(streamData, lin, false, buf, lin.ptszText);
}
}
@@ -450,7 +452,7 @@ void CRtfLogWindow::CreateChatRtfTail(RtfChatLogStreamData *streamData)
{
CMStringA &str = streamData->buf;
- if (streamData->bAppend)
+ if (streamData->bRedraw)
str.Append("\\par}");
else
str.Append("}");;
diff --git a/src/mir_app/src/chat_manager.cpp b/src/mir_app/src/chat_manager.cpp
index e12f308528..a9772c1113 100644
--- a/src/mir_app/src/chat_manager.cpp
+++ b/src/mir_app/src/chat_manager.cpp
@@ -194,10 +194,10 @@ static HICON SM_GetStatusIcon(SESSION_INFO *si, USERINFO *ui)
return g_chatApi.hStatusIcons[0];
}
-BOOL SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted)
+LOGINFO* SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted)
{
if (si == nullptr)
- return TRUE;
+ return nullptr;
LOGINFO *li = new LOGINFO();
li->time = gce->time;
@@ -206,7 +206,7 @@ BOOL SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted)
li->hEvent = gce->hEvent;
if (si->arEvents.find(li)) {
delete li;
- return TRUE;
+ return nullptr;
}
}
else li->hEvent = si->iLastEvent++;
@@ -225,9 +225,8 @@ BOOL SM_AddEvent(SESSION_INFO *si, GCEVENT *gce, bool bIsHighlighted)
si->arEvents.remove(0);
si->bTrimmed = true;
- return FALSE;
}
- return TRUE;
+ return li;
}
BOOL SM_RemoveUser(SESSION_INFO *si, const wchar_t *pszUID)
diff --git a/src/mir_app/src/chat_svc.cpp b/src/mir_app/src/chat_svc.cpp
index a6f665ba5e..64b05b018a 100644
--- a/src/mir_app/src/chat_svc.cpp
+++ b/src/mir_app/src/chat_svc.cpp
@@ -543,12 +543,13 @@ static BOOL HandleChatEvent(GCEVENT &gce, int bManyFix)
if (USERINFO *ui = g_chatApi.UM_FindUser(si, gce.pszUID.w))
gce.pszNick.w = ui->pszNick;
- int isOk = SM_AddEvent(si, &gce, bIsHighlighted);
- if (si->pDlg) {
- if (isOk)
- si->pDlg->AddLog();
- else
- si->pDlg->RedrawLog();
+ if (auto *lin = SM_AddEvent(si, &gce, bIsHighlighted)) {
+ if (si->pDlg) {
+ if (!si->bTrimmed)
+ si->pDlg->AddLog(*lin);
+ else
+ si->pDlg->RedrawLog();
+ }
}
if (!(gce.dwFlags & GCEF_NOTNOTIFY))
diff --git a/src/mir_app/src/mir_app.def b/src/mir_app/src/mir_app.def
index db09732753..8664a4ddf2 100644
--- a/src/mir_app/src/mir_app.def
+++ b/src/mir_app/src/mir_app.def
@@ -324,7 +324,7 @@ Chat_UpdateOptions @418 NONAME
?ShowColorChooser@CSrmmBaseDialog@@QAEXH@Z @421 NONAME
?ShowFilterMenu@CSrmmBaseDialog@@UAEXXZ @422 NONAME
?OnInitDialog@CSrmmBaseDialog@@MAE_NXZ @423 NONAME
-?AddLog@CSrmmBaseDialog@@UAEXXZ @425 NONAME
+?AddLog@CSrmmBaseDialog@@UAEXABULOGINFO@@@Z @425 NONAME
?UpdateNickList@CSrmmBaseDialog@@UAEXXZ @428 NONAME
?onClick_BIU@CSrmmBaseDialog@@IAEXPAVCCtrlButton@@@Z @430 NONAME
?onClick_BkColor@CSrmmBaseDialog@@IAEXPAVCCtrlButton@@@Z @431 NONAME
diff --git a/src/mir_app/src/mir_app64.def b/src/mir_app/src/mir_app64.def
index 63930e04f8..de48b7f87c 100644
--- a/src/mir_app/src/mir_app64.def
+++ b/src/mir_app/src/mir_app64.def
@@ -324,7 +324,7 @@ Chat_UpdateOptions @418 NONAME
?ShowColorChooser@CSrmmBaseDialog@@QEAAXH@Z @421 NONAME
?ShowFilterMenu@CSrmmBaseDialog@@UEAAXXZ @422 NONAME
?OnInitDialog@CSrmmBaseDialog@@MEAA_NXZ @423 NONAME
-?AddLog@CSrmmBaseDialog@@UEAAXXZ @425 NONAME
+?AddLog@CSrmmBaseDialog@@UEAAXAEBULOGINFO@@@Z @425 NONAME
?UpdateNickList@CSrmmBaseDialog@@UEAAXXZ @428 NONAME
?onClick_BIU@CSrmmBaseDialog@@IEAAXPEAVCCtrlButton@@@Z @430 NONAME
?onClick_BkColor@CSrmmBaseDialog@@IEAAXPEAVCCtrlButton@@@Z @431 NONAME
diff --git a/src/mir_app/src/srmm_base.cpp b/src/mir_app/src/srmm_base.cpp
index 94a7a6d21e..a2b0441945 100644
--- a/src/mir_app/src/srmm_base.cpp
+++ b/src/mir_app/src/srmm_base.cpp
@@ -579,13 +579,10 @@ INT_PTR CSrmmBaseDialog::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
return CDlgBase::DlgProc(msg, wParam, lParam);
}
-void CSrmmBaseDialog::AddLog()
+void CSrmmBaseDialog::AddLog(const LOGINFO &lin)
{
- int iEventCount = m_si->arEvents.getCount();
- if (iEventCount)
- m_pLog->LogEvents(m_si, iEventCount-1, false);
- else
- m_pLog->Clear();
+ if (m_si->iType == GCW_SERVER || (m_iLogFilterFlags & lin.iType))
+ m_pLog->LogEvents(&lin);
}
bool CSrmmBaseDialog::AllowTyping() const
@@ -620,7 +617,7 @@ void CSrmmBaseDialog::RedrawLog()
m_si->LastTime = 0;
if (m_si->arEvents.getCount())
- m_pLog->LogEvents(m_si, 0, true);
+ m_pLog->LogEvents(nullptr);
else
ClearLog();
}
@@ -659,7 +656,7 @@ void CSrmmBaseDialog::UpdateChatLog()
}
m_si->bHistoryInit = true;
- m_pLog->LogEvents(m_si, 0, false);
+ m_pLog->LogEvents(nullptr);
}
void CSrmmBaseDialog::UpdateFilterButton()
diff --git a/src/mir_app/src/srmm_log_hpp.cpp b/src/mir_app/src/srmm_log_hpp.cpp
index 052e54c732..7d696d40bb 100644
--- a/src/mir_app/src/srmm_log_hpp.cpp
+++ b/src/mir_app/src/srmm_log_hpp.cpp
@@ -95,6 +95,8 @@ public:
return (wchar_t *)CallService(MS_HPP_EG_EVENT, 0, (LPARAM)&event);
}
+ ////////////////////////////////////////////////////////////////////////////////////////
+
void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override
{
if (!bAppend)
@@ -109,8 +111,13 @@ public:
CallService(MS_HPP_EG_EVENT, 0, (LPARAM)&event);
}
- void CHppLogWindow::LogEvents(SESSION_INFO *si, int iStart, bool) override
+ ////////////////////////////////////////////////////////////////////////////////////////
+
+ void LogEvent(const LOGINFO *lin)
{
+ if (!lin->ptszText)
+ return;
+
IEVIEWEVENTDATA ied = {};
ied.dwFlags = IEEDF_UNICODE_NICK | IEEDF_UNICODE_TEXT;
@@ -122,60 +129,63 @@ public:
event.eventData = &ied;
event.count = 1;
- for (int i=iStart; i < si->arEvents.getCount(); i++) {
- auto &pLog = si->arEvents[i];
-
- if (pLog.ptszText) {
- ied.szNick.w = pLog.ptszNick;
- ied.szText.w = pLog.ptszText;
- ied.time = pLog.time;
- ied.bIsMe = pLog.bIsMe;
-
- switch (pLog.iType) {
- case GC_EVENT_MESSAGE:
- ied.iType = IEED_GC_EVENT_MESSAGE;
- ied.dwData = IEEDD_GC_SHOW_NICK;
- break;
- case GC_EVENT_ACTION:
- ied.iType = IEED_GC_EVENT_ACTION;
- break;
- case GC_EVENT_JOIN:
- ied.iType = IEED_GC_EVENT_JOIN;
- break;
- case GC_EVENT_PART:
- ied.iType = IEED_GC_EVENT_PART;
- break;
- case GC_EVENT_QUIT:
- ied.iType = IEED_GC_EVENT_QUIT;
- break;
- case GC_EVENT_NICK:
- ied.iType = IEED_GC_EVENT_NICK;
- break;
- case GC_EVENT_KICK:
- ied.iType = IEED_GC_EVENT_KICK;
- break;
- case GC_EVENT_NOTICE:
- ied.iType = IEED_GC_EVENT_NOTICE;
- break;
- case GC_EVENT_TOPIC:
- ied.iType = IEED_GC_EVENT_TOPIC;
- break;
- case GC_EVENT_INFORMATION:
- ied.iType = IEED_GC_EVENT_INFORMATION;
- break;
- case GC_EVENT_ADDSTATUS:
- ied.iType = IEED_GC_EVENT_ADDSTATUS;
- break;
- case GC_EVENT_REMOVESTATUS:
- ied.iType = IEED_GC_EVENT_REMOVESTATUS;
- break;
- }
- ied.dwData |= g_Settings->bShowTime ? IEEDD_GC_SHOW_TIME : 0;
- ied.dwData |= IEEDD_GC_SHOW_ICON;
- ied.dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK;
- CallService(MS_HPP_EG_EVENT, 0, (LPARAM) & event);
- }
+ ied.szNick.w = lin->ptszNick;
+ ied.szText.w = lin->ptszText;
+ ied.time = lin->time;
+ ied.bIsMe = lin->bIsMe;
+
+ switch (lin->iType) {
+ case GC_EVENT_MESSAGE:
+ ied.iType = IEED_GC_EVENT_MESSAGE;
+ ied.dwData = IEEDD_GC_SHOW_NICK;
+ break;
+ case GC_EVENT_ACTION:
+ ied.iType = IEED_GC_EVENT_ACTION;
+ break;
+ case GC_EVENT_JOIN:
+ ied.iType = IEED_GC_EVENT_JOIN;
+ break;
+ case GC_EVENT_PART:
+ ied.iType = IEED_GC_EVENT_PART;
+ break;
+ case GC_EVENT_QUIT:
+ ied.iType = IEED_GC_EVENT_QUIT;
+ break;
+ case GC_EVENT_NICK:
+ ied.iType = IEED_GC_EVENT_NICK;
+ break;
+ case GC_EVENT_KICK:
+ ied.iType = IEED_GC_EVENT_KICK;
+ break;
+ case GC_EVENT_NOTICE:
+ ied.iType = IEED_GC_EVENT_NOTICE;
+ break;
+ case GC_EVENT_TOPIC:
+ ied.iType = IEED_GC_EVENT_TOPIC;
+ break;
+ case GC_EVENT_INFORMATION:
+ ied.iType = IEED_GC_EVENT_INFORMATION;
+ break;
+ case GC_EVENT_ADDSTATUS:
+ ied.iType = IEED_GC_EVENT_ADDSTATUS;
+ break;
+ case GC_EVENT_REMOVESTATUS:
+ ied.iType = IEED_GC_EVENT_REMOVESTATUS;
+ break;
+ }
+ ied.dwData |= g_Settings->bShowTime ? IEEDD_GC_SHOW_TIME : 0;
+ ied.dwData |= IEEDD_GC_SHOW_ICON;
+ ied.dwFlags = IEEDF_UNICODE_TEXT | IEEDF_UNICODE_NICK;
+ CallService(MS_HPP_EG_EVENT, 0, (LPARAM)&event);
+ }
+
+ void LogEvents(const LOGINFO *lin) override
+ {
+ if (lin == nullptr) {
+ for (auto &it : m_pDlg.getChat()->arEvents)
+ LogEvent(it);
}
+ else LogEvent(lin);
}
void Resize() override