diff options
| author | George Hazan <ghazan@miranda.im> | 2023-03-30 13:29:59 +0300 | 
|---|---|---|
| committer | George Hazan <ghazan@miranda.im> | 2023-03-30 13:29:59 +0300 | 
| commit | 3b358f31e21e97978db552a2535c056d866b51cf (patch) | |
| tree | 53a396f90dc685c6fd664bde117e2511c3f7030c /plugins/Scriver/src | |
| parent | 7c437a1c960f301af9596e06e505c24b02ae266d (diff) | |
massive code cleaning after regression caused by #3210
Diffstat (limited to 'plugins/Scriver/src')
| -rw-r--r-- | plugins/Scriver/src/msgdialog.cpp | 24 | ||||
| -rw-r--r-- | plugins/Scriver/src/msglog.cpp | 488 | ||||
| -rw-r--r-- | plugins/Scriver/src/msgoptions.cpp | 16 | ||||
| -rw-r--r-- | plugins/Scriver/src/msgs.cpp | 3 | ||||
| -rw-r--r-- | plugins/Scriver/src/msgs.h | 22 | ||||
| -rw-r--r-- | plugins/Scriver/src/resource.h | 3 | ||||
| -rw-r--r-- | plugins/Scriver/src/srmm.cpp | 101 | ||||
| -rw-r--r-- | plugins/Scriver/src/stdafx.h | 3 | 
8 files changed, 329 insertions, 331 deletions
diff --git a/plugins/Scriver/src/msgdialog.cpp b/plugins/Scriver/src/msgdialog.cpp index 8b9778537f..a3b069b3c4 100644 --- a/plugins/Scriver/src/msgdialog.cpp +++ b/plugins/Scriver/src/msgdialog.cpp @@ -23,8 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.  #include "stdafx.h"
 -LIST<CMsgDialog> g_arDialogs(10, PtrKeySortT);
 -
  /////////////////////////////////////////////////////////////////////////////////////////
  static CMStringW GetQuotedTextW(wchar_t *text)
 @@ -140,8 +138,6 @@ CMsgDialog::CMsgDialog(SESSION_INFO *si) :  void CMsgDialog::Init()
  {
 -	g_arDialogs.insert(this);
 -
  	m_autoClose = CLOSE_ON_CANCEL;
  	m_szProto = Proto_GetBaseAccountName(m_hContact);
 @@ -284,8 +280,6 @@ void CMsgDialog::OnDestroy()  {
  	NotifyEvent(MSG_WINDOW_EVT_CLOSING);
 -	g_arDialogs.remove(this);
 -
  	if (m_nTypeMode == PROTOTYPE_SELFTYPING_ON)
  		NotifyTyping(PROTOTYPE_SELFTYPING_OFF);
 @@ -756,24 +750,6 @@ INT_PTR CALLBACK CMsgDialog::FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wPara  /////////////////////////////////////////////////////////////////////////////////////////
 -INT_PTR CLogWindow::WndProc(UINT msg, WPARAM wParam, LPARAM lParam)
 -{
 -	int result = m_pDlg.InputAreaShortcuts(m_rtf.GetHwnd(), msg, wParam, lParam);
 -	if (result != -1)
 -		return result;
 -
 -	switch (msg) {
 -	case WM_MEASUREITEM:
 -		Menu_MeasureItem(lParam);
 -		return TRUE;
 -
 -	case WM_DRAWITEM:
 -		return Menu_DrawItem(lParam);
 -	}
 -
 -	return CSuper::WndProc(msg, wParam, lParam);
 -}
 -
  LRESULT CMsgDialog::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
  {
  	int result = InputAreaShortcuts(m_message.GetHwnd(), msg, wParam, lParam);
 diff --git a/plugins/Scriver/src/msglog.cpp b/plugins/Scriver/src/msglog.cpp index 139fd3eef0..6b4b2266b7 100644 --- a/plugins/Scriver/src/msglog.cpp +++ b/plugins/Scriver/src/msglog.cpp @@ -696,262 +696,304 @@ void FreeMsgLogIcons(void)  }
  /////////////////////////////////////////////////////////////////////////////////////////
 +// CLogWindow - built-in log window
 -void CLogWindow::Attach()
 +class CLogWindow : public CRtfLogWindow
  {
 -	CSuper::Attach();
 -
 -	uint32_t dwExStyle = GetWindowLongPtr(m_rtf.GetHwnd(), GWL_EXSTYLE);
 -	SetWindowLongPtr(m_rtf.GetHwnd(), GWL_EXSTYLE, (m_pDlg.m_bUseRtl) ? dwExStyle | WS_EX_LEFTSCROLLBAR : dwExStyle & ~WS_EX_LEFTSCROLLBAR);
 -
 -	// Workaround to make Richedit display RTL messages correctly
 -	PARAFORMAT2 pf2;
 -	memset(&pf2, 0, sizeof(pf2));
 -	pf2.cbSize = sizeof(pf2);
 -	pf2.dwMask = PFM_RTLPARA | PFM_OFFSETINDENT | PFM_RIGHTINDENT;
 -	pf2.wEffects = PFE_RTLPARA;
 -	pf2.dxStartIndent = 30;
 -	pf2.dxRightIndent = 30;
 -	m_rtf.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2);
 -
 -	pf2.dwMask = PFM_RTLPARA;
 -	pf2.wEffects = 0;
 -	m_rtf.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2);
 -
 -	m_rtf.SendMsg(EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS | ENM_LINK | ENM_KEYEVENTS);
 -	m_rtf.SendMsg(EM_SETEDITSTYLE, SES_EXTENDBACKCOLOR, SES_EXTENDBACKCOLOR);
 -	m_rtf.SendMsg(EM_SETLANGOPTIONS, 0, (LPARAM)m_rtf.SendMsg(EM_GETLANGOPTIONS, 0, 0) & ~(IMF_AUTOKEYBOARD | IMF_AUTOFONTSIZEADJUST));
 -	m_rtf.SendMsg(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(0, 0));
 -	m_rtf.SendMsg(EM_LIMITTEXT, 0x7FFFFFFF, 0);
 -	m_rtf.SendMsg(EM_HIDESELECTION, TRUE, 0);
 -	m_rtf.SendMsg(EM_AUTOURLDETECT, TRUE, 0);
 -}
 -
 -void CLogWindow::LogEvents(MEVENT hDbEventFirst, int count, bool bAppend)
 -{
 -	CHARRANGE oldSel, sel;
 -	m_rtf.SetDraw(false);
 -	m_rtf.SendMsg(EM_EXGETSEL, 0, (LPARAM)&oldSel);
 -
 -	LogStreamData streamData = {};
 -	streamData.hContact = m_pDlg.m_hContact;
 -	streamData.hDbEvent = hDbEventFirst;
 -	streamData.hDbEventLast = m_pDlg.m_hDbEventLast;
 -	streamData.dlgDat = &m_pDlg;
 -	streamData.eventsToInsert = count;
 -	streamData.isFirst = bAppend ? m_rtf.GetRichTextLength() == 0 : 1;
 -	streamData.gdat = &g_dat;
 -
 -	EDITSTREAM stream = {};
 -	stream.pfnCallback = LogStreamInEvents;
 -	stream.dwCookie = (DWORD_PTR)&streamData;
 -	sel.cpMin = 0;
 -
 -	POINT scrollPos;
 -	bool bottomScroll = (GetFocus() != m_rtf.GetHwnd());
 -	if (bottomScroll && (GetWindowLongPtr(m_rtf.GetHwnd(), GWL_STYLE) & WS_VSCROLL)) {
 -		SCROLLINFO si = {};
 -		si.cbSize = sizeof(si);
 -		si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
 -		GetScrollInfo(m_rtf.GetHwnd(), SB_VERT, &si);
 -		bottomScroll = (si.nPos + (int)si.nPage) >= si.nMax;
 -	}
 -	if (!bottomScroll)
 -		m_rtf.SendMsg(EM_GETSCROLLPOS, 0, (LPARAM)&scrollPos);
 -
 -	FINDTEXTEXA fi;
 -	if (bAppend) {
 -		GETTEXTLENGTHEX gtxl = { 0 };
 -		gtxl.flags = GTL_DEFAULT | GTL_PRECISE | GTL_NUMCHARS;
 -		gtxl.codepage = 1200;
 -		fi.chrg.cpMin = m_rtf.SendMsg(EM_GETTEXTLENGTHEX, (WPARAM)>xl, 0);
 -		sel.cpMin = sel.cpMax = m_rtf.GetRichTextLength();
 -		m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 -	}
 -	else {
 +	typedef CRtfLogWindow CSuper;
 +
 +public:
 +	CLogWindow(CMsgDialog &pDlg) :
 +		CSuper(pDlg)
 +	{}
 +
 +	void Attach() override
 +	{
 +		CSuper::Attach();
 +
 +		uint32_t dwExStyle = GetWindowLongPtr(m_rtf.GetHwnd(), GWL_EXSTYLE);
 +		SetWindowLongPtr(m_rtf.GetHwnd(), GWL_EXSTYLE, (m_pDlg.m_bUseRtl) ? dwExStyle | WS_EX_LEFTSCROLLBAR : dwExStyle & ~WS_EX_LEFTSCROLLBAR);
 +
 +		// Workaround to make Richedit display RTL messages correctly
 +		PARAFORMAT2 pf2;
 +		memset(&pf2, 0, sizeof(pf2));
 +		pf2.cbSize = sizeof(pf2);
 +		pf2.dwMask = PFM_RTLPARA | PFM_OFFSETINDENT | PFM_RIGHTINDENT;
 +		pf2.wEffects = PFE_RTLPARA;
 +		pf2.dxStartIndent = 30;
 +		pf2.dxRightIndent = 30;
 +		m_rtf.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2);
 +
 +		pf2.dwMask = PFM_RTLPARA;
 +		pf2.wEffects = 0;
 +		m_rtf.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2);
 +
 +		m_rtf.SendMsg(EM_SETEVENTMASK, 0, ENM_MOUSEEVENTS | ENM_LINK | ENM_KEYEVENTS);
 +		m_rtf.SendMsg(EM_SETEDITSTYLE, SES_EXTENDBACKCOLOR, SES_EXTENDBACKCOLOR);
 +		m_rtf.SendMsg(EM_SETLANGOPTIONS, 0, (LPARAM)m_rtf.SendMsg(EM_GETLANGOPTIONS, 0, 0) & ~(IMF_AUTOKEYBOARD | IMF_AUTOFONTSIZEADJUST));
 +		m_rtf.SendMsg(EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(0, 0));
 +		m_rtf.SendMsg(EM_LIMITTEXT, 0x7FFFFFFF, 0);
 +		m_rtf.SendMsg(EM_HIDESELECTION, TRUE, 0);
 +		m_rtf.SendMsg(EM_AUTOURLDETECT, TRUE, 0);
 +	}
 +
 +	void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override
 +	{
 +		CHARRANGE oldSel, sel;
  		m_rtf.SetDraw(false);
 -		m_rtf.SetTextA("");
 +		m_rtf.SendMsg(EM_EXGETSEL, 0, (LPARAM)&oldSel);
 +
 +		LogStreamData streamData = {};
 +		streamData.hContact = m_pDlg.m_hContact;
 +		streamData.hDbEvent = hDbEventFirst;
 +		streamData.hDbEventLast = m_pDlg.m_hDbEventLast;
 +		streamData.dlgDat = &m_pDlg;
 +		streamData.eventsToInsert = count;
 +		streamData.isFirst = bAppend ? m_rtf.GetRichTextLength() == 0 : 1;
 +		streamData.gdat = &g_dat;
 +
 +		EDITSTREAM stream = {};
 +		stream.pfnCallback = LogStreamInEvents;
 +		stream.dwCookie = (DWORD_PTR)&streamData;
  		sel.cpMin = 0;
 -		sel.cpMax = m_rtf.GetRichTextLength();
 -		m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 -		fi.chrg.cpMin = 0;
 -		m_pDlg.m_isMixed = 0;
 -	}
 -	m_rtf.SendMsg(EM_STREAMIN, bAppend ? SFF_SELECTION | SF_RTF : SFF_SELECTION | SF_RTF, (LPARAM)&stream);
 -	if (bottomScroll) {
 -		sel.cpMin = sel.cpMax = -1;
 -		m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 -	}
 -	else {
 -		m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&oldSel);
 -		m_rtf.SendMsg(EM_SETSCROLLPOS, 0, (LPARAM)&scrollPos);
 -	}
 +		POINT scrollPos;
 +		bool bottomScroll = (GetFocus() != m_rtf.GetHwnd());
 +		if (bottomScroll && (GetWindowLongPtr(m_rtf.GetHwnd(), GWL_STYLE) & WS_VSCROLL)) {
 +			SCROLLINFO si = {};
 +			si.cbSize = sizeof(si);
 +			si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
 +			GetScrollInfo(m_rtf.GetHwnd(), SB_VERT, &si);
 +			bottomScroll = (si.nPos + (int)si.nPage) >= si.nMax;
 +		}
 +		if (!bottomScroll)
 +			m_rtf.SendMsg(EM_GETSCROLLPOS, 0, (LPARAM)&scrollPos);
 +
 +		FINDTEXTEXA fi;
 +		if (bAppend) {
 +			GETTEXTLENGTHEX gtxl = { 0 };
 +			gtxl.flags = GTL_DEFAULT | GTL_PRECISE | GTL_NUMCHARS;
 +			gtxl.codepage = 1200;
 +			fi.chrg.cpMin = m_rtf.SendMsg(EM_GETTEXTLENGTHEX, (WPARAM)>xl, 0);
 +			sel.cpMin = sel.cpMax = m_rtf.GetRichTextLength();
 +			m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 +		}
 +		else {
 +			m_rtf.SetDraw(false);
 +			m_rtf.SetTextA("");
 +			sel.cpMin = 0;
 +			sel.cpMax = m_rtf.GetRichTextLength();
 +			m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 +			fi.chrg.cpMin = 0;
 +			m_pDlg.m_isMixed = 0;
 +		}
 +
 +		m_rtf.SendMsg(EM_STREAMIN, bAppend ? SFF_SELECTION | SF_RTF : SFF_SELECTION | SF_RTF, (LPARAM)&stream);
 +		if (bottomScroll) {
 +			sel.cpMin = sel.cpMax = -1;
 +			m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 +		}
 +		else {
 +			m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&oldSel);
 +			m_rtf.SendMsg(EM_SETSCROLLPOS, 0, (LPARAM)&scrollPos);
 +		}
 +
 +		if (g_dat.smileyAddInstalled) {
 +			SMADD_RICHEDIT3 smre;
 +			smre.cbSize = sizeof(SMADD_RICHEDIT3);
 +			smre.hwndRichEditControl = m_rtf.GetHwnd();
 -	if (g_dat.smileyAddInstalled) {
 -		SMADD_RICHEDIT3 smre;
 -		smre.cbSize = sizeof(SMADD_RICHEDIT3);
 -		smre.hwndRichEditControl = m_rtf.GetHwnd();
 +			MCONTACT hContact = db_mc_getSrmmSub(m_pDlg.m_hContact);
 +			smre.Protocolname = (hContact != 0) ? Proto_GetBaseAccountName(hContact) : m_pDlg.m_szProto;
 -		MCONTACT hContact = db_mc_getSrmmSub(m_pDlg.m_hContact);
 -		smre.Protocolname = (hContact != 0) ? Proto_GetBaseAccountName(hContact) : m_pDlg.m_szProto;
 +			if (fi.chrg.cpMin > 0) {
 +				sel.cpMin = fi.chrg.cpMin;
 +				sel.cpMax = -1;
 +				smre.rangeToReplace = &sel;
 +			}
 +			else smre.rangeToReplace = nullptr;
 -		if (fi.chrg.cpMin > 0) {
 -			sel.cpMin = fi.chrg.cpMin;
 -			sel.cpMax = -1;
 -			smre.rangeToReplace = &sel;
 +			smre.disableRedraw = TRUE;
 +			smre.hContact = m_pDlg.m_hContact;
 +			smre.flags = 0;
 +			CallService(MS_SMILEYADD_REPLACESMILEYS, 0, (LPARAM)&smre);
  		}
 -		else smre.rangeToReplace = nullptr;
 -		smre.disableRedraw = TRUE;
 -		smre.hContact = m_pDlg.m_hContact;
 -		smre.flags = 0;
 -		CallService(MS_SMILEYADD_REPLACESMILEYS, 0, (LPARAM)&smre);
 -	}
 +		m_rtf.SetDraw(true);
 +		if (bottomScroll) {
 +			ScrollToBottom();
 +			RedrawWindow(m_rtf.GetHwnd(), nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW);
 +		}
 -	m_rtf.SetDraw(true);
 -	if (bottomScroll) {
 -		ScrollToBottom();
 -		RedrawWindow(m_rtf.GetHwnd(), nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW);
 +		m_pDlg.m_hDbEventLast = streamData.hDbEventLast;
  	}
 -	m_pDlg.m_hDbEventLast = streamData.hDbEventLast;
 -}
 +	void LogEvents(struct LOGINFO *lin, bool bRedraw) override
 +	{
 +		auto *si = m_pDlg.m_si;
 +		if (m_rtf.GetHwnd() == nullptr || lin == nullptr || si == nullptr)
 +			return;
 -void CLogWindow::LogEvents(LOGINFO *lin, bool bRedraw)
 -{
 -	auto *si = m_pDlg.m_si;
 -	if (m_rtf.GetHwnd() == nullptr || lin == nullptr || si == nullptr)
 -		return;
 +		if (!bRedraw && (si->iType == GCW_CHATROOM || si->iType == GCW_PRIVMESS) && m_pDlg.m_bFilterEnabled && !(m_pDlg.m_iLogFilterFlags & lin->iType))
 +			return;
 -	if (!bRedraw && (si->iType == GCW_CHATROOM || si->iType == GCW_PRIVMESS) && m_pDlg.m_bFilterEnabled && !(m_pDlg.m_iLogFilterFlags & lin->iType))
 -		return;
 +		LOGSTREAMDATA streamData;
 +		memset(&streamData, 0, sizeof(streamData));
 +		streamData.hwnd = m_rtf.GetHwnd();
 +		streamData.si = si;
 +		streamData.lin = lin;
 +		streamData.bStripFormat = FALSE;
 +		streamData.isFirst = bRedraw ? 1 : m_rtf.GetRichTextLength() == 0;
 -	LOGSTREAMDATA streamData;
 -	memset(&streamData, 0, sizeof(streamData));
 -	streamData.hwnd = m_rtf.GetHwnd();
 -	streamData.si = si;
 -	streamData.lin = lin;
 -	streamData.bStripFormat = FALSE;
 -	streamData.isFirst = bRedraw ? 1 : m_rtf.GetRichTextLength() == 0;
 +		EDITSTREAM stream = {};
 +		stream.pfnCallback = Srmm_LogStreamCallback;
 +		stream.dwCookie = (DWORD_PTR)&streamData;
 -	EDITSTREAM stream = {};
 -	stream.pfnCallback = Srmm_LogStreamCallback;
 -	stream.dwCookie = (DWORD_PTR)&streamData;
 +		SCROLLINFO scroll;
 +		scroll.cbSize = sizeof(SCROLLINFO);
 +		scroll.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
 +		GetScrollInfo(m_rtf.GetHwnd(), SB_VERT, &scroll);
 -	SCROLLINFO scroll;
 -	scroll.cbSize = sizeof(SCROLLINFO);
 -	scroll.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
 -	GetScrollInfo(m_rtf.GetHwnd(), SB_VERT, &scroll);
 +		POINT point = {};
 +		m_rtf.SendMsg(EM_GETSCROLLPOS, 0, (LPARAM)&point);
 -	POINT point = {};
 -	m_rtf.SendMsg(EM_GETSCROLLPOS, 0, (LPARAM)&point);
 +		// do not scroll to bottom if there is a selection
 +		CHARRANGE oldsel, sel, newsel;
 +		m_rtf.SendMsg(EM_EXGETSEL, 0, (LPARAM)&oldsel);
 +		if (oldsel.cpMax != oldsel.cpMin)
 +			m_rtf.SetDraw(false);
 -	// do not scroll to bottom if there is a selection
 -	CHARRANGE oldsel, sel, newsel;
 -	m_rtf.SendMsg(EM_EXGETSEL, 0, (LPARAM)&oldsel);
 -	if (oldsel.cpMax != oldsel.cpMin)
 -		m_rtf.SetDraw(false);
 +		// set the insertion point at the bottom
 +		sel.cpMin = sel.cpMax = m_rtf.GetRichTextLength();
 +		m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 +		m_rtf.SendMsg(EM_EXGETSEL, 0, (LPARAM)&sel);
 -	// set the insertion point at the bottom
 -	sel.cpMin = sel.cpMax = m_rtf.GetRichTextLength();
 -	m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 -	m_rtf.SendMsg(EM_EXGETSEL, 0, (LPARAM)&sel);
 +		// fix for the indent... must be a M$ bug
 +		if (sel.cpMax == 0)
 +			bRedraw = TRUE;
 -	// fix for the indent... must be a M$ bug
 -	if (sel.cpMax == 0)
 -		bRedraw = TRUE;
 +		// should the event(s) be appended to the current log
 +		WPARAM wp = bRedraw ? SF_RTF : SFF_SELECTION | SF_RTF;
 -	// should the event(s) be appended to the current log
 -	WPARAM wp = bRedraw ? SF_RTF : SFF_SELECTION | SF_RTF;
 +		// get the number of pixels per logical inch
 +		bool bFlag = false;
 +		if (bRedraw) {
 +			m_rtf.SetDraw(false);
 +			bFlag = true;
 +		}
 -	// get the number of pixels per logical inch
 -	bool bFlag = false;
 -	if (bRedraw) {
 -		m_rtf.SetDraw(false);
 -		bFlag = true;
 -	}
 -
 -	// stream in the event(s)
 -	streamData.lin = lin;
 -	streamData.bRedraw = bRedraw;
 -	m_rtf.SendMsg(EM_STREAMIN, wp, (LPARAM)&stream);
 -
 -	// do smileys
 -	if (g_dat.smileyAddInstalled && (bRedraw || (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)
 -			newsel.cpMin = 0;
 -
 -		SMADD_RICHEDIT3 sm = { sizeof(sm) };
 -		sm.hwndRichEditControl = m_rtf.GetHwnd();
 -		sm.Protocolname = si->pszModule;
 -		sm.rangeToReplace = bRedraw ? nullptr : &newsel;
 -		sm.flags = 0;
 -		sm.disableRedraw = TRUE;
 -		sm.hContact = m_pDlg.m_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 (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);
 +		// stream in the event(s)
 +		streamData.lin = lin;
 +		streamData.bRedraw = bRedraw;
 +		m_rtf.SendMsg(EM_STREAMIN, wp, (LPARAM)&stream);
 +
 +		// do smileys
 +		if (g_dat.smileyAddInstalled && (bRedraw || (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)
 +				newsel.cpMin = 0;
 +
 +			SMADD_RICHEDIT3 sm = { sizeof(sm) };
 +			sm.hwndRichEditControl = m_rtf.GetHwnd();
 +			sm.Protocolname = si->pszModule;
 +			sm.rangeToReplace = bRedraw ? nullptr : &newsel;
 +			sm.flags = 0;
 +			sm.disableRedraw = TRUE;
 +			sm.hContact = m_pDlg.m_hContact;
 +			CallService(MS_SMILEYADD_REPLACESMILEYS, 0, (LPARAM)&sm);
 +		}
 -	// do we need to restore the selection
 -	if (oldsel.cpMax != oldsel.cpMin) {
 -		m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&oldsel);
 -		m_rtf.SetDraw(true);
 -		InvalidateRect(m_rtf.GetHwnd(), nullptr, TRUE);
 -	}
 +		// scroll log to bottom if the log was previously scrolled to bottom, else restore old position
 +		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);
 -	// need to invalidate the window
 -	if (bFlag) {
 -		sel.cpMin = sel.cpMax = m_rtf.GetRichTextLength();
 -		m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 -		m_rtf.SetDraw(true);
 -		InvalidateRect(m_rtf.GetHwnd(), nullptr, TRUE);
 +		// do we need to restore the selection
 +		if (oldsel.cpMax != oldsel.cpMin) {
 +			m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&oldsel);
 +			m_rtf.SetDraw(true);
 +			InvalidateRect(m_rtf.GetHwnd(), nullptr, TRUE);
 +		}
 +
 +		// need to invalidate the window
 +		if (bFlag) {
 +			sel.cpMin = sel.cpMax = m_rtf.GetRichTextLength();
 +			m_rtf.SendMsg(EM_EXSETSEL, 0, (LPARAM)&sel);
 +			m_rtf.SetDraw(true);
 +			InvalidateRect(m_rtf.GetHwnd(), nullptr, TRUE);
 +		}
  	}
 -}
 -void CLogWindow::ScrollToBottom()
 -{
 -	if (GetWindowLongPtr(m_rtf.GetHwnd(), GWL_STYLE) & WS_VSCROLL) {
 -		SCROLLINFO si = { sizeof(si) };
 -		si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
 -		if (GetScrollInfo(m_rtf.GetHwnd(), SB_VERT, &si)) {
 -			if (m_rtf.GetHwnd() != GetFocus()) {
 -				si.fMask = SIF_POS;
 -				si.nPos = si.nMax - si.nPage + 1;
 -				SetScrollInfo(m_rtf.GetHwnd(), SB_VERT, &si, TRUE);
 -
 -				PostMessage(m_rtf.GetHwnd(), WM_VSCROLL, MAKEWPARAM(SB_BOTTOM, 0), 0);
 +	void ScrollToBottom() override
 +	{
 +		if (GetWindowLongPtr(m_rtf.GetHwnd(), GWL_STYLE) & WS_VSCROLL) {
 +			SCROLLINFO si = { sizeof(si) };
 +			si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
 +			if (GetScrollInfo(m_rtf.GetHwnd(), SB_VERT, &si)) {
 +				if (m_rtf.GetHwnd() != GetFocus()) {
 +					si.fMask = SIF_POS;
 +					si.nPos = si.nMax - si.nPage + 1;
 +					SetScrollInfo(m_rtf.GetHwnd(), SB_VERT, &si, TRUE);
 +
 +					PostMessage(m_rtf.GetHwnd(), WM_VSCROLL, MAKEWPARAM(SB_BOTTOM, 0), 0);
 +				}
  			}
  		}
  	}
 -}
 -void CLogWindow::UpdateOptions()
 -{
 -	if (m_pDlg.isChat())
 -		m_rtf.SendMsg(EM_SETBKGNDCOLOR, 0, g_Settings.crLogBackground);
 -	else
 -		m_rtf.SendMsg(EM_SETBKGNDCOLOR, 0, g_plugin.getDword(SRMSGSET_BKGCOLOUR, SRMSGDEFSET_BKGCOLOUR));
 -
 -	PARAFORMAT2 pf2;
 -	memset(&pf2, 0, sizeof(pf2));
 -	pf2.cbSize = sizeof(pf2);
 -	pf2.dwMask = PFM_OFFSET;
 -	pf2.dxOffset = (g_dat.flags.bIndentText) ? g_dat.indentSize * 1440 / g_dat.logPixelSX : 0;
 -	m_rtf.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2);
 -	m_rtf.SendMsg(EM_SETLANGOPTIONS, 0, (LPARAM)m_rtf.SendMsg(EM_GETLANGOPTIONS, 0, 0) & ~(IMF_AUTOKEYBOARD | IMF_AUTOFONTSIZEADJUST));
 -	
 -	Clear();
 -}
 +	void UpdateOptions() override
 +	{
 +		if (m_pDlg.isChat())
 +			m_rtf.SendMsg(EM_SETBKGNDCOLOR, 0, g_Settings.crLogBackground);
 +		else
 +			m_rtf.SendMsg(EM_SETBKGNDCOLOR, 0, g_plugin.getDword(SRMSGSET_BKGCOLOUR, SRMSGDEFSET_BKGCOLOUR));
 +
 +		PARAFORMAT2 pf2;
 +		memset(&pf2, 0, sizeof(pf2));
 +		pf2.cbSize = sizeof(pf2);
 +		pf2.dwMask = PFM_OFFSET;
 +		pf2.dxOffset = (g_dat.flags.bIndentText) ? g_dat.indentSize * 1440 / g_dat.logPixelSX : 0;
 +		m_rtf.SendMsg(EM_SETPARAFORMAT, 0, (LPARAM)&pf2);
 +		m_rtf.SendMsg(EM_SETLANGOPTIONS, 0, (LPARAM)m_rtf.SendMsg(EM_GETLANGOPTIONS, 0, 0) & ~(IMF_AUTOKEYBOARD | IMF_AUTOFONTSIZEADJUST));
 +
 +		Clear();
 +	}
 +
 +	INT_PTR WndProc(UINT msg, WPARAM wParam, LPARAM lParam) override
 +	{
 +		int result = m_pDlg.InputAreaShortcuts(m_rtf.GetHwnd(), msg, wParam, lParam);
 +		if (result != -1)
 +			return result;
 +
 +		switch (msg) {
 +		case WM_MEASUREITEM:
 +			Menu_MeasureItem(lParam);
 +			return TRUE;
 +
 +		case WM_DRAWITEM:
 +			return Menu_DrawItem(lParam);
 +
 +		case WM_LBUTTONUP:
 +			if (g_plugin.bAutoCopy) {
 +				CHARRANGE sel;
 +				SendMessage(m_rtf.GetHwnd(), EM_EXGETSEL, 0, (LPARAM)&sel);
 +				if (sel.cpMin != sel.cpMax) {
 +					SendMessage(m_rtf.GetHwnd(), WM_COPY, 0, 0);
 +					sel.cpMin = sel.cpMax;
 +					SendMessage(m_rtf.GetHwnd(), EM_EXSETSEL, 0, (LPARAM)&sel);
 +				}
 +				SetFocus(m_pDlg.m_message.GetHwnd());
 +			}
 +			break;
 +		}
 +
 +		return CSuper::WndProc(msg, wParam, lParam);
 +	}
 +};
 -CSrmmLogWindow *logBuilder(CMsgDialog &pDlg)
 +CSrmmLogWindow* logBuilder(CMsgDialog &pDlg)
  {
  	return new CLogWindow(pDlg);
  }
 diff --git a/plugins/Scriver/src/msgoptions.cpp b/plugins/Scriver/src/msgoptions.cpp index 8ddb352a08..226307dcd2 100644 --- a/plugins/Scriver/src/msgoptions.cpp +++ b/plugins/Scriver/src/msgoptions.cpp @@ -498,7 +498,7 @@ class CLogOptionsDlg : public CBaseOptionDlg  {
  	CCtrlSpin spinCount, spinTime, spinIndent;
  	CCtrlCheck chkLoadUnread, chkLoadCount, chkLoadTime;
 -	CCtrlCheck chkShowIcons, chkShowTime, chkShowSecs, chkShowDate, chkLongDate, chkRelativeDate;
 +	CCtrlCheck chkShowIcons, chkShowTime, chkShowSecs, chkShowDate, chkLongDate, chkRelativeDate, chkAutoCopy;
  	CCtrlCheck chkGroupMsg, chkIndentText, chkHideNames, chkMarkFollowups, chkMsgOnNewline, chkDrawLines;
  	CCtrlRichEdit m_rtf;
  	CCtrlHyperlink m_fonts;
 @@ -536,21 +536,22 @@ public:  		CBaseOptionDlg(IDD_OPT_MSGLOG),
  		m_rtf(this, IDC_SRMM_LOG),
  		m_fonts(this, IDC_FONTSCOLORS),
 +		chkLoadTime(this, IDC_LOADTIME),
 +		chkLoadCount(this, IDC_LOADCOUNT),
 +		chkLoadUnread(this, IDC_LOADUNREAD),
  		chkShowTime(this, IDC_SHOWTIMES),
  		chkShowSecs(this, IDC_SHOWSECONDS),
  		chkShowDate(this, IDC_SHOWDATES),
  		chkLongDate(this, IDC_USELONGDATE),
 -		chkRelativeDate(this, IDC_USERELATIVEDATE),
 +		chkAutoCopy(this, IDC_AUTOCOPY),
  		chkGroupMsg(this, IDC_GROUPMESSAGES),
 -		chkMarkFollowups(this, IDC_MARKFOLLOWUPS),
 +		chkHideNames(this, IDC_HIDENAMES),
  		chkDrawLines(this, IDC_DRAWLINES),
  		chkShowIcons(this, IDC_SHOWLOGICONS),
  		chkIndentText(this, IDC_INDENTTEXT),
 -		chkHideNames(this, IDC_HIDENAMES),
 +		chkRelativeDate(this, IDC_USERELATIVEDATE),
 +		chkMarkFollowups(this, IDC_MARKFOLLOWUPS),
  		chkMsgOnNewline(this, IDC_MESSAGEONNEWLINE),
 -		chkLoadTime(this, IDC_LOADTIME),
 -		chkLoadCount(this, IDC_LOADCOUNT),
 -		chkLoadUnread(this, IDC_LOADUNREAD),
  		spinTime(this, IDC_LOADTIMESPIN, 12 * 60),
  		spinCount(this, IDC_LOADCOUNTSPIN, 100),
  		spinIndent(this, IDC_INDENTSPIN, 999)
 @@ -560,6 +561,7 @@ public:  		CreateLink(chkShowTime, g_plugin.bShowTime);
  		CreateLink(chkShowSecs, g_plugin.bShowSeconds);
  		CreateLink(chkShowDate, g_plugin.bShowDate);
 +		CreateLink(chkAutoCopy, g_plugin.bAutoCopy);
  		CreateLink(chkLongDate, g_plugin.bLongDate);
  		CreateLink(chkGroupMsg, g_plugin.bGroupMessages);
  		CreateLink(chkShowIcons, g_plugin.bShowIcons);
 diff --git a/plugins/Scriver/src/msgs.cpp b/plugins/Scriver/src/msgs.cpp index 8302c903ce..498dfe43e3 100644 --- a/plugins/Scriver/src/msgs.cpp +++ b/plugins/Scriver/src/msgs.cpp @@ -486,9 +486,6 @@ static int OnModulesLoaded(WPARAM, LPARAM)  int OnSystemPreshutdown(WPARAM, LPARAM)
  {
 -	for (auto &it : g_arDialogs.rev_iter())
 -		it->CloseTab();
 -
  	WindowList_Broadcast(g_dat.hParentWindowList, WM_CLOSE, 0, 0);
  	return 0;
  }
 diff --git a/plugins/Scriver/src/msgs.h b/plugins/Scriver/src/msgs.h index 679a0eaa6b..3daa951eea 100644 --- a/plugins/Scriver/src/msgs.h +++ b/plugins/Scriver/src/msgs.h @@ -24,28 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.  #define SRMM_MSGS_H
  /////////////////////////////////////////////////////////////////////////////////////////
 -// CLogWindow - built-in log window
 -
 -class CLogWindow : public CRtfLogWindow
 -{
 -	typedef CRtfLogWindow CSuper;
 -
 -public:
 -	CLogWindow(CMsgDialog &pDlg) :
 -		CSuper(pDlg)
 -	{
 -	}
 -
 -	void Attach() override;
 -	void LogEvents(MEVENT hDbEventFirst, int count, bool bAppend) override;
 -	void LogEvents(struct LOGINFO *, bool) override;
 -	void ScrollToBottom() override;
 -	void UpdateOptions() override;
 -
 -	INT_PTR WndProc(UINT msg, WPARAM wParam, LPARAM lParam) override;
 -};
 -
 -/////////////////////////////////////////////////////////////////////////////////////////
  #define MSGERROR_CANCEL	0
  #define MSGERROR_RETRY	1
 diff --git a/plugins/Scriver/src/resource.h b/plugins/Scriver/src/resource.h index 51c25fa42e..888a2f4974 100644 --- a/plugins/Scriver/src/resource.h +++ b/plugins/Scriver/src/resource.h @@ -1,6 +1,6 @@  //{{NO_DEPENDENCIES}}
  // Microsoft Visual C++ generated include file.
 -// Used by C:\Users\georg\DiskW\miranda-ng\plugins\Scriver\res\resource.rc
 +// Used by W:\miranda-ng\plugins\Scriver\res\resource.rc
  //
  #define VS_VERSION_INFO                 1
  #define IDD_MSGWIN                      100
 @@ -138,6 +138,7 @@  #define IDC_TRANSPARENCYTEXT1           1627
  #define IDC_TRANSPARENCYTEXT2           1628
  #define IDC_DRAWLINES                   1629
 +#define IDC_AUTOCOPY                    1630
  #define IDC_SAVEDRAFTS                  1631
  #define IDC_POPLIST                     1632
  #define IDC_LIMITNAMESLEN               1633
 diff --git a/plugins/Scriver/src/srmm.cpp b/plugins/Scriver/src/srmm.cpp index a57dfc860b..242673aefa 100644 --- a/plugins/Scriver/src/srmm.cpp +++ b/plugins/Scriver/src/srmm.cpp @@ -47,55 +47,56 @@ PLUGININFOEX pluginInfoEx = {  CMPlugin::CMPlugin() :
  	PLUGIN<CMPlugin>(SRMM_MODULE, pluginInfoEx),
 -	bCascade(SRMM_MODULE, "Cascade", 1),
 -	bAutoMin(SRMM_MODULE, "AutoMin", 0),
 -	bTopmost(SRMM_MODULE, "Topmost", 0),
 -	bDelTemp(SRMM_MODULE, "DeleteTempCont", 0),
 -	bTypingNew(SRMM_MODULE, "DefaultTyping", 1),
 -	bAutoClose(SRMM_MODULE, "AutoClose", 0),
 -	bAutoPopup(SRMM_MODULE, "AutoPopupMsg", 0),
 -	bSaveDrafts(SRMM_MODULE, "SaveDrafts", 0),
 -	bTypingUnknown(SRMM_MODULE, "UnknownTyping", 0),
 -	bHideContainer(SRMM_MODULE, "HideContainers", 0),
 -	bStayMinimized(SRMM_MODULE, "StayMinimized", 0),
 -	bSavePerContact(SRMM_MODULE, "SavePerContact", 0),
 -
 -	bShowAvatar(SRMM_MODULE, "AvatarEnable", 1),
 -	bShowProgress(SRMM_MODULE, "ShowProgress", 0),
 -	bShowIcons(SRMM_MODULE, "ShowLogIcon", 1),
 -	bShowTime(SRMM_MODULE, "ShowTime", 1),
 -	bShowSeconds(SRMM_MODULE, "ShowSeconds", 1),
 -	bShowDate(SRMM_MODULE, "ShowDate", 0),
 -	bLongDate(SRMM_MODULE, "UseLongDate", 0),
 -	bRelativeDate(SRMM_MODULE, "UseRelativeDate", 0),
 -	bDrawLines(SRMM_MODULE, "DrawLines", 0),
 -	bHideNames(SRMM_MODULE, "HideNames", 1),
 -	bIndentText(SRMM_MODULE, "IndentText", 0),
 -	bGroupMessages(SRMM_MODULE, "GroupMessages", 0),
 -	bMarkFollowups(SRMM_MODULE, "MarkFollowUps", 0),
 -	bMsgOnNewline(SRMM_MODULE, "MessageOnNewLine", 0),
 -	bUseTransparency(SRMM_MODULE, "UseTransparency", 0),
 -
 -	bShowToolBar(SRMM_MODULE, "ShowButtonLine", 1),
 -	bShowInfoBar(SRMM_MODULE, "ShowInfoBar", 1),
 -	bShowTitleBar(SRMM_MODULE, "ShowTitleBar", 1),
 -	bShowStatusBar(SRMM_MODULE, "ShowStatusBar", 1),
 -
 -	bUseTabs(SRMM_MODULE, "UseTabs", 1),
 -	bLimitTabs(SRMM_MODULE, "LimitTabs", 0),
 -	bLimitChatTabs(SRMM_MODULE, "LimitChatsTabs", 0),
 -	bLimitNames(SRMM_MODULE, "LimitNamesOnTabs", 1),
 -	bHideOneTab(SRMM_MODULE, "HideOneTab", 1),
 -	bTabsAtBottom(SRMM_MODULE, "TabsPosition", 0),
 -	bSeparateChats(SRMM_MODULE, "SeparateChatsContainers", 0),
 -	bTabCloseButton(SRMM_MODULE, "TabCloseButton", 0),
 -	bSwitchToActive(SRMM_MODULE, "SwitchToActiveTab", 0),
 -
 -	bShowTyping(SRMM_MODULE, "ShowTyping", 1),
 -	bShowTypingWin(SRMM_MODULE, "ShowTypingWin", 1),
 -	bShowTypingTray(SRMM_MODULE, "ShowTypingTray", 0),
 -	bShowTypingClist(SRMM_MODULE, "ShowTypingClist", 1),
 -	bShowTypingSwitch(SRMM_MODULE, "ShowTypingSwitch", 1),
 +	bCascade(SRMM_MODULE, "Cascade", true),
 +	bAutoMin(SRMM_MODULE, "AutoMin", false),
 +	bAutoCopy(SRMM_MODULE, "AutoCopy", true),
 +	bTopmost(SRMM_MODULE, "Topmost", false),
 +	bDelTemp(SRMM_MODULE, "DeleteTempCont", false),
 +	bTypingNew(SRMM_MODULE, "DefaultTyping", true),
 +	bAutoClose(SRMM_MODULE, "AutoClose", false),
 +	bAutoPopup(SRMM_MODULE, "AutoPopupMsg", false),
 +	bSaveDrafts(SRMM_MODULE, "SaveDrafts", false),
 +	bTypingUnknown(SRMM_MODULE, "UnknownTyping", false),
 +	bHideContainer(SRMM_MODULE, "HideContainers", false),
 +	bStayMinimized(SRMM_MODULE, "StayMinimized", false),
 +	bSavePerContact(SRMM_MODULE, "SavePerContact", false),
 +
 +	bShowAvatar(SRMM_MODULE, "AvatarEnable", true),
 +	bShowProgress(SRMM_MODULE, "ShowProgress", false),
 +	bShowIcons(SRMM_MODULE, "ShowLogIcon", true),
 +	bShowTime(SRMM_MODULE, "ShowTime", true),
 +	bShowSeconds(SRMM_MODULE, "ShowSeconds", true),
 +	bShowDate(SRMM_MODULE, "ShowDate", false),
 +	bLongDate(SRMM_MODULE, "UseLongDate", false),
 +	bRelativeDate(SRMM_MODULE, "UseRelativeDate", false),
 +	bDrawLines(SRMM_MODULE, "DrawLines", false),
 +	bHideNames(SRMM_MODULE, "HideNames", true),
 +	bIndentText(SRMM_MODULE, "IndentText", false),
 +	bGroupMessages(SRMM_MODULE, "GroupMessages", false),
 +	bMarkFollowups(SRMM_MODULE, "MarkFollowUps", false),
 +	bMsgOnNewline(SRMM_MODULE, "MessageOnNewLine", false),
 +	bUseTransparency(SRMM_MODULE, "UseTransparency", false),
 +
 +	bShowToolBar(SRMM_MODULE, "ShowButtonLine", true),
 +	bShowInfoBar(SRMM_MODULE, "ShowInfoBar", true),
 +	bShowTitleBar(SRMM_MODULE, "ShowTitleBar", true),
 +	bShowStatusBar(SRMM_MODULE, "ShowStatusBar", true),
 +
 +	bUseTabs(SRMM_MODULE, "UseTabs", true),
 +	bLimitTabs(SRMM_MODULE, "LimitTabs", false),
 +	bLimitChatTabs(SRMM_MODULE, "LimitChatsTabs", false),
 +	bLimitNames(SRMM_MODULE, "LimitNamesOnTabs", true),
 +	bHideOneTab(SRMM_MODULE, "HideOneTab", true),
 +	bTabsAtBottom(SRMM_MODULE, "TabsPosition", false),
 +	bSeparateChats(SRMM_MODULE, "SeparateChatsContainers", false),
 +	bTabCloseButton(SRMM_MODULE, "TabCloseButton", false),
 +	bSwitchToActive(SRMM_MODULE, "SwitchToActiveTab", false),
 +
 +	bShowTyping(SRMM_MODULE, "ShowTyping", true),
 +	bShowTypingWin(SRMM_MODULE, "ShowTypingWin", true),
 +	bShowTypingTray(SRMM_MODULE, "ShowTypingTray", false),
 +	bShowTypingClist(SRMM_MODULE, "ShowTypingClist", true),
 +	bShowTypingSwitch(SRMM_MODULE, "ShowTypingSwitch", true),
  	iLimitNames(SRMM_MODULE, "LimitNamesLength", 20),
  	iLimitTabs(SRMM_MODULE, "LimitTabsNum", 10),
 @@ -146,7 +147,9 @@ int CMPlugin::Load()  int CMPlugin::Unload()
  {
  	UnregisterSrmmLog(hLogger);
 +
  	if (pTaskbarInterface)
  		pTaskbarInterface->Release();
 +
  	return OnUnloadModule();
  }
 diff --git a/plugins/Scriver/src/stdafx.h b/plugins/Scriver/src/stdafx.h index 7f1fc6a98e..731e44ad23 100644 --- a/plugins/Scriver/src/stdafx.h +++ b/plugins/Scriver/src/stdafx.h @@ -72,7 +72,7 @@ struct CMPlugin : public PLUGIN<CMPlugin>  {
  	HANDLE hLogger;
 -	CMOption<uint8_t> bSavePerContact, bCascade, bStayMinimized, bAutoMin, bSaveDrafts, bDelTemp, bHideContainer, bAutoPopup;
 +	CMOption<uint8_t> bSavePerContact, bCascade, bStayMinimized, bAutoMin, bSaveDrafts, bDelTemp, bHideContainer, bAutoPopup, bAutoCopy;
  	CMOption<uint8_t> bUseTransparency, bTopmost, bAutoClose, bTypingNew, bTypingUnknown;
  	CMOption<uint8_t> bShowTitleBar, bShowStatusBar, bShowToolBar, bShowInfoBar;
  	CMOption<uint8_t> bShowAvatar, bShowProgress, bShowIcons, bShowTime, bShowSeconds, bShowDate, bLongDate, bRelativeDate;
 @@ -141,6 +141,5 @@ CSrmmLogWindow *logBuilder(CMsgDialog &pDlg);  #include "chat.h"
  extern GlobalMessageData g_dat;
 -extern LIST<CMsgDialog> g_arDialogs;
  #endif
  | 
