From e74376e044f745e7efdbb6bcd3d8c1de5d46d470 Mon Sep 17 00:00:00 2001 From: George Hazan <george.hazan@gmail.com> Date: Tue, 18 Jun 2013 20:40:42 +0000 Subject: fix for massive handle leak in tabSRMM git-svn-id: http://svn.miranda-ng.org/main/trunk@5028 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/TabSRMM/src/buttonsbar.cpp | 85 +++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 48 deletions(-) (limited to 'plugins/TabSRMM') diff --git a/plugins/TabSRMM/src/buttonsbar.cpp b/plugins/TabSRMM/src/buttonsbar.cpp index a7fcff7b36..379c01ba03 100644 --- a/plugins/TabSRMM/src/buttonsbar.cpp +++ b/plugins/TabSRMM/src/buttonsbar.cpp @@ -659,44 +659,39 @@ void TSAPI BB_RedrawButtons(TWindowData *dat) BOOL TSAPI BB_SetButtonsPos(TWindowData *dat) { - RECT rect; - int i; - HWND hwndBtn = 0; - int lwidth = 0, rwidth = 0; - RECT rcSplitter; - POINT ptSplitter; - int splitterY, iOff; - BYTE gap = DPISCALEX_S(PluginConfig.g_iButtonsBarGap); - int foravatar = 0; - BOOL showToolbar = dat->pContainer->dwFlags & CNT_HIDETOOLBAR ? 0 : 1; - BOOL bBottomToolbar = dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR ? 1 : 0; - int tempL = dat->bbLSideWidth; - int tempR = dat->bbRSideWidth; - HWND hwnd = dat->hwnd; - HDWP hdwp = BeginDeferWindowPos(LButtonsList->realCount + RButtonsList->realCount + 1); - HWND hwndToggleSideBar = GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_TOGGLESIDEBAR : IDC_CHAT_TOGGLESIDEBAR); - + HWND hwnd = dat->hwnd; if (!dat || !IsWindowVisible(hwnd)) return 0; + RECT rect; + int i; + HWND hwndBtn = 0; + + BYTE gap = DPISCALEX_S(PluginConfig.g_iButtonsBarGap); + bool showToolbar = !(dat->pContainer->dwFlags & CNT_HIDETOOLBAR); + bool bBottomToolbar = (dat->pContainer->dwFlags & CNT_BOTTOMTOOLBAR) != 0; + + HDWP hdwp = BeginDeferWindowPos(LButtonsList->realCount + RButtonsList->realCount + 1); + + HWND hwndToggleSideBar = GetDlgItem(dat->hwnd, dat->bType == SESSIONTYPE_IM ? IDC_TOGGLESIDEBAR : IDC_CHAT_TOGGLESIDEBAR); ShowWindow(hwndToggleSideBar, (showToolbar && dat->pContainer->SideBar->isActive()) ? SW_SHOW : SW_HIDE); EnterCriticalSection(&ToolBarCS); + RECT rcSplitter; GetWindowRect(GetDlgItem(hwnd, (dat->bType == SESSIONTYPE_IM) ? IDC_SPLITTER : IDC_SPLITTERY), &rcSplitter); - ptSplitter.x = 0; - ptSplitter.y = rcSplitter.top; + + POINT ptSplitter = { 0, rcSplitter.top }; ScreenToClient(hwnd, &ptSplitter); - if (PluginConfig.g_DPIscaleY > 1.0) - iOff = dat->bType == SESSIONTYPE_IM ? DPISCALEY_S(22) : DPISCALEY_S(23); - else - iOff = DPISCALEY_S(22); GetClientRect(hwnd, &rect); - if (!bBottomToolbar) splitterY = ptSplitter.y - DPISCALEY_S(1); - else splitterY = rect.bottom; + int splitterY = (!bBottomToolbar) ? ptSplitter.y - DPISCALEY_S(1) : rect.bottom; + int tempL = dat->bbLSideWidth, tempR = dat->bbRSideWidth; + int lwidth = 0, rwidth = 0; + int iOff = DPISCALEY_S((PluginConfig.g_DPIscaleY > 1.0) ? (dat->bType == SESSIONTYPE_IM ? 22 : 23) : 22); + int foravatar = 0; if ((rect.bottom - ptSplitter.y - (rcSplitter.bottom - rcSplitter.top) /*- DPISCALEY(2)*/ - (bBottomToolbar ? DPISCALEY_S(24) : 0) < dat->pic.cy - DPISCALEY_S(2)) && dat->showPic && !PluginConfig.m_AlwaysFullToolbarWidth) foravatar = dat->pic.cx + gap; @@ -704,29 +699,26 @@ BOOL TSAPI BB_SetButtonsPos(TWindowData *dat) qsort(LButtonsList->items, LButtonsList->realCount, sizeof(BBButton *), sstSortButtons); if ((dat->pContainer->dwFlags & CNT_SIDEBAR) && (dat->pContainer->SideBar->getFlags() & CSideBar::SIDEBARORIENTATION_LEFT)) { - DeferWindowPos(hdwp, hwndToggleSideBar , NULL, 4, 2 + splitterY - iOff, - 0, 0, SWP_NOZORDER | SWP_NOSIZE);// | SWP_NOCOPYBITS); + DeferWindowPos(hdwp, hwndToggleSideBar , NULL, 4, 2 + splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); lwidth += 10; tempL -= 10; } for (i=0; i < LButtonsList->realCount; i++) { CustomButtonData* cbd = (CustomButtonData *)LButtonsList->items[i]; - if (((dat->bType == SESSIONTYPE_IM) && cbd->bIMButton) - || ((dat->bType == SESSIONTYPE_CHAT) && cbd->bChatButton)) { - + if (((dat->bType == SESSIONTYPE_IM) && cbd->bIMButton) || ((dat->bType == SESSIONTYPE_CHAT) && cbd->bChatButton)) { hwndBtn = GetDlgItem(hwnd, cbd->dwButtonCID); if (!showToolbar) { ShowWindow(hwndBtn, SW_HIDE); - DeferWindowPos(hdwp, hwndBtn , NULL, lwidth, splitterY - iOff, - 0, 0, SWP_NOZORDER | SWP_NOSIZE);// | SWP_NOCOPYBITS); + DeferWindowPos(hdwp, hwndBtn , NULL, lwidth, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); if (IsWindowVisible(hwndBtn) || (cbd->bDummy && !(cbd->bAutoHidden || cbd->bHidden))) lwidth += cbd->iButtonWidth + gap; if (!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->bAutoHidden) cbd->bAutoHidden = 1; continue; - } else if (!cbd->bCanBeHidden && !cbd->bHidden && !(!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->bAutoHidden)) { + } + if (!cbd->bCanBeHidden && !cbd->bHidden && !(!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->bAutoHidden)) { ShowWindow(hwndBtn, SW_SHOW); cbd->bAutoHidden = 0; } @@ -739,13 +731,13 @@ BOOL TSAPI BB_SetButtonsPos(TWindowData *dat) ShowWindow(hwndBtn, SW_HIDE); cbd->bAutoHidden = 1; tempL -= cbd->iButtonWidth + gap; - } else if (cbd->bAutoHidden) { + } + else if (cbd->bAutoHidden) { ShowWindow(hwndBtn, SW_SHOW); cbd->bAutoHidden = 0; } } - DeferWindowPos(hdwp, hwndBtn , NULL, lwidth, splitterY - iOff, - 0, 0, SWP_NOZORDER | SWP_NOSIZE);// SWP_NOCOPYBITS); + DeferWindowPos(hdwp, hwndBtn , NULL, lwidth, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE);// SWP_NOCOPYBITS); if (IsWindowVisible(hwndBtn) || (cbd->bDummy && !(cbd->bAutoHidden || cbd->bHidden))) lwidth += cbd->iButtonWidth + gap; } @@ -757,29 +749,26 @@ BOOL TSAPI BB_SetButtonsPos(TWindowData *dat) } if ((dat->pContainer->dwFlags & CNT_SIDEBAR) && (dat->pContainer->SideBar->getFlags() & CSideBar::SIDEBARORIENTATION_RIGHT)) { - DeferWindowPos(hdwp, hwndToggleSideBar , NULL, rect.right - foravatar - 10, 2 + splitterY - iOff, - 0, 0, SWP_NOZORDER | SWP_NOSIZE);// | SWP_NOCOPYBITS); + DeferWindowPos(hdwp, hwndToggleSideBar , NULL, rect.right - foravatar - 10, 2 + splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); rwidth += 12; tempR -= 12; } for (i=0; i < RButtonsList->realCount; i++) { CustomButtonData* cbd = (CustomButtonData *)RButtonsList->items[i]; - if (((dat->bType == SESSIONTYPE_IM) && cbd->bIMButton) - || ((dat->bType == SESSIONTYPE_CHAT) && cbd->bChatButton)) { - + if (((dat->bType == SESSIONTYPE_IM) && cbd->bIMButton) || ((dat->bType == SESSIONTYPE_CHAT) && cbd->bChatButton)) { hwndBtn = GetDlgItem(hwnd, cbd->dwButtonCID); if (!showToolbar) { ShowWindow(hwndBtn, SW_HIDE); if (IsWindowVisible(hwndBtn) || (cbd->bDummy && !(cbd->bAutoHidden || cbd->bHidden))) rwidth += cbd->iButtonWidth + gap; - DeferWindowPos(hdwp, hwndBtn , NULL, rect.right - foravatar - rwidth + gap, splitterY - iOff, - 0, 0, SWP_NOZORDER | SWP_NOSIZE);// SWP_NOCOPYBITS); + DeferWindowPos(hdwp, hwndBtn , NULL, rect.right - foravatar - rwidth + gap, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); if (!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn) && !cbd->bAutoHidden) cbd->bAutoHidden = 1; continue; - } else if (!cbd->bCanBeHidden && !cbd->bHidden && !((!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn)) && !cbd->bAutoHidden)) { + } + if (!cbd->bCanBeHidden && !cbd->bHidden && !((!IsWindowEnabled(hwndBtn) && !IsWindowVisible(hwndBtn)) && !cbd->bAutoHidden)) { ShowWindow(hwndBtn, SW_SHOW); cbd->bAutoHidden = 0; } @@ -792,7 +781,8 @@ BOOL TSAPI BB_SetButtonsPos(TWindowData *dat) ShowWindow(hwndBtn, SW_HIDE); cbd->bAutoHidden = 1; tempR -= cbd->iButtonWidth + gap; - } else if (cbd->bAutoHidden) { + } + else if (cbd->bAutoHidden) { ShowWindow(hwndBtn, SW_SHOW); cbd->bAutoHidden = 0; } @@ -800,14 +790,13 @@ BOOL TSAPI BB_SetButtonsPos(TWindowData *dat) if (IsWindowVisible(hwndBtn) || (cbd->bDummy && !(cbd->bAutoHidden || cbd->bHidden))) rwidth += cbd->iButtonWidth + gap; - DeferWindowPos(hdwp, hwndBtn , NULL, rect.right - foravatar - rwidth + gap, splitterY - iOff, - 0, 0, SWP_NOZORDER | SWP_NOSIZE);// SWP_NOCOPYBITS); + DeferWindowPos(hdwp, hwndBtn , NULL, rect.right - foravatar - rwidth + gap, splitterY - iOff, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } } LeaveCriticalSection(&ToolBarCS); - return (EndDeferWindowPos(hdwp)); + return EndDeferWindowPos(hdwp); } void TSAPI BB_CustomButtonClick(struct TWindowData *dat, DWORD idFrom, HWND hwndFrom, BOOL code) -- cgit v1.2.3