diff options
| -rw-r--r-- | plugins/Alarms/src/alarms.cpp | 5 | ||||
| -rw-r--r-- | plugins/TabSRMM/src/chat/window.cpp | 19 | ||||
| -rw-r--r-- | plugins/TabSRMM/src/container.cpp | 1 | ||||
| -rw-r--r-- | plugins/TabSRMM/src/tabctrl.cpp | 819 | 
4 files changed, 401 insertions, 443 deletions
diff --git a/plugins/Alarms/src/alarms.cpp b/plugins/Alarms/src/alarms.cpp index 2014f0f016..e0c57e81a8 100644 --- a/plugins/Alarms/src/alarms.cpp +++ b/plugins/Alarms/src/alarms.cpp @@ -24,11 +24,6 @@ int hLangpack;  HANDLE hTopToolbarButton;
 -typedef LRESULT (CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM);
 -
 -//bool right_window = false;
 -WNDPROC old_clist_wndproc;
 -
  PLUGININFOEX pluginInfo = {
  	sizeof(PLUGININFOEX),
  	__PLUGIN_NAME,
 diff --git a/plugins/TabSRMM/src/chat/window.cpp b/plugins/TabSRMM/src/chat/window.cpp index 37756aecbe..51b11840fa 100644 --- a/plugins/TabSRMM/src/chat/window.cpp +++ b/plugins/TabSRMM/src/chat/window.cpp @@ -334,25 +334,6 @@ static void Chat_UpdateWindowState(TWindowData *dat, UINT msg)  			PostMessage(hwndDlg, WM_SIZE, 0, 0);
  			dat->wParam = dat->lParam = 0;
  		}
 -		/*
 -		if (dat->hwndIEView) {
 -			RECT rcRTF;
 -			POINT pt;
 -
 -			GetWindowRect(GetDlgItem(hwndDlg, IDC_CHAT_LOG), &rcRTF);
 -			rcRTF.left += 20;
 -			rcRTF.top += 20;
 -			pt.x = rcRTF.left;
 -			pt.y = rcRTF.top;
 -			if (dat->hwndIEView) {
 -				if (M->GetByte("subclassIEView", 0) && dat->oldIEViewProc == 0) {
 -					WNDPROC wndProc = (WNDPROC)SetWindowLongPtr(dat->hwndIEView, GWLP_WNDPROC, (LONG_PTR)IEViewSubclassProc);
 -					dat->oldIEViewProc = wndProc;
 -				}
 -			}
 -			dat->hwndIWebBrowserControl = WindowFromPoint(pt);
 -		}
 -		*/
  	}
  	if (M->isAero())
  		InvalidateRect(hwndTab, NULL, FALSE);
 diff --git a/plugins/TabSRMM/src/container.cpp b/plugins/TabSRMM/src/container.cpp index 434ba36676..fa55f0bf70 100644 --- a/plugins/TabSRMM/src/container.cpp +++ b/plugins/TabSRMM/src/container.cpp @@ -1821,7 +1821,6 @@ buttons_done:  			if (pContainer->dwFlags & CNT_NOSTATUSBAR) {
  				if (pContainer->hwndStatus) {
 -					//SetWindowLongPtr(pContainer->hwndStatus, GWLP_WNDPROC, (LONG_PTR)OldStatusBarproc);
  					DestroyWindow(pContainer->hwndStatus);
  					pContainer->hwndStatus = 0;
  					pContainer->statusBarHeight = 0;
 diff --git a/plugins/TabSRMM/src/tabctrl.cpp b/plugins/TabSRMM/src/tabctrl.cpp index 658584de6d..cff4be4b17 100644 --- a/plugins/TabSRMM/src/tabctrl.cpp +++ b/plugins/TabSRMM/src/tabctrl.cpp @@ -34,62 +34,8 @@  static WNDPROC		OldTabControlClassProc;
 -static LRESULT CALLBACK TabControlSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 -
  #define FIXED_TAB_SIZE 100
 -/*
 - * register the new tab control as a window class (TSTabCtrlClass)
 - */
 -
 -int TSAPI RegisterTabCtrlClass(void)
 -{
 -	WNDCLASSEXA wc;
 -	WNDCLASSEX wce;
 -
 -	ZeroMemory(&wc, sizeof(wc));
 -	wc.cbSize         = sizeof(wc);
 -	wc.lpszClassName  = "TSTabCtrlClass";
 -	wc.lpfnWndProc    = TabControlSubclassProc;
 -	wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
 -	wc.cbWndExtra     = sizeof(struct TabControlData *);
 -	wc.hbrBackground  = 0;
 -	wc.style          = CS_GLOBALCLASS | CS_DBLCLKS | CS_PARENTDC;
 -	RegisterClassExA(&wc);
 -
 -	ZeroMemory(&wce, sizeof(wce));
 -	wce.cbSize         = sizeof(wce);
 -	wce.lpszClassName  = _T("TSStatusBarClass");
 -	wce.lpfnWndProc    = StatusBarSubclassProc;
 -	wce.hCursor        = LoadCursor(NULL, IDC_ARROW);
 -	wce.cbWndExtra     = sizeof(void*);
 -	wce.hbrBackground  = 0;
 -	wce.style          = CS_GLOBALCLASS | CS_DBLCLKS | CS_PARENTDC;
 -	RegisterClassEx(&wce);
 -
 -	ZeroMemory(&wce, sizeof(wce));
 -	wce.cbSize         = sizeof(wce);
 -	wce.lpszClassName  = _T("TS_SideBarClass");
 -	wce.lpfnWndProc    = CSideBar::wndProcStub;;
 -	wce.hCursor        = LoadCursor(NULL, IDC_ARROW);
 -	wce.cbWndExtra     = sizeof(void*);
 -	wce.hbrBackground  = 0;
 -	wce.style          = CS_GLOBALCLASS;// | CS_DBLCLKS; // | CS_PARENTDC;
 -	RegisterClassEx(&wce);
 -
 -	ZeroMemory(&wce, sizeof(wce));
 -	wce.cbSize         = sizeof(wce);
 -	wce.lpszClassName  = _T("TSHK");
 -	wce.lpfnWndProc    = HotkeyHandlerDlgProc;
 -	wce.hCursor        = LoadCursor(NULL, IDC_ARROW);
 -	wce.cbWndExtra     = sizeof(void*);
 -	wce.hbrBackground  = 0;
 -	wce.style          = CS_GLOBALCLASS;// | CS_DBLCLKS; // | CS_PARENTDC;
 -	RegisterClassEx(&wce);
 -
 -	return 0;
 -}
 -
  static int TabCtrl_TestForCloseButton(const TabControlData *tabdat, HWND hwnd, POINT& pt)
  {
  	TCHITTESTINFO tci = {0};
 @@ -675,6 +621,358 @@ static void DrawThemesXpTabItem(HDC pDC, int ixItem, RECT *rcItem, UINT uiFlag,  static POINT ptMouseT = {0};
 +static void PaintWorker(HWND hwnd, TabControlData *tabdat)
 +{
 +	PAINTSTRUCT ps;
 +	HDC hdc;
 +	RECT rectTemp, rctPage, rctActive, rcItem, rctClip, rctOrig;
 +	RECT rectUpDn = {0, 0, 0, 0};
 +	int nCount = TabCtrl_GetItemCount(hwnd), i;
 +	TCITEM item = {0};
 +	int iActive, hotItem;
 +	POINT pt;
 +	DWORD dwStyle = tabdat->dwStyle;
 +	UINT uiFlags = 1;
 +	UINT uiBottom = 0;
 +	TCHITTESTINFO hti;
 +	HBITMAP bmpMem, bmpOld;
 +	bool  isAero = M->isAero();
 +	HANDLE hpb = 0;
 +	BOOL bClassicDraw = !isAero && (tabdat->m_VisualStyles == FALSE || CSkin::m_skinEnabled);
 +	if ( GetUpdateRect(hwnd, NULL, TRUE) == 0)
 +		return;
 +
 +	item.mask = TCIF_PARAM;
 +
 +	tabdat->fAeroTabs = (CSkin::m_fAeroSkinsValid && (isAero || PluginConfig.m_fillColor)) ? TRUE : FALSE;
 +	tabdat->fCloseButton = tabdat->pContainer ? (tabdat->pContainer->dwFlagsEx & TCF_CLOSEBUTTON ? TRUE : FALSE) : FALSE;
 +	tabdat->helperDat = 0;
 +
 +	if (tabdat->fAeroTabs && tabdat->pContainer) {
 +		TWindowData *dat = (TWindowData *)GetWindowLongPtr(tabdat->pContainer->hwndActive, GWLP_USERDATA);
 +		if (dat)
 +			tabdat->helperDat = dat;
 +		else
 +			tabdat->fAeroTabs = 0;
 +
 +		tabdat->helperItem =  (dwStyle & TCS_BOTTOM) ? CSkin::m_tabBottom : CSkin::m_tabTop;
 +		tabdat->helperGlowItem = (dwStyle & TCS_BOTTOM) ? CSkin::m_tabGlowBottom : CSkin::m_tabGlowTop;
 +	}
 +	else tabdat->fAeroTabs = FALSE;
 +
 +	HDC hdcreal = BeginPaint(hwnd, &ps);
 +
 +	/*
 +	* switchbar is active, don't paint a single pixel, the tab control won't be visible at all
 +	* same when we have only ONE tab and do not want it to be visible because of the container
 +	* option "Show tab bar only when needed".
 +	*/
 +
 +	if ((tabdat->pContainer->dwFlags & CNT_SIDEBAR) || (nCount == 1 && tabdat->pContainer->dwFlags & CNT_HIDETABS)) {
 +		if (nCount == 0)
 +			FillRect(hdcreal, &ps.rcPaint, GetSysColorBrush(COLOR_3DFACE)); // avoid flickering/ugly black background during container creation
 +		EndPaint(hwnd, &ps);
 +		return;
 +	}
 +
 +	GetClientRect(hwnd, &rctPage);
 +	rctOrig = rctPage;
 +	iActive = TabCtrl_GetCurSel(hwnd);
 +	TabCtrl_GetItemRect(hwnd, iActive, &rctActive);
 +	int cx = rctPage.right - rctPage.left;
 +	int cy = rctPage.bottom - rctPage.top;
 +
 +	/*
 +	* draw everything to a memory dc to avoid flickering
 +	*/
 +
 +	if (CMimAPI::m_haveBufferedPaint)
 +		hpb = tabdat->hbp = CSkin::InitiateBufferedPaint(hdcreal, rctPage, hdc);
 +	else {
 +		hdc = CreateCompatibleDC(hdcreal);
 +		bmpMem = tabdat->fAeroTabs ? CSkin::CreateAeroCompatibleBitmap(rctPage, hdcreal) : CreateCompatibleBitmap(hdcreal, cx, cy);
 +		bmpOld = (HBITMAP)SelectObject(hdc, bmpMem);
 +	}
 +
 +	if (nCount == 1 && tabdat->pContainer->dwFlags & CNT_HIDETABS)
 +		rctClip = rctPage;
 +
 +	if (CSkin::m_skinEnabled)
 +		CSkin::SkinDrawBG(hwnd, tabdat->pContainer->hwnd, tabdat->pContainer, &rctPage, hdc);
 +	else
 +		CSkin::FillBack(hdc, &rctPage);
 +
 +	if (dwStyle & TCS_BUTTONS) {
 +		RECT rc1;
 +		TabCtrl_GetItemRect(hwnd, nCount - 1, &rc1);
 +		if (dwStyle & TCS_BOTTOM) {
 +			rctPage.bottom = rc1.top;
 +			uiBottom = 8;
 +		}
 +		else {
 +			rctPage.top = rc1.bottom + 2;
 +			uiBottom = 0;
 +		}
 +	}
 +	else {
 +		if (dwStyle & TCS_BOTTOM) {
 +			rctPage.bottom = rctActive.top;
 +			uiBottom = 8;
 +		}
 +		else {
 +			rctPage.top = rctActive.bottom;
 +			uiBottom = 0;
 +		}
 +	}
 +
 +	if (nCount > 1 || !(tabdat->pContainer->dwFlags & CNT_HIDETABS)) {
 +		rctClip = rctPage;
 +		InflateRect(&rctClip, -tabdat->pContainer->tBorder, -tabdat->pContainer->tBorder);
 +	}
 +	else ZeroMemory(&rctClip, sizeof(RECT));
 +
 +	HPEN hPenOld = (HPEN)SelectObject(hdc, PluginConfig.tabConfig.m_hPenLight);
 +	/*
 +	* visual style support
 +	*/
 +
 +	CopyRect(&rcTabPage, &rctPage);
 +	if (!tabdat->bRefreshWithoutClip)
 +		ExcludeClipRect(hdc, rctClip.left, rctClip.top, rctClip.right, rctClip.bottom);
 +	else
 +		ZeroMemory(&rctClip, sizeof(RECT));
 +	if ((!bClassicDraw || PluginConfig.m_fillColor) && IntersectRect(&rectTemp, &rctPage, &ps.rcPaint) && !CSkin::m_skinEnabled) {
 +		RECT rcClient = rctPage;
 +		if (dwStyle & TCS_BOTTOM) {
 +			rcClient.bottom = rctPage.bottom;
 +			uiFlags |= uiBottom;
 +		} else
 +			rcClient.top = rctPage.top;
 +		if (PluginConfig.m_fillColor)
 +			DrawCustomTabPage(hdc, rcClient);
 +		else 
 +			DrawThemesXpTabItem(hdc, -1, &rcClient, uiFlags, tabdat, 0);	// TABP_PANE=9,0,'TAB'
 +		if (tabdat->bRefreshWithoutClip)
 +			goto skip_tabs;
 +	}
 +	else if ( IntersectRect(&rectTemp, &rctPage, &ps.rcPaint)) {
 +		if (CSkin::m_skinEnabled) {
 +			CSkinItem *item = &SkinItems[ID_EXTBKTABPAGE];
 +
 +			if (!item->IGNORED) {
 +				DrawAlpha(hdc, &rctPage, item->COLOR, item->ALPHA, item->COLOR2, item->COLOR2_TRANSPARENT,
 +					item->GRADIENT, item->CORNER, item->BORDERSTYLE, item->imageItem);
 +				goto page_done;
 +			}
 +		}
 +
 +		if (tabdat->bRefreshWithoutClip)
 +			goto skip_tabs;
 +
 +		if (dwStyle & TCS_BUTTONS) {
 +			rectTemp = rctPage;
 +			if (dwStyle & TCS_BOTTOM) {
 +				rectTemp.top--;
 +				rectTemp.bottom--;
 +			}
 +			else {
 +				rectTemp.bottom--;
 +				rectTemp.top++;
 +			}
 +			if (PluginConfig.m_fillColor)
 +				DrawCustomTabPage(hdc, rectTemp);
 +			else {
 +				MoveToEx(hdc, rectTemp.left, rectTemp.bottom, &pt);
 +				LineTo(hdc, rectTemp.left, rectTemp.top + 1);
 +				LineTo(hdc, rectTemp.right - 1, rectTemp.top + 1);
 +				SelectObject(hdc, PluginConfig.tabConfig.m_hPenShadow);
 +				LineTo(hdc, rectTemp.right - 1, rectTemp.bottom);
 +				LineTo(hdc, rectTemp.left, rectTemp.bottom);
 +			}
 +		}
 +		else {
 +			rectTemp = rctPage;
 +			if (PluginConfig.m_fillColor)
 +				DrawCustomTabPage(hdc, rectTemp);
 +			else {
 +				MoveToEx(hdc, rectTemp.left, rectTemp.bottom - 1, &pt);
 +				LineTo(hdc, rectTemp.left, rectTemp.top);
 +
 +				if (dwStyle & TCS_BOTTOM) {
 +					LineTo(hdc, rectTemp.right - 1, rectTemp.top);
 +					SelectObject(hdc, PluginConfig.tabConfig.m_hPenShadow);
 +					LineTo(hdc, rectTemp.right - 1, rectTemp.bottom - 1);
 +					LineTo(hdc, rctActive.right, rectTemp.bottom - 1);
 +					MoveToEx(hdc, rctActive.left - 2, rectTemp.bottom - 1, &pt);
 +					LineTo(hdc, rectTemp.left - 1, rectTemp.bottom - 1);
 +					SelectObject(hdc, PluginConfig.tabConfig.m_hPenItemShadow);
 +					MoveToEx(hdc, rectTemp.right - 2, rectTemp.top + 1, &pt);
 +					LineTo(hdc, rectTemp.right - 2, rectTemp.bottom - 2);
 +					LineTo(hdc, rctActive.right, rectTemp.bottom - 2);
 +					MoveToEx(hdc, rctActive.left - 2, rectTemp.bottom - 2, &pt);
 +					LineTo(hdc, rectTemp.left, rectTemp.bottom - 2);
 +				}
 +				else {
 +					if (rctActive.left >= 0) {
 +						LineTo(hdc, rctActive.left, rctActive.bottom);
 +						if (IsRectEmpty(&rectUpDn))
 +							MoveToEx(hdc, rctActive.right, rctActive.bottom, &pt);
 +						else {
 +							if (rctActive.right >= rectUpDn.left)
 +								MoveToEx(hdc, rectUpDn.left - SHIFT_FROM_CUT_TO_SPIN + 2, rctActive.bottom + 1, &pt);
 +							else
 +								MoveToEx(hdc, rctActive.right, rctActive.bottom, &pt);
 +						}
 +						LineTo(hdc, rectTemp.right - 2, rctActive.bottom);
 +					}
 +					else {
 +						RECT rectItemLeftmost;
 +						UINT nItemLeftmost = FindLeftDownItem(hwnd);
 +						TabCtrl_GetItemRect(hwnd, nItemLeftmost, &rectItemLeftmost);
 +						LineTo(hdc, rectTemp.right - 2, rctActive.bottom);
 +					}
 +					SelectObject(hdc, PluginConfig.tabConfig.m_hPenItemShadow);
 +					LineTo(hdc, rectTemp.right - 2, rectTemp.bottom - 2);
 +					LineTo(hdc, rectTemp.left, rectTemp.bottom - 2);
 +
 +					SelectObject(hdc, PluginConfig.tabConfig.m_hPenShadow);
 +					MoveToEx(hdc, rectTemp.right - 1, rctActive.bottom, &pt);
 +					LineTo(hdc, rectTemp.right - 1, rectTemp.bottom - 1);
 +					LineTo(hdc, rectTemp.left - 2, rectTemp.bottom - 1);
 +				}
 +			}
 +		}
 +	}
 +page_done:
 +	/*
 +	* if aero is active _and_ the infopanel is visible in the current window, we "flatten" out the top area
 +	* of the tab page by overpainting it black (thus it will appear transparent)
 +	*/
 +	if (isAero && tabdat->helperDat) {
 +		RECT	rcLog, rcPage;
 +		POINT	pt;
 +
 +		GetClientRect(hwnd, &rcPage);
 +		if (dwStyle & TCS_BOTTOM) {
 +			GetWindowRect(tabdat->helperDat->hwnd, &rcLog);
 +			pt.y = rcLog.bottom;
 +			pt.x = rcLog.left;
 +			ScreenToClient(hwnd, &pt);
 +			rcPage.top = pt.y + ((nCount > 1 || !(tabdat->helperDat->pContainer->dwFlags & CNT_HIDETABS)) ? tabdat->helperDat->pContainer->tBorder : 0);
 +			FillRect(hdc, &rcPage, CSkin::m_BrushBack);
 +			rcPage.top = 0;
 +		}
 +		GetWindowRect(GetDlgItem(tabdat->helperDat->hwnd, tabdat->helperDat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_CHAT_LOG), &rcLog);
 +		pt.y = rcLog.top;
 +		pt.x = rcLog.left;
 +		ScreenToClient(hwnd, &pt);
 +		rcPage.bottom = pt.y;
 +		FillRect(hdc, &rcPage, CSkin::m_BrushBack);
 +	}
 +
 +	uiFlags = 0;
 +	/*
 +	* figure out hottracked item (if any)
 +	*/
 +
 +	if (tabdat->bRefreshWithoutClip)
 +		goto skip_tabs;
 +
 +	GetCursorPos(&hti.pt);
 +	ScreenToClient(hwnd, &hti.pt);
 +	hti.flags = 0;
 +	hotItem = TabCtrl_HitTest(hwnd, &hti);
 +	for (i=0; i < nCount; i++) {
 +		TWindowData* dat = 0;
 +
 +		if (i != iActive) {
 +			TabCtrl_GetItem(hwnd, i, &item);
 +			if (item.lParam)
 +				dat = (TWindowData *)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA);
 +			TabCtrl_GetItemRect(hwnd, i, &rcItem);
 +			if (!bClassicDraw && uiBottom) {
 +				rcItem.top -= PluginConfig.tabConfig.m_bottomAdjust;
 +				rcItem.bottom -= PluginConfig.tabConfig.m_bottomAdjust;
 +			}
 +			if (IntersectRect(&rectTemp, &rcItem, &ps.rcPaint) || bClassicDraw) {
 +				int nHint = 0;
 +				if (!bClassicDraw && !(dwStyle & TCS_BUTTONS)) {
 +					DrawThemesXpTabItem(hdc, i, &rcItem, uiFlags | uiBottom | (i == hotItem ? 4 : 0), tabdat, dat);
 +					DrawItem(tabdat, hdc, &rcItem, nHint | (i == hotItem ? HINT_HOTTRACK : 0), i, dat);
 +				}
 +				else {
 +					if (tabdat->fAeroTabs && !CSkin::m_skinEnabled && !(dwStyle & TCS_BUTTONS))
 +						DrawThemesPartWithAero(tabdat, hdc, 0, (i == hotItem ? PBS_HOT : PBS_NORMAL), &rcItem, dat);
 +					else
 +						DrawItemRect(tabdat, hdc, &rcItem, nHint | (i == hotItem ? HINT_HOTTRACK : 0), i, dat);
 +					DrawItem(tabdat, hdc, &rcItem, nHint | (i == hotItem ? HINT_HOTTRACK : 0), i, dat);
 +				}
 +			}
 +		}
 +	}
 +
 +	/*
 +	* draw the active item
 +	*/
 +	if (!bClassicDraw && uiBottom) {
 +		rctActive.top -= PluginConfig.tabConfig.m_bottomAdjust;
 +		rctActive.bottom -= PluginConfig.tabConfig.m_bottomAdjust;
 +	}
 +	if (rctActive.left >= 0) {
 +		TWindowData *dat = 0;
 +		int nHint = 0;
 +
 +		rcItem = rctActive;
 +		TabCtrl_GetItem(hwnd, iActive, &item);
 +		if (item.lParam)
 +			dat = (TWindowData *)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA);
 +
 +		if (!bClassicDraw && !(dwStyle & TCS_BUTTONS)) {
 +			InflateRect(&rcItem, 2, 2);
 +			DrawThemesXpTabItem(hdc, iActive, &rcItem, 2 | uiBottom, tabdat, dat);
 +			DrawItem(tabdat, hdc, &rcItem, nHint | HINT_ACTIVE_ITEM, iActive, dat);
 +		}
 +		else {
 +			if (!(dwStyle & TCS_BUTTONS)) {
 +				if (iActive == 0) {
 +					rcItem.right += 2;
 +					rcItem.left--;
 +				}
 +				else InflateRect(&rcItem, 2, 0);
 +			}
 +			if (tabdat->fAeroTabs && !CSkin::m_skinEnabled && !(dwStyle & TCS_BUTTONS)) {
 +				if (dwStyle & TCS_BOTTOM)
 +					rcItem.bottom += 2;
 +				else
 +					rcItem.top -= 2;
 +				DrawThemesPartWithAero(tabdat, hdc, 0, PBS_PRESSED, &rcItem, dat);
 +			}
 +			else DrawItemRect(tabdat, hdc, &rcItem, HINT_ACTIVATE_RIGHT_SIDE | HINT_ACTIVE_ITEM | nHint, iActive, dat);
 +
 +			DrawItem(tabdat, hdc, &rcItem, HINT_ACTIVE_ITEM | nHint, iActive, dat);
 +		}
 +	}
 +skip_tabs:
 +	if (hPenOld)
 +		SelectObject(hdc, hPenOld);
 +
 +	/*
 +	* finally, bitblt the contents of the memory dc to the real dc
 +	*/
 +	if (!tabdat->bRefreshWithoutClip)
 +		ExcludeClipRect(hdcreal, rctClip.left, rctClip.top, rctClip.right, rctClip.bottom);
 +
 +	if (hpb)
 +		CSkin::FinalizeBufferedPaint(hpb, &rctOrig);
 +	else {
 +		BitBlt(hdcreal, 0, 0, cx, cy, hdc, 0, 0, SRCCOPY);
 +		SelectObject(hdc, bmpOld);
 +		DeleteObject(bmpMem);
 +		DeleteDC(hdc);
 +	}
 +	EndPaint(hwnd, &ps);
 +}
 +
  static LRESULT CALLBACK TabControlSubclassProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  {
  	TabControlData *tabdat = (TabControlData *)GetWindowLongPtr(hwnd, GWLP_USERDATA);
 @@ -784,12 +1082,14 @@ static LRESULT CALLBACK TabControlSubclassProc(HWND hwnd, UINT msg, WPARAM wPara  			}
  		}
  		break;
 +
  	case WM_NCDESTROY:
  		if (tabdat) {
  			mir_free(tabdat);
  			SetWindowLongPtr(hwnd, GWLP_USERDATA, 0L);
  		}
  		break;
 +
  	case WM_MBUTTONDOWN:
  		GetCursorPos(&pt);
  		SendMessage(GetParent(hwnd), DM_CLOSETABATMOUSE, 0, (LPARAM)&pt);
 @@ -991,7 +1291,6 @@ static LRESULT CALLBACK TabControlSubclassProc(HWND hwnd, UINT msg, WPARAM wPara  		}
  		if (tabdat->fCloseButton) {
  			POINT	pt;
 -
  			GetCursorPos(&pt);
  			int iItem = TabCtrl_TestForCloseButton(tabdat, hwnd, pt);
  			if (iItem != -1)
 @@ -1005,355 +1304,7 @@ static LRESULT CALLBACK TabControlSubclassProc(HWND hwnd, UINT msg, WPARAM wPara  		return 0;
  	case WM_PAINT:
 -		{
 -			PAINTSTRUCT ps;
 -			HDC hdcreal, hdc;
 -			RECT rectTemp, rctPage, rctActive, rcItem, rctClip, rctOrig;
 -			RECT rectUpDn = {0, 0, 0, 0};
 -			int nCount = TabCtrl_GetItemCount(hwnd), i;
 -			TCITEM item = {0};
 -			int iActive, hotItem;
 -			POINT pt;
 -			DWORD dwStyle = tabdat->dwStyle;
 -			HPEN hPenOld = 0;
 -			UINT uiFlags = 1;
 -			UINT uiBottom = 0;
 -			TCHITTESTINFO hti;
 -			HBITMAP bmpMem, bmpOld;
 -			DWORD cx, cy;
 -			bool  isAero = M->isAero();
 -			HANDLE hpb = 0;
 -			BOOL bClassicDraw = !isAero && (tabdat->m_VisualStyles == FALSE || CSkin::m_skinEnabled);
 -			if (GetUpdateRect(hwnd, NULL, TRUE) == 0)
 -				break;
 -
 -			item.mask = TCIF_PARAM;
 -
 -			tabdat->fAeroTabs = (CSkin::m_fAeroSkinsValid && (isAero || PluginConfig.m_fillColor)) ? TRUE : FALSE;
 -			tabdat->fCloseButton = tabdat->pContainer ? (tabdat->pContainer->dwFlagsEx & TCF_CLOSEBUTTON ? TRUE : FALSE) : FALSE;
 -
 -			tabdat->helperDat = 0;
 -
 -			if (tabdat->fAeroTabs && tabdat->pContainer) {
 -				TWindowData *dat = (TWindowData *)GetWindowLongPtr(tabdat->pContainer->hwndActive, GWLP_USERDATA);
 -				if (dat) {
 -					tabdat->helperDat = dat;
 -				}
 -				else
 -					tabdat->fAeroTabs = 0;
 -
 -				tabdat->helperItem =  (dwStyle & TCS_BOTTOM) ? CSkin::m_tabBottom : CSkin::m_tabTop;
 -				tabdat->helperGlowItem = (dwStyle & TCS_BOTTOM) ? CSkin::m_tabGlowBottom : CSkin::m_tabGlowTop;
 -			}
 -			else
 -				tabdat->fAeroTabs = FALSE;
 -
 -			hdcreal = BeginPaint(hwnd, &ps);
 -
 -			/*
 -			* switchbar is active, don't paint a single pixel, the tab control won't be visible at all
 -			* same when we have only ONE tab and do not want it to be visible because of the container
 -			* option "Show tab bar only when needed".
 -			*/
 -
 -			if ((tabdat->pContainer->dwFlags & CNT_SIDEBAR) || (nCount == 1 && tabdat->pContainer->dwFlags & CNT_HIDETABS)) {
 -				if (nCount == 0)
 -					FillRect(hdcreal, &ps.rcPaint, GetSysColorBrush(COLOR_3DFACE)); // avoid flickering/ugly black background during container creation
 -				EndPaint(hwnd, &ps);
 -				return 0;
 -			}
 -
 -			GetClientRect(hwnd, &rctPage);
 -			rctOrig = rctPage;
 -			iActive = TabCtrl_GetCurSel(hwnd);
 -			TabCtrl_GetItemRect(hwnd, iActive, &rctActive);
 -			cx = rctPage.right - rctPage.left;
 -			cy = rctPage.bottom - rctPage.top;
 -
 -			/*
 -			* draw everything to a memory dc to avoid flickering
 -			*/
 -
 -			if (CMimAPI::m_haveBufferedPaint)
 -				hpb = tabdat->hbp = CSkin::InitiateBufferedPaint(hdcreal, rctPage, hdc);
 -			else {
 -				hdc = CreateCompatibleDC(hdcreal);
 -				bmpMem = tabdat->fAeroTabs ? CSkin::CreateAeroCompatibleBitmap(rctPage, hdcreal) : CreateCompatibleBitmap(hdcreal, cx, cy);
 -				bmpOld = (HBITMAP)SelectObject(hdc, bmpMem);
 -			}
 -
 -			if (nCount == 1 && tabdat->pContainer->dwFlags & CNT_HIDETABS)
 -				rctClip = rctPage;
 -
 -			if (CSkin::m_skinEnabled)
 -				CSkin::SkinDrawBG(hwnd, tabdat->pContainer->hwnd, tabdat->pContainer, &rctPage, hdc);
 -			else
 -				CSkin::FillBack(hdc, &rctPage);
 -
 -			if (dwStyle & TCS_BUTTONS) {
 -				RECT rc1;
 -				TabCtrl_GetItemRect(hwnd, nCount - 1, &rc1);
 -				if (dwStyle & TCS_BOTTOM) {
 -					rctPage.bottom = rc1.top;
 -					uiBottom = 8;
 -				} else {
 -					rctPage.top = rc1.bottom + 2;
 -					uiBottom = 0;
 -				}
 -			} else {
 -				if (dwStyle & TCS_BOTTOM) {
 -					rctPage.bottom = rctActive.top;
 -					uiBottom = 8;
 -				} else {
 -					rctPage.top = rctActive.bottom;
 -					uiBottom = 0;
 -				}
 -			}
 -
 -			if (nCount > 1 || !(tabdat->pContainer->dwFlags & CNT_HIDETABS)) {
 -				rctClip = rctPage;
 -				InflateRect(&rctClip, -tabdat->pContainer->tBorder, -tabdat->pContainer->tBorder);
 -			}
 -			else
 -				ZeroMemory(&rctClip, sizeof(RECT));
 -
 -			hPenOld = (HPEN)SelectObject(hdc, PluginConfig.tabConfig.m_hPenLight);
 -			/*
 -			* visual style support
 -			*/
 -
 -			CopyRect(&rcTabPage, &rctPage);
 -			if (!tabdat->bRefreshWithoutClip)
 -				ExcludeClipRect(hdc, rctClip.left, rctClip.top, rctClip.right, rctClip.bottom);
 -			else
 -				ZeroMemory(&rctClip, sizeof(RECT));
 -			if ((!bClassicDraw || PluginConfig.m_fillColor) && IntersectRect(&rectTemp, &rctPage, &ps.rcPaint) && !CSkin::m_skinEnabled) {
 -				RECT rcClient = rctPage;
 -				if (dwStyle & TCS_BOTTOM) {
 -					rcClient.bottom = rctPage.bottom;
 -					uiFlags |= uiBottom;
 -				} else
 -					rcClient.top = rctPage.top;
 -				if (PluginConfig.m_fillColor)
 -					DrawCustomTabPage(hdc, rcClient);
 -				else 
 -					DrawThemesXpTabItem(hdc, -1, &rcClient, uiFlags, tabdat, 0);	// TABP_PANE=9,0,'TAB'
 -				if (tabdat->bRefreshWithoutClip)
 -					goto skip_tabs;
 -			} else {
 -				if (IntersectRect(&rectTemp, &rctPage, &ps.rcPaint)) {
 -					if (CSkin::m_skinEnabled) {
 -						CSkinItem *item = &SkinItems[ID_EXTBKTABPAGE];
 -
 -						if (!item->IGNORED) {
 -							DrawAlpha(hdc, &rctPage, item->COLOR, item->ALPHA, item->COLOR2, item->COLOR2_TRANSPARENT,
 -								item->GRADIENT, item->CORNER, item->BORDERSTYLE, item->imageItem);
 -							goto page_done;
 -						}
 -					}
 -
 -					if (tabdat->bRefreshWithoutClip)
 -						goto skip_tabs;
 -
 -					if (dwStyle & TCS_BUTTONS) {
 -						rectTemp = rctPage;
 -						if (dwStyle & TCS_BOTTOM) {
 -							rectTemp.top--;
 -							rectTemp.bottom--;
 -						} else {
 -							rectTemp.bottom--;
 -							rectTemp.top++;
 -						}
 -						if (PluginConfig.m_fillColor)
 -							DrawCustomTabPage(hdc, rectTemp);
 -						else {
 -							MoveToEx(hdc, rectTemp.left, rectTemp.bottom, &pt);
 -							LineTo(hdc, rectTemp.left, rectTemp.top + 1);
 -							LineTo(hdc, rectTemp.right - 1, rectTemp.top + 1);
 -							SelectObject(hdc, PluginConfig.tabConfig.m_hPenShadow);
 -							LineTo(hdc, rectTemp.right - 1, rectTemp.bottom);
 -							LineTo(hdc, rectTemp.left, rectTemp.bottom);
 -						}
 -					} else {
 -						rectTemp = rctPage;
 -						if (PluginConfig.m_fillColor)
 -							DrawCustomTabPage(hdc, rectTemp);
 -						else {
 -							MoveToEx(hdc, rectTemp.left, rectTemp.bottom - 1, &pt);
 -							LineTo(hdc, rectTemp.left, rectTemp.top);
 -
 -							if (dwStyle & TCS_BOTTOM) {
 -								LineTo(hdc, rectTemp.right - 1, rectTemp.top);
 -								SelectObject(hdc, PluginConfig.tabConfig.m_hPenShadow);
 -								LineTo(hdc, rectTemp.right - 1, rectTemp.bottom - 1);
 -								LineTo(hdc, rctActive.right, rectTemp.bottom - 1);
 -								MoveToEx(hdc, rctActive.left - 2, rectTemp.bottom - 1, &pt);
 -								LineTo(hdc, rectTemp.left - 1, rectTemp.bottom - 1);
 -								SelectObject(hdc, PluginConfig.tabConfig.m_hPenItemShadow);
 -								MoveToEx(hdc, rectTemp.right - 2, rectTemp.top + 1, &pt);
 -								LineTo(hdc, rectTemp.right - 2, rectTemp.bottom - 2);
 -								LineTo(hdc, rctActive.right, rectTemp.bottom - 2);
 -								MoveToEx(hdc, rctActive.left - 2, rectTemp.bottom - 2, &pt);
 -								LineTo(hdc, rectTemp.left, rectTemp.bottom - 2);
 -							} else {
 -								if (rctActive.left >= 0) {
 -									LineTo(hdc, rctActive.left, rctActive.bottom);
 -									if (IsRectEmpty(&rectUpDn))
 -										MoveToEx(hdc, rctActive.right, rctActive.bottom, &pt);
 -									else {
 -										if (rctActive.right >= rectUpDn.left)
 -											MoveToEx(hdc, rectUpDn.left - SHIFT_FROM_CUT_TO_SPIN + 2, rctActive.bottom + 1, &pt);
 -										else
 -											MoveToEx(hdc, rctActive.right, rctActive.bottom, &pt);
 -									}
 -									LineTo(hdc, rectTemp.right - 2, rctActive.bottom);
 -								} else {
 -									RECT rectItemLeftmost;
 -									UINT nItemLeftmost = FindLeftDownItem(hwnd);
 -									TabCtrl_GetItemRect(hwnd, nItemLeftmost, &rectItemLeftmost);
 -									LineTo(hdc, rectTemp.right - 2, rctActive.bottom);
 -								}
 -								SelectObject(hdc, PluginConfig.tabConfig.m_hPenItemShadow);
 -								LineTo(hdc, rectTemp.right - 2, rectTemp.bottom - 2);
 -								LineTo(hdc, rectTemp.left, rectTemp.bottom - 2);
 -
 -								SelectObject(hdc, PluginConfig.tabConfig.m_hPenShadow);
 -								MoveToEx(hdc, rectTemp.right - 1, rctActive.bottom, &pt);
 -								LineTo(hdc, rectTemp.right - 1, rectTemp.bottom - 1);
 -								LineTo(hdc, rectTemp.left - 2, rectTemp.bottom - 1);
 -							}
 -						}
 -					}
 -				}
 -			}
 -page_done:
 -			/*
 -			* if aero is active _and_ the infopanel is visible in the current window, we "flatten" out the top area
 -			* of the tab page by overpainting it black (thus it will appear transparent)
 -			*/
 -			if (isAero && tabdat->helperDat) {
 -				RECT	rcLog, rcPage;
 -				POINT	pt;
 -
 -				GetClientRect(hwnd, &rcPage);
 -				if (dwStyle & TCS_BOTTOM) {
 -					GetWindowRect(tabdat->helperDat->hwnd, &rcLog);
 -					pt.y = rcLog.bottom;
 -					pt.x = rcLog.left;
 -					ScreenToClient(hwnd, &pt);
 -					rcPage.top = pt.y + ((nCount > 1 || !(tabdat->helperDat->pContainer->dwFlags & CNT_HIDETABS)) ? tabdat->helperDat->pContainer->tBorder : 0);
 -					FillRect(hdc, &rcPage, CSkin::m_BrushBack);
 -					rcPage.top = 0;
 -				}
 -				GetWindowRect(GetDlgItem(tabdat->helperDat->hwnd, tabdat->helperDat->bType == SESSIONTYPE_IM ? IDC_LOG : IDC_CHAT_LOG), &rcLog);
 -				pt.y = rcLog.top;
 -				pt.x = rcLog.left;
 -				ScreenToClient(hwnd, &pt);
 -				rcPage.bottom = pt.y;
 -				FillRect(hdc, &rcPage, CSkin::m_BrushBack);
 -			}
 -
 -			uiFlags = 0;
 -			/*
 -			* figure out hottracked item (if any)
 -			*/
 -
 -			if (tabdat->bRefreshWithoutClip)
 -				goto skip_tabs;
 -
 -			GetCursorPos(&hti.pt);
 -			ScreenToClient(hwnd, &hti.pt);
 -			hti.flags = 0;
 -			hotItem = TabCtrl_HitTest(hwnd, &hti);
 -			for (i=0; i < nCount; i++) {
 -				TWindowData* dat = 0;
 -
 -				if (i != iActive) {
 -					TabCtrl_GetItem(hwnd, i, &item);
 -					if (item.lParam)
 -						dat = (TWindowData *)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA);
 -					TabCtrl_GetItemRect(hwnd, i, &rcItem);
 -					if (!bClassicDraw && uiBottom) {
 -						rcItem.top -= PluginConfig.tabConfig.m_bottomAdjust;
 -						rcItem.bottom -= PluginConfig.tabConfig.m_bottomAdjust;
 -					}
 -					if (IntersectRect(&rectTemp, &rcItem, &ps.rcPaint) || bClassicDraw) {
 -						int nHint = 0;
 -						if (!bClassicDraw && !(dwStyle & TCS_BUTTONS)) {
 -							DrawThemesXpTabItem(hdc, i, &rcItem, uiFlags | uiBottom | (i == hotItem ? 4 : 0), tabdat, dat);
 -							DrawItem(tabdat, hdc, &rcItem, nHint | (i == hotItem ? HINT_HOTTRACK : 0), i, dat);
 -						} else {
 -							if (tabdat->fAeroTabs && !CSkin::m_skinEnabled && !(dwStyle & TCS_BUTTONS))
 -								DrawThemesPartWithAero(tabdat, hdc, 0, (i == hotItem ? PBS_HOT : PBS_NORMAL), &rcItem, dat);
 -							else
 -								DrawItemRect(tabdat, hdc, &rcItem, nHint | (i == hotItem ? HINT_HOTTRACK : 0), i, dat);
 -							DrawItem(tabdat, hdc, &rcItem, nHint | (i == hotItem ? HINT_HOTTRACK : 0), i, dat);
 -						}
 -					}
 -				}
 -			}
 -			/*
 -			* draw the active item
 -			*/
 -			if (!bClassicDraw && uiBottom) {
 -				rctActive.top -= PluginConfig.tabConfig.m_bottomAdjust;
 -				rctActive.bottom -= PluginConfig.tabConfig.m_bottomAdjust;
 -			}
 -			if (rctActive.left >= 0) {
 -				TWindowData*	dat = 0;
 -				int 			nHint = 0;
 -
 -				rcItem = rctActive;
 -				TabCtrl_GetItem(hwnd, iActive, &item);
 -				if (item.lParam)
 -					dat = (TWindowData *)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA);
 -
 -				if (!bClassicDraw && !(dwStyle & TCS_BUTTONS)) {
 -					InflateRect(&rcItem, 2, 2);
 -					DrawThemesXpTabItem(hdc, iActive, &rcItem, 2 | uiBottom, tabdat, dat);
 -					DrawItem(tabdat, hdc, &rcItem, nHint | HINT_ACTIVE_ITEM, iActive, dat);
 -				} else {
 -					if (!(dwStyle & TCS_BUTTONS)) {
 -						if (iActive == 0) {
 -							rcItem.right += 2;
 -							rcItem.left--;
 -						} else
 -							InflateRect(&rcItem, 2, 0);
 -					}
 -					if (tabdat->fAeroTabs && !CSkin::m_skinEnabled && !(dwStyle & TCS_BUTTONS)) {
 -						if (dwStyle & TCS_BOTTOM)
 -							rcItem.bottom+= 2;
 -						else
 -							rcItem.top-= 2;
 -						DrawThemesPartWithAero(tabdat, hdc, 0, PBS_PRESSED, &rcItem, dat);
 -					}
 -					else
 -						DrawItemRect(tabdat, hdc, &rcItem, HINT_ACTIVATE_RIGHT_SIDE | HINT_ACTIVE_ITEM | nHint, iActive, dat);
 -					DrawItem(tabdat, hdc, &rcItem, HINT_ACTIVE_ITEM | nHint, iActive, dat);
 -				}
 -			}
 -skip_tabs:
 -			if (hPenOld)
 -				SelectObject(hdc, hPenOld);
 -
 -			/*
 -			* finally, bitblt the contents of the memory dc to the real dc
 -			*/
 -			//if (!tabdat->pContainer->bSkinned)
 -			if (!tabdat->bRefreshWithoutClip)
 -				ExcludeClipRect(hdcreal, rctClip.left, rctClip.top, rctClip.right, rctClip.bottom);
 -
 -			if (hpb)
 -				CSkin::FinalizeBufferedPaint(hpb, &rctOrig);
 -			//CMimAPI::m_pfnEndBufferedPaint(hpb, TRUE);
 -			else {
 -				BitBlt(hdcreal, 0, 0, cx, cy, hdc, 0, 0, SRCCOPY);
 -				SelectObject(hdc, bmpOld);
 -				DeleteObject(bmpMem);
 -				DeleteDC(hdc);
 -			}
 -			EndPaint(hwnd, &ps);
 -		}
 +		PaintWorker(hwnd, tabdat);
  		return 0;
  	case WM_TIMER:
 @@ -1365,21 +1316,18 @@ skip_tabs:  			KillTimer(hwnd, TIMERID_HOVER_T);
  			GetCursorPos(&pt);
  			if (abs(pt.x - ptMouseT.x) < 5 && abs(pt.y - ptMouseT.y) < 5) {
 -				TCITEM item = {0};
 -				int    nItem = 0;
 -				struct TWindowData *dat = 0;
 -
  				ti.ptCursor = pt;
 -				//ScreenToClient(hwnd, &pt);
 +				TCITEM item = {0};
  				item.mask = TCIF_PARAM;
 -				nItem = GetTabItemFromMouse(hwnd, &pt);
 +				int nItem = GetTabItemFromMouse(hwnd, &pt);
  				if (nItem >= 0 && nItem < TabCtrl_GetItemCount(hwnd)) {
  					TabCtrl_GetItem(hwnd, nItem, &item);
 +	
  					/*
 -					* get the message window data for the session to which this tab item belongs
 -					*/
 -
 +					 * get the message window data for the session to which this tab item belongs
 +					 */
 +					TWindowData *dat = 0;
  					if (IsWindow((HWND)item.lParam) && item.lParam != 0)
  						dat = (struct TWindowData *)GetWindowLongPtr((HWND)item.lParam, GWLP_USERDATA);
  					if (dat) {
 @@ -1393,12 +1341,10 @@ skip_tabs:  			}
  		}
  		break;
 -	
 +
  	case WM_MOUSEWHEEL:
 -		{
 -			short amount = (short)(HIWORD(wParam));
 -			if (lParam != -1)
 -				break;
 +		if (lParam == -1) {
 +			int amount = HIWORD(wParam);
  			if (amount > 0)
  				SendMessage(GetParent(hwnd), DM_SELECTTAB, DM_SELECT_PREV, 0);
  			else if (amount < 0)
 @@ -1582,3 +1528,40 @@ INT_PTR CALLBACK DlgProcTabConfig(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM  	}
  	return FALSE;
  }
 +
 +/*
 + * register the new tab control as a window class (TSTabCtrlClass)
 + */
 +
 +int TSAPI RegisterTabCtrlClass(void)
 +{
 +	WNDCLASSEX wc = { sizeof(wc) };
 +	wc.lpszClassName  = _T("TSTabCtrlClass");
 +	wc.lpfnWndProc    = TabControlSubclassProc;
 +	wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
 +	wc.cbWndExtra     = sizeof(TabControlData*);
 +	wc.style          = CS_GLOBALCLASS | CS_DBLCLKS | CS_PARENTDC;
 +	RegisterClassEx(&wc);
 +
 +	wc.lpszClassName  = _T("TSStatusBarClass");
 +	wc.lpfnWndProc    = StatusBarSubclassProc;
 +	wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
 +	wc.cbWndExtra     = sizeof(void*);
 +	wc.style          = CS_GLOBALCLASS | CS_DBLCLKS | CS_PARENTDC;
 +	RegisterClassEx(&wc);
 +
 +	wc.lpszClassName  = _T("TS_SideBarClass");
 +	wc.lpfnWndProc    = CSideBar::wndProcStub;;
 +	wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
 +	wc.cbWndExtra     = sizeof(void*);
 +	wc.style          = CS_GLOBALCLASS;// | CS_DBLCLKS; // | CS_PARENTDC;
 +	RegisterClassEx(&wc);
 +
 +	wc.lpszClassName  = _T("TSHK");
 +	wc.lpfnWndProc    = HotkeyHandlerDlgProc;
 +	wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
 +	wc.cbWndExtra     = sizeof(void*);
 +	wc.style          = CS_GLOBALCLASS;// | CS_DBLCLKS; // | CS_PARENTDC;
 +	RegisterClassEx(&wc);
 +	return 0;
 +}
  | 
