Listview WM_NOTIFYFORMAT and LVN_GETDISPINFO

Aric Stewart aric at codeweavers.com
Thu Nov 21 10:33:06 CST 2002


Here is a patch which preserves alot of your structure.
it works to correct my bug in Outlook.

-aric

Dimitrie O. Paun wrote:
> On November 21, 2002 10:19 am, Aric Stewart wrote:
> 
>>   I wondered if you had found a counter example in your own tests, or
>>if you had just assumed that windows would act rationally. If it was an
>>assumption then I will happily make a patch that mimic the behavior of
>>my test program. If you have your own windows test program that shows
>>other behavior maybe you can send it to me and we can see what is wrong
>>with my test program.
> 
> 
> Actually, I don't have a test for the WM_NOTIFYFORMAT. In fact, I was just
> looking at it, trying to compare it to the Treeview case which doesn't work
> at the moment, and I think the one in Listview is buggy, at least according
> to the documentation. To cut a long story short: yeah, a patch is greatly
> appreciated! :)
> 
> BTW, this is the problem with the Treeview as well, if I understand 
> correctly. It is asked in WM_NOTIFYFORMAT to be Unicode, but when it
> does, nothing works. So my question is: when is a control supposed to
> be Unicode? WTF is going on here???
> 

-------------- next part --------------
Index: dlls/comctl32/listview.c
===================================================================
RCS file: /home/wine/wine/dlls/comctl32/listview.c,v
retrieving revision 1.330
diff -u -r1.330 listview.c
--- dlls/comctl32/listview.c	18 Nov 2002 19:51:11 -0000	1.330
+++ dlls/comctl32/listview.c	21 Nov 2002 16:30:44 -0000
@@ -764,8 +764,10 @@
 }
 
 /*
-  Send notification. depends on dispinfoW having same
-  structure as dispinfoA.
+  With testing on Windows 2000 it looks like the notify format
+  has nothing to do with this message. It ALWAYS seems to be
+  in ansi format.
+
   infoPtr : listview struct
   notificationCode : *Unicode* notification code
   pdi : dispinfo structure (can be unicode or ansi)
@@ -774,61 +776,49 @@
 static BOOL notify_dispinfoT(LISTVIEW_INFO *infoPtr, INT notificationCode, LPNMLVDISPINFOW pdi, BOOL isW)
 {
     BOOL bResult = FALSE;
-    BOOL convertToAnsi = FALSE, convertToUnicode = FALSE;
-    INT realNotifCode;
+    BOOL convertToAnsi = FALSE;
     INT cchTempBufMax = 0, savCchTextMax = 0;
     LPWSTR pszTempBuf = NULL, savPszText = NULL;
 
     if ((pdi->item.mask & LVIF_TEXT) && is_textT(pdi->item.pszText, isW))
-    {
-	convertToAnsi = (isW && infoPtr->notifyFormat == NFR_ANSI);
-        convertToUnicode = (!isW && infoPtr->notifyFormat == NFR_UNICODE);
-    }
+	    convertToAnsi = isW;
 
-    if (convertToAnsi || convertToUnicode)
+    if (convertToAnsi)
     {
-	if (notificationCode != LVN_GETDISPINFOW)
-	{
-	    cchTempBufMax = convertToUnicode ?
-      		MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pdi->item.pszText, -1, NULL, 0):
-      		WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, NULL, 0, NULL, NULL);
+	    if (notificationCode != LVN_GETDISPINFOW)
+	    {
+            cchTempBufMax = WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText,
+                                                -1, NULL, 0, NULL, NULL);
         }
-	else
-	{
-	    cchTempBufMax = pdi->item.cchTextMax;
-	    *pdi->item.pszText = 0; /* make sure we don't process garbage */
-	}
+	    else
+	    {
+	        cchTempBufMax = pdi->item.cchTextMax;
+	        *pdi->item.pszText = 0; /* make sure we don't process garbage */
+	    }
 
-        pszTempBuf = HeapAlloc(GetProcessHeap(), 0,
-            (convertToUnicode ? sizeof(WCHAR) : sizeof(CHAR)) * cchTempBufMax);
+        pszTempBuf = HeapAlloc(GetProcessHeap(), 0, sizeof(CHAR) *
+                               cchTempBufMax);
         if (!pszTempBuf) return FALSE;
-        if (convertToUnicode)
-	    MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pdi->item.pszText, -1,
-                                pszTempBuf, cchTempBufMax);
-        else
-            WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR) pszTempBuf,
-                                cchTempBufMax, NULL, NULL);
+
+        WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR)
+                             pszTempBuf, cchTempBufMax, NULL, NULL);
+
         savCchTextMax = pdi->item.cchTextMax;
         savPszText = pdi->item.pszText;
         pdi->item.pszText = pszTempBuf;
         pdi->item.cchTextMax = cchTempBufMax;
     }
 
-    if (infoPtr->notifyFormat == NFR_ANSI)
-	realNotifCode = get_ansi_notification(notificationCode);
-    else
-	realNotifCode = notificationCode;
-    TRACE(" pdi->item=%s\n", debuglvitem_t(&pdi->item, infoPtr->notifyFormat != NFR_ANSI));
-    bResult = notify_hdr(infoPtr, realNotifCode, (LPNMHDR)pdi);
+    TRACE(" pdi->item=%s\n", debuglvitem_t(&pdi->item, infoPtr->notifyFormat !=
+           NFR_ANSI));
+
+    bResult = notify_hdr(infoPtr, get_ansi_notification(notificationCode),
+                        (LPNMHDR)pdi);
 
-    if (convertToUnicode || convertToAnsi)
+    if (convertToAnsi)
     {
-	if (convertToUnicode) /* note : pointer can be changed by app ! */
-	    WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR) savPszText,
-                                savCchTextMax, NULL, NULL);
-        else
-            MultiByteToWideChar(CP_ACP, 0, (LPSTR) pdi->item.pszText, -1,
-                                savPszText, savCchTextMax);
+        MultiByteToWideChar(CP_ACP, 0, (LPSTR) pdi->item.pszText, -1,
+                            savPszText, savCchTextMax);
         pdi->item.pszText = savPszText; /* restores our buffer */
         pdi->item.cchTextMax = savCchTextMax;
         HeapFree(GetProcessHeap(), 0, pszTempBuf);


More information about the wine-devel mailing list