From b7cd9afaf2720ac058da19c6398f40f894ba1b88 Mon Sep 17 00:00:00 2001
From: George Hazan <ghazan@miranda.im>
Date: Sat, 18 Mar 2017 21:10:48 +0300
Subject: StdMsg:

- added reaction to TCN_SELCHANGE;
- more effective way of controlling tab switch
- useless field removed from TPageInfo;
---
 src/core/stdmsg/src/tabs.cpp | 104 ++++++++++++++++++++++---------------------
 1 file changed, 54 insertions(+), 50 deletions(-)

(limited to 'src/core/stdmsg')

diff --git a/src/core/stdmsg/src/tabs.cpp b/src/core/stdmsg/src/tabs.cpp
index a3564cccb5..d8d2b5bdd5 100644
--- a/src/core/stdmsg/src/tabs.cpp
+++ b/src/core/stdmsg/src/tabs.cpp
@@ -399,61 +399,68 @@ INT_PTR CTabbedWindow::DlgProc(UINT msg, WPARAM wParam, LPARAM lParam)
 		break;
 
 	case WM_NOTIFY:
-		if (((LPNMHDR)lParam)->idFrom == IDC_TAB && ((LPNMHDR)lParam)->code == NM_RCLICK) {
-			int i = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom);
-			if (i == -1)
+		if (((LPNMHDR)lParam)->idFrom == IDC_TAB) {
+			switch (((LPNMHDR)lParam)->code) {
+			case TCN_SELCHANGE:
+				m_tab.ActivatePage(TabCtrl_GetCurSel(m_tab.GetHwnd()));
 				break;
 
-			TCHITTESTINFO tci = {};
-			tci.pt.x = (short)LOWORD(GetMessagePos());
-			tci.pt.y = (short)HIWORD(GetMessagePos());
-			tci.flags = TCHT_ONITEM;
-			ScreenToClient(GetDlgItem(m_hwnd, IDC_TAB), &tci.pt);
-			if ((i = TabCtrl_HitTest(((LPNMHDR)lParam)->hwndFrom, &tci)) == -1)
-				break;
-
-			SESSION_INFO *si = ((CChatRoomDlg*)m_tab.GetNthPage(i))->m_si;
-
-			ClientToScreen(GetDlgItem(m_hwnd, IDC_TAB), &tci.pt);
-			HMENU hSubMenu = GetSubMenu(g_hMenu, 3);
-			TranslateMenu(hSubMenu);
-
-			if (si) {
-				WORD w = db_get_w(si->hContact, si->pszModule, "TabPosition", 0);
-				if (w == 0)
-					CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND | MF_UNCHECKED);
-				else
-					CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND | MF_CHECKED);
-			}
-			else CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND | MF_UNCHECKED);
+			case NM_RCLICK:
+				int i = TabCtrl_GetCurSel(((LPNMHDR)lParam)->hwndFrom);
+				if (i == -1)
+					break;
 
-			switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, tci.pt.x, tci.pt.y, 0, m_hwnd, NULL)) {
-			case ID_CLOSE:
-				SendMessage(m_hwnd, GC_REMOVETAB, 0, (LPARAM)m_tab.GetNthPage(i));
-				break;
-
-			case ID_LOCKPOSITION:
-				if (si != 0) {
-					if (!(GetMenuState(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND)&MF_CHECKED)) {
-						if (si->hContact)
-							db_set_w(si->hContact, si->pszModule, "TabPosition", (WORD)(i + 1));
-					}
-					else db_unset(si->hContact, si->pszModule, "TabPosition");
+				TCHITTESTINFO tci = {};
+				tci.pt.x = (short)LOWORD(GetMessagePos());
+				tci.pt.y = (short)HIWORD(GetMessagePos());
+				tci.flags = TCHT_ONITEM;
+				ScreenToClient(GetDlgItem(m_hwnd, IDC_TAB), &tci.pt);
+				if ((i = TabCtrl_HitTest(((LPNMHDR)lParam)->hwndFrom, &tci)) == -1)
+					break;
+
+				SESSION_INFO *si = ((CChatRoomDlg*)m_tab.GetNthPage(i))->m_si;
+
+				ClientToScreen(GetDlgItem(m_hwnd, IDC_TAB), &tci.pt);
+				HMENU hSubMenu = GetSubMenu(g_hMenu, 3);
+				TranslateMenu(hSubMenu);
+
+				if (si) {
+					WORD w = db_get_w(si->hContact, si->pszModule, "TabPosition", 0);
+					if (w == 0)
+						CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND | MF_UNCHECKED);
+					else
+						CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND | MF_CHECKED);
 				}
-				break;
+				else CheckMenuItem(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND | MF_UNCHECKED);
+
+				switch (TrackPopupMenu(hSubMenu, TPM_RETURNCMD, tci.pt.x, tci.pt.y, 0, m_hwnd, NULL)) {
+				case ID_CLOSE:
+					SendMessage(m_hwnd, GC_REMOVETAB, 0, (LPARAM)m_tab.GetNthPage(i));
+					break;
+
+				case ID_LOCKPOSITION:
+					if (si != 0) {
+						if (!(GetMenuState(hSubMenu, ID_LOCKPOSITION, MF_BYCOMMAND)&MF_CHECKED)) {
+							if (si->hContact)
+								db_set_w(si->hContact, si->pszModule, "TabPosition", (WORD)(i + 1));
+						}
+						else db_unset(si->hContact, si->pszModule, "TabPosition");
+					}
+					break;
 
-			case ID_CLOSEOTHER:
-				int tabCount = m_tab.GetCount() - 1;
-				if (tabCount > 0) {
-					for (tabCount; tabCount >= 0; tabCount--) {
-						if (tabCount == i)
-							continue;
+				case ID_CLOSEOTHER:
+					int tabCount = m_tab.GetCount() - 1;
+					if (tabCount > 0) {
+						for (tabCount; tabCount >= 0; tabCount--) {
+							if (tabCount == i)
+								continue;
 
-						m_tab.RemovePage(tabCount);
+							m_tab.RemovePage(tabCount);
+						}
+						m_tab.ActivatePage(0);
 					}
-					m_tab.ActivatePage(0);
+					break;
 				}
-				break;
 			}
 		}
 		break;
@@ -537,7 +544,4 @@ void ShowRoom(SESSION_INFO *si)
 		ShowWindow(si->pDlg->GetHwnd(), SW_NORMAL);
 	ShowWindow(si->pDlg->GetHwnd(), SW_SHOW);
 	SetForegroundWindow(si->pDlg->GetHwnd());
-
-	SendMessage(si->pDlg->GetHwnd(), WM_MOUSEACTIVATE, 0, 0);
-	SetFocus(GetDlgItem(si->pDlg->GetHwnd(), IDC_MESSAGE));
 }
-- 
cgit v1.2.3