Tooltips: Fix SetTitle

Robert Shearman rob at codeweavers.com
Sat Oct 23 05:42:05 CDT 2004


Changelog:
- Don't leak memory when an app sends TTM_SETTITLE twice.
- An lParam of 0 indicates that the title should be removed.
-------------- next part --------------
Index: wine/dlls/comctl32/tooltips.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/tooltips.c,v
retrieving revision 1.73
diff -u -p -r1.73 tooltips.c
--- wine/dlls/comctl32/tooltips.c	19 Oct 2004 21:09:42 -0000	1.73
+++ wine/dlls/comctl32/tooltips.c	23 Oct 2004 10:11:45 -0000
@@ -1927,16 +1927,25 @@ TOOLTIPS_SetTitleA (HWND hwnd, WPARAM wP
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
     LPCSTR pszTitle = (LPCSTR)lParam;
-    UINT uTitleIcon = (UINT)wParam;
+    UINT_PTR uTitleIcon = (UINT_PTR)wParam;
     UINT size;
 
-    TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, pszTitle, (void*)uTitleIcon);
+    TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_a(pszTitle),
+        (void*)uTitleIcon);
+
+    Free(infoPtr->pszTitle);
+
+    if (pszTitle)
+    {
+        size = sizeof(WCHAR)*MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, NULL, 0);
+        infoPtr->pszTitle = Alloc(size);
+        if (!infoPtr->pszTitle)
+            return FALSE;
+        MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, infoPtr->pszTitle, size/sizeof(WCHAR));
+    }
+    else
+        infoPtr->pszTitle = NULL;
 
-    size = sizeof(WCHAR)*MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, NULL, 0);
-    infoPtr->pszTitle = Alloc(size);
-    if (!infoPtr->pszTitle)
-        return FALSE;
-    MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, infoPtr->pszTitle, size/sizeof(WCHAR));
     if (uTitleIcon <= TTI_ERROR)
         infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon];
     else
@@ -1951,16 +1960,25 @@ TOOLTIPS_SetTitleW (HWND hwnd, WPARAM wP
 {
     TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr (hwnd);
     LPCWSTR pszTitle = (LPCWSTR)lParam;
-    UINT uTitleIcon = (UINT)wParam;
+    UINT_PTR uTitleIcon = (UINT_PTR)wParam;
     UINT size;
 
-    TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_w(pszTitle), (void*)uTitleIcon);
+    TRACE("hwnd = %p, title = %s, icon = %p\n", hwnd, debugstr_w(pszTitle),
+        (void*)uTitleIcon);
+
+    Free(infoPtr->pszTitle);
+
+    if (pszTitle)
+    {
+        size = (strlenW(pszTitle)+1)*sizeof(WCHAR);
+        infoPtr->pszTitle = Alloc(size);
+        if (!infoPtr->pszTitle)
+            return FALSE;
+        memcpy(infoPtr->pszTitle, pszTitle, size);
+    }
+    else
+        infoPtr->pszTitle = NULL;
 
-    size = (strlenW(pszTitle)+1)*sizeof(WCHAR);
-    infoPtr->pszTitle = Alloc(size);
-    if (!infoPtr->pszTitle)
-        return FALSE;
-    memcpy(infoPtr->pszTitle, pszTitle, size);
     if (uTitleIcon <= TTI_ERROR)
         infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon];
     else


More information about the wine-patches mailing list