[PATCH] comctl32/comboex: Remove child windows subclass on window destruction

Nikolay Sivov nsivov at codeweavers.com
Tue Feb 13 23:34:17 CST 2018


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/comctl32/comboex.c | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/dlls/comctl32/comboex.c b/dlls/comctl32/comboex.c
index 076a5524d5..3c3714ac56 100644
--- a/dlls/comctl32/comboex.c
+++ b/dlls/comctl32/comboex.c
@@ -1502,10 +1502,10 @@ static void COMBOEX_ResetContent (COMBOEX_INFO *infoPtr)
 static LRESULT COMBOEX_Destroy (COMBOEX_INFO *infoPtr)
 {
     if (infoPtr->hwndCombo)
-        RemoveWindowSubclass(infoPtr->hwndCombo, COMBOEX_ComboWndProc, COMBO_SUBCLASSID);
+        SetWindowSubclass(infoPtr->hwndCombo, COMBOEX_ComboWndProc, COMBO_SUBCLASSID, 0);
 
     if (infoPtr->hwndEdit)
-        RemoveWindowSubclass(infoPtr->hwndEdit, COMBOEX_EditWndProc, EDIT_SUBCLASSID);
+        SetWindowSubclass(infoPtr->hwndEdit, COMBOEX_EditWndProc, EDIT_SUBCLASSID, 0);
 
     COMBOEX_FreeText (&infoPtr->edit);
     COMBOEX_ResetContent (infoPtr);
@@ -1668,7 +1668,11 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
     TRACE("hwnd=%p msg=%x wparam=%lx lParam=%lx, info_ptr=%p\n",
 	  hwnd, uMsg, wParam, lParam, infoPtr);
 
-    if (!infoPtr) return 0;
+    if (uMsg == WM_NCDESTROY)
+        RemoveWindowSubclass(hwnd, COMBOEX_EditWndProc, EDIT_SUBCLASSID);
+
+    if (!infoPtr)
+        return DefSubclassProc(hwnd, uMsg, wParam, lParam);
 
     switch (uMsg)
     {
@@ -1823,11 +1827,14 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
     TRACE("hwnd=%p msg=%x wparam=%lx lParam=%lx, info_ptr=%p\n",
 	  hwnd, uMsg, wParam, lParam, infoPtr);
 
-    if (!infoPtr) return 0;
+    if (uMsg == WM_NCDESTROY)
+        RemoveWindowSubclass(hwnd, COMBOEX_ComboWndProc, COMBO_SUBCLASSID);
+
+    if (!infoPtr)
+        return DefSubclassProc(hwnd, uMsg, wParam, lParam);
 
     switch (uMsg)
     {
-
     case WM_DRAWITEM:
 	    /*
 	     * The only way this message should come is from the
@@ -1835,7 +1842,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
 	     * that ComboEx knows this is listbox.
 	     */
 	    ((DRAWITEMSTRUCT *)lParam)->itemState |= ODS_COMBOEXLBOX;
-	    return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+	    break;
 
     case WM_ERASEBKGND:
             hDC = (HDC) wParam;
@@ -1844,7 +1851,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
             TRACE("erasing (%s)\n", wine_dbgstr_rect(&rect));
 	    ExtTextOutW (hDC, 0, 0, ETO_OPAQUE, &rect, 0, 0, 0);
             SetBkColor (hDC, obkc);
-	    return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+	    break;
 
     case WM_SETCURSOR:
 	    /*
@@ -1858,7 +1865,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
 	    nmmse.pt.y = 0;
 	    nmmse.dwHitInfo = lParam;
 	    COMBOEX_Notify (infoPtr, NM_SETCURSOR, (NMHDR *)&nmmse);
-	    return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+	    break;
 
     case WM_LBUTTONDOWN:
 	    GetClientRect (hwnd, &rect);
@@ -1868,15 +1875,15 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
 	    pt.x = (short)LOWORD(lParam);
 	    pt.y = (short)HIWORD(lParam);
 	    if (PtInRect(&rect, pt))
-		return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+		break;
 
 	    infoPtr->flags |= WCBE_MOUSECAPTURED;
 	    SetCapture(hwnd);
-	    break;
+	    return 0;
 
     case WM_LBUTTONUP:
 	    if (!(infoPtr->flags & WCBE_MOUSECAPTURED))
-		return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+		break;
 
 	    ReleaseCapture();
 	    infoPtr->flags &= ~WCBE_MOUSECAPTURED;
@@ -1885,7 +1892,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
 	    } else {
 		SendMessageW(hwnd, CB_SHOWDROPDOWN, TRUE, 0);
 	    }
-	    break;
+	    return 0;
 
     case WM_MOUSEMOVE:
 	    if ( (infoPtr->flags & WCBE_MOUSECAPTURED) &&
@@ -1894,7 +1901,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
 		COMBOEX_NotifyDragBegin(infoPtr, edit_text);
 		infoPtr->flags |= WCBE_MOUSEDRAGGED;
 	    }
-	    return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+	    break;
 
     case WM_COMMAND:
 	    switch (HIWORD(wParam)) {
@@ -1975,9 +1982,10 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
 		break;
 	    }/* fall through */
     default:
-	    return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+        ;
     }
-    return 0;
+
+    return DefSubclassProc(hwnd, uMsg, wParam, lParam);
 }
 
 
-- 
2.15.1




More information about the wine-devel mailing list