From 0c75e77e0f5321150ceff6aa0a3fd9dc5dc1c294 Mon Sep 17 00:00:00 2001
From: George Hazan <ghazan@miranda.im>
Date: Tue, 5 Sep 2017 22:25:06 +0300
Subject: StdMsg: large crutch that fixes problem with sending messages via Tab
 + Enter

---
 src/core/stdmsg/src/chat_manager.cpp |  2 +-
 src/core/stdmsg/src/chat_window.cpp  |  9 +++------
 src/core/stdmsg/src/msgdialog.cpp    | 17 +++++++----------
 src/core/stdmsg/src/msgs.cpp         | 12 ++++++++++++
 src/core/stdmsg/src/msgs.h           | 16 +++++++++++++---
 src/core/stdmsg/src/stdafx.h         |  6 +++---
 src/core/stdmsg/src/tabs.cpp         | 15 ++++++++++++---
 7 files changed, 51 insertions(+), 26 deletions(-)

diff --git a/src/core/stdmsg/src/chat_manager.cpp b/src/core/stdmsg/src/chat_manager.cpp
index 119914b7c2..3afa17bccc 100644
--- a/src/core/stdmsg/src/chat_manager.cpp
+++ b/src/core/stdmsg/src/chat_manager.cpp
@@ -203,7 +203,7 @@ static void ShowRoom(SESSION_INFO *si)
 			PostMessage(pContainer->GetHwnd(), WM_SIZE, 0, 0);
 		}
 		else {
-			CDlgBase *pDlg = pContainer->m_pEmbed = new CChatRoomDlg(pContainer, si);
+			CMsgDialog *pDlg = pContainer->m_pEmbed = new CChatRoomDlg(pContainer, si);
 			pContainer->Create();
 			pDlg->SetParent(pContainer->GetHwnd());
 			pDlg->Create();
diff --git a/src/core/stdmsg/src/chat_window.cpp b/src/core/stdmsg/src/chat_window.cpp
index aa91f6d397..99b46e48d7 100644
--- a/src/core/stdmsg/src/chat_window.cpp
+++ b/src/core/stdmsg/src/chat_window.cpp
@@ -29,16 +29,13 @@ static wchar_t szTrimString[] = L":;,.!?\'\"><()[]- \r\n";
 /////////////////////////////////////////////////////////////////////////////////////////
 
 CChatRoomDlg::CChatRoomDlg(CTabbedWindow *pContainer, SESSION_INFO *si) :
-	CSuper(g_hInst, IDD_CHANNEL, si),
+	CSuper(IDD_CHANNEL, si),
 	m_pOwner(pContainer),
 	m_btnOk(this, IDOK),
 	
 	m_splitterX(this, IDC_SPLITTERX),
 	m_splitterY(this, IDC_SPLITTERY)
 {
-	m_autoClose = 0;
-	m_forceResizable = true;
-
 	m_btnOk.OnClick = Callback(this, &CChatRoomDlg::onClick_Ok);
 
 	m_btnFilter.OnClick = Callback(this, &CChatRoomDlg::onClick_Filter);
@@ -649,7 +646,7 @@ LRESULT CChatRoomDlg::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
 
 			if (wParam == '\n' || wParam == '\r') {
 				if ((isCtrl != 0) ^ (0 != db_get_b(0, CHAT_MODULE, "SendOnEnter", 1))) {
-					PostMessage(m_hwnd, WM_COMMAND, IDOK, 0);
+					m_btnOk.OnClick(&m_btnOk);
 					return 0;
 				}
 				if (db_get_b(0, CHAT_MODULE, "SendOnDblEnter", 0)) {
@@ -658,7 +655,7 @@ LRESULT CChatRoomDlg::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
 					else {
 						m_message.SendMsg(WM_KEYDOWN, VK_BACK, 0);
 						m_message.SendMsg(WM_KEYUP, VK_BACK, 0);
-						PostMessage(m_hwnd, WM_COMMAND, IDOK, 0);
+						m_btnOk.OnClick(&m_btnOk);
 						return 0;
 					}
 				}
diff --git a/src/core/stdmsg/src/msgdialog.cpp b/src/core/stdmsg/src/msgdialog.cpp
index e1678665d8..7f418e285d 100644
--- a/src/core/stdmsg/src/msgdialog.cpp
+++ b/src/core/stdmsg/src/msgdialog.cpp
@@ -85,17 +85,14 @@ static void SetEditorText(HWND hwnd, const wchar_t* txt)
 /////////////////////////////////////////////////////////////////////////////////////////
 
 CSrmmWindow::CSrmmWindow(CTabbedWindow *pOwner, MCONTACT hContact) :
-	CSuper(g_hInst, IDD_MSG),
+	CSuper(IDD_MSG),
 	m_splitter(this, IDC_SPLITTERY),
 	m_avatar(this, IDC_AVATAR),
-	m_btnOk(this, IDOK),
 	m_cmdList(20),
 	m_bNoActivate(g_dat.bDoNotStealFocus),
 	m_pOwner(pOwner)
 {
 	m_hContact = hContact;
-	m_autoClose = 0;
-	m_forceResizable = true;
 
 	m_btnOk.OnClick = Callback(this, &CSrmmWindow::onClick_Ok);
 	m_splitter.OnChange = Callback(this, &CSrmmWindow::OnSplitterMoved);
@@ -229,7 +226,7 @@ void CSrmmWindow::OnInitDialog()
 		if (!db_get_ws(m_hContact, SRMSGMOD, DBSAVEDMSG, &dbv)) {
 			if (dbv.ptszVal[0]) {
 				m_message.SetText(dbv.ptszVal);
-				m_btnOk.Enable(TRUE);
+				m_btnOk.Enable(true);
 				UpdateReadChars();
 				PostMessage(m_message.GetHwnd(), EM_SETSEL, -1, -1);
 			}
@@ -330,7 +327,7 @@ void CSrmmWindow::onClick_Ok(CCtrlButton *pButton)
 		if (m_nTypeMode == PROTOTYPE_SELFTYPING_ON)
 			NotifyTyping(PROTOTYPE_SELFTYPING_OFF);
 
-		m_btnOk.Enable(FALSE);
+		m_btnOk.Enable(false);
 		SetFocus(m_message.GetHwnd());
 
 		m_message.SetText(L"");
@@ -664,7 +661,7 @@ LRESULT CSrmmWindow::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
 
 		if (wParam == VK_RETURN) {
 			if (!isShift && isCtrl != g_dat.bSendOnEnter) {
-				PostMessage(m_hwnd, WM_COMMAND, IDOK, 0);
+				onClick_Ok(&m_btnOk);
 				return 0;
 			}
 			if (g_dat.bSendOnDblEnter) {
@@ -673,7 +670,7 @@ LRESULT CSrmmWindow::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
 				else {
 					m_message.SendMsg(WM_KEYDOWN, VK_BACK, 0);
 					m_message.SendMsg(WM_KEYUP, VK_BACK, 0);
-					PostMessage(m_hwnd, WM_COMMAND, IDOK, 0);
+					onClick_Ok(&m_btnOk);
 					return 0;
 				}
 			}
@@ -744,7 +741,7 @@ LRESULT CSrmmWindow::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
 	case WM_SYSCHAR:
 		m_iLastEnterTime = 0;
 		if ((wParam == 's' || wParam == 'S') && GetKeyState(VK_MENU) & 0x8000) {
-			PostMessage(m_hwnd, WM_COMMAND, IDOK, 0);
+			onClick_Ok(&m_btnOk);
 			return 0;
 		}
 		break;
@@ -828,7 +825,7 @@ LRESULT CSrmmWindow::WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam)
 
 			case IDM_PASTESEND:
 				m_message.SendMsg(EM_PASTESPECIAL, CF_TEXT, 0);
-				PostMessage(m_hwnd, WM_COMMAND, IDOK, 0);
+				onClick_Ok(&m_btnOk);
 				break;
 
 			case IDM_DELETE:
diff --git a/src/core/stdmsg/src/msgs.cpp b/src/core/stdmsg/src/msgs.cpp
index 0e8d6cf3ea..7d40f861e7 100644
--- a/src/core/stdmsg/src/msgs.cpp
+++ b/src/core/stdmsg/src/msgs.cpp
@@ -28,6 +28,18 @@ const CLSID IID_IRichEditOle = { 0x00020D00, 0x00, 0x00, { 0xC0, 0x00, 0x00, 0x0
 const CLSID IID_IRichEditOleCallback = { 0x00020D03, 0x00, 0x00, { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 } };
 #endif
 
+/////////////////////////////////////////////////////////////////////////////////////////
+
+CMsgDialog::CMsgDialog(int iDialogId, SESSION_INFO *si)
+	: CSuper(g_hInst, iDialogId, si),
+	m_btnOk(this, IDOK)
+{
+	m_autoClose = 0;
+	m_forceResizable = true;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
 int OnCheckPlugins(WPARAM, LPARAM);
 
 HGENMENU hMsgMenuItem;
diff --git a/src/core/stdmsg/src/msgs.h b/src/core/stdmsg/src/msgs.h
index a94cb6a08d..b0bf16cfb7 100644
--- a/src/core/stdmsg/src/msgs.h
+++ b/src/core/stdmsg/src/msgs.h
@@ -47,10 +47,21 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define EVENTTYPE_JABBER_CHATSTATES     2000
 #define EVENTTYPE_JABBER_PRESENCE       2001
 
-class CSrmmWindow : public CSrmmBaseDialog
+class CMsgDialog : public CSrmmBaseDialog
 {
-	friend class CTabbedWindow;
 	typedef CSrmmBaseDialog CSuper;
+	friend class CTabbedWindow;
+
+protected:
+	CCtrlButton m_btnOk;
+
+	CMsgDialog(int idDialog, SESSION_INFO *si = nullptr);
+};
+
+class CSrmmWindow : public CMsgDialog
+{
+	friend class CTabbedWindow;
+	typedef CMsgDialog CSuper;
 	
 	static LRESULT CALLBACK TabSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
@@ -58,7 +69,6 @@ class CSrmmWindow : public CSrmmBaseDialog
 	virtual LRESULT WndProc_Message(UINT msg, WPARAM wParam, LPARAM lParam) override;
 
 	CCtrlBase m_avatar;
-	CCtrlButton m_btnOk;
 	CSplitter m_splitter;
 
 	void NotifyTyping(int mode);
diff --git a/src/core/stdmsg/src/stdafx.h b/src/core/stdmsg/src/stdafx.h
index 14bde56a30..280bbf0263 100644
--- a/src/core/stdmsg/src/stdafx.h
+++ b/src/core/stdmsg/src/stdafx.h
@@ -151,7 +151,7 @@ class CTabbedWindow : public CDlgBase
 public:
 	CCtrlPages m_tab;
 	HWND m_hwndStatus;
-	CSrmmBaseDialog *m_pEmbed;
+	CMsgDialog *m_pEmbed;
 
 	CTabbedWindow();
 
@@ -185,9 +185,9 @@ void TB_SaveSession(SESSION_INFO *si);
 #define GC_DROPPEDTAB  (WM_USER+202)
 #define GC_RENAMETAB   (WM_USER+203)
 
-class CChatRoomDlg : public CSrmmBaseDialog
+class CChatRoomDlg : public CMsgDialog
 {
-	typedef CSrmmBaseDialog CSuper;
+	typedef CMsgDialog CSuper;
 	friend class CTabbedWindow;
 
 	static INT_PTR CALLBACK FilterWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
diff --git a/src/core/stdmsg/src/tabs.cpp b/src/core/stdmsg/src/tabs.cpp
index 8b0e38043e..013816a9c7 100644
--- a/src/core/stdmsg/src/tabs.cpp
+++ b/src/core/stdmsg/src/tabs.cpp
@@ -212,7 +212,6 @@ void CTabbedWindow::FixTabIcons(CSrmmBaseDialog *pDlg)
 	else RedrawWindow(m_tab.GetHwnd(), nullptr, nullptr, RDW_INVALIDATE);
 }
 
-
 void CTabbedWindow::SaveWindowPosition(bool bUpdateSession)
 {
 	WINDOWPLACEMENT wp = {};
@@ -550,7 +549,7 @@ INT_PTR CTabbedWindow::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
 		{
 			LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lParam;
 			if (dis->hwndItem == m_hwndStatus) {
-				CSrmmBaseDialog *pDlg = (g_Settings.bTabsEnable) ? (CSrmmBaseDialog*)m_tab.GetActivePage() : m_pEmbed;
+				CMsgDialog *pDlg = (g_Settings.bTabsEnable) ? (CMsgDialog*)m_tab.GetActivePage() : m_pEmbed;
 				if (pDlg != nullptr)
 					DrawStatusIcons(pDlg->m_hContact, dis->hDC, dis->rcItem, 2);
 				return TRUE;
@@ -558,6 +557,16 @@ INT_PTR CTabbedWindow::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
 		}
 		break;
 
+	case WM_COMMAND:
+		if (LOWORD(wParam) == IDOK) {
+			CMsgDialog *pDlg = (g_Settings.bTabsEnable) ? (CMsgDialog*)m_tab.GetActivePage() : m_pEmbed;
+			if (pDlg != nullptr) {
+				pDlg->m_btnOk.OnClick(&pDlg->m_btnOk);
+				return TRUE;
+			}
+		}
+		break;
+
 	case WM_NOTIFY:
 		if (((LPNMHDR)lParam)->hwndFrom == m_hwndStatus) {
 			if (((LPNMHDR)lParam)->code == NM_CLICK || ((LPNMHDR)lParam)->code == NM_RCLICK) {
@@ -565,7 +574,7 @@ INT_PTR CTabbedWindow::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
 				RECT rc;
 				SendMessage(m_hwndStatus, SB_GETRECT, SendMessage(m_hwndStatus, SB_GETPARTS, 0, 0) - 1, (LPARAM)&rc);
 				if (nm->pt.x >= rc.left) {
-					CSrmmBaseDialog *pDlg = (g_Settings.bTabsEnable) ? (CSrmmBaseDialog*)m_tab.GetActivePage() : m_pEmbed;
+					CMsgDialog *pDlg = (g_Settings.bTabsEnable) ? (CMsgDialog*)m_tab.GetActivePage() : m_pEmbed;
 					if (pDlg != nullptr)
 						CheckStatusIconClick(pDlg->m_hContact, m_hwndStatus, nm->pt, rc, 2, ((LPNMHDR)lParam)->code == NM_RCLICK ? MBCF_RIGHTBUTTON : 0);
 				}
-- 
cgit v1.2.3