Listview notify_dispinfoT Messageformat

Dimitrie O. Paun dpaun at
Sat Oct 30 12:31:24 CDT 2004

On Wed, Oct 27, 2004 at 09:28:33PM +0100, Robert Shearman wrote:
> To summarise: *all* common control notifications should be sent in the 
> same format (ANSI/Unicode) as their parent (except if overriden by the 
> CCS_SETUNICODEFORMAT message). It should not be based on the message 
> sent to the control.

Just to be 100% clear:
  -- what do you mean by "in the same format as their parent"?
     From your patch, it seems that:
	1. In WM_CREATE, we have to query the notify format as such:

  infoPtr->hwndNotify = lpcs->hwndParent;
  infoPtr->notifyFormat = SendMessageW(infoPtr->hwndNotify, WM_NOTIFYFORMAT,
                                       (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);

	2. Handle WM_NOTIFYFORMAT, by querying the parent again:

  infoPtr->notifyFormat = SendMessageW(hwndFrom, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY);

        3. When sending notifications, convert to ASCII iff infoPtr->notifyFormat == NFR_ANSI

     If so, this is what we had before Aric did this change:
     What was wrong with the code before? It tried to send the notification
     in the format specified by infoPtr->notifyFormat. The dependance on
     the the type of message that was sent to the control is just to do
     the conversion when we have to. That is:

            fmt-of-msg-sent-to-ctrl     infoPtr->notifyFormat       conversion-required
               !isW (ASCII)                    NFR_ANSI                   no
                isW (Unicode)                  NFR_ANSI                   yes
               !isW (ASCII)                    NFR_UNICODE                yes
                isW (Unicode)                  NFR_UNICODE                no

     The old code looked as isW only to determine if any conversion was required
     (which I think you have to), but the format of the actual notification was
     strictly determined by infoPtr->notifyFormat:

     if (infoPtr->notifyFormat == NFR_ANSI)
         realNotifCode = get_ansi_notification(notificationCode);
         realNotifCode = notificationCode;
     bResult = notify_hdr(infoPtr, realNotifCode, (LPNMHDR)pdi);

     So, what was wrong with the original code?

  -- CCS_SETUNICODEFORMAT message: this is a flag, not a message, no? If so, what is
     its semantics? If set, we have to ignore infoPtr->notifyFormat, and always send
     notifications in Unicode format?

It's important to figure this one once and for all, so that we can fix all the
controls properly.


More information about the wine-devel mailing list