Hi all, LVN_ITEMACTIVATE was sort of ill-implemented: it was sending only the outdated NMHDR format, and only a double-click sent it (instead of a single-click). Note that this is just a bare-bones patch to make some programs work. It's by no means a complete solution (it's just meant to fix the worst problems). (which values should NMITEMACTIVATE have ? When exactly to send LVN_ITEMACTIVATE at all ??) - send a full NMITEMACTIVATE struct instead of the outdated NMHDR - also send LVN_ITEMACTIVATE on single-click Index: dlls/comctl32/listview.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/listview.c,v retrieving revision 1.333 diff -u -r1.333 listview.c --- dlls/comctl32/listview.c 10 Dec 2002 19:07:27 -0000 1.333 +++ dlls/comctl32/listview.c 15 Dec 2002 18:02:29 -0000 @@ -708,9 +708,36 @@ return notify_hdr(infoPtr, code, &nmh); } -static inline void notify_itemactivate(LISTVIEW_INFO *infoPtr) +static inline void notify_itemactivate(LISTVIEW_INFO *infoPtr, POINT *pt) { - notify(infoPtr, LVN_ITEMACTIVATE); + NMITEMACTIVATE nmia; + LRESULT result; + + nmia.hdr.hwndFrom = infoPtr->hwndSelf; + nmia.hdr.idFrom = GetWindowLongW(infoPtr->hwndSelf, GWL_ID); + nmia.hdr.code = LVN_ITEMACTIVATE; + nmia.iItem = infoPtr->nFocusedItem; + nmia.iSubItem = 0; /* FIXME */ + nmia.uNewState = 1; /* FIXME */ + nmia.uOldState = 0; /* FIXME */ + nmia.uChanged = 0; /* FIXME */ + if (pt) + nmia.ptAction = *pt; + nmia.lParam = 0; /* FIXME */ + nmia.uKeyFlags = 0; + if (GetKeyState(VK_MENU) & 0x8000) + nmia.uKeyFlags |= LVKF_ALT; + if (GetKeyState(VK_CONTROL) & 0x8000) + nmia.uKeyFlags |= LVKF_CONTROL; + if (GetKeyState(VK_SHIFT) & 0x8000) + nmia.uKeyFlags |= LVKF_SHIFT; + + TRACE("(%d, keys %d)\n", nmia.iItem, nmia.uKeyFlags); + + result = SendMessageW(GetParent(infoPtr->hwndSelf), WM_NOTIFY, + (WPARAM)nmia.hdr.idFrom, (LPARAM)&nmia); + + TRACE(" <= %ld\n", result); } static inline LRESULT notify_listview(LISTVIEW_INFO *infoPtr, INT code, LPNMLISTVIEW plvnm) @@ -7391,7 +7418,7 @@ if ((infoPtr->nItemCount > 0) && (infoPtr->nFocusedItem != -1)) { notify(infoPtr, NM_RETURN); - notify(infoPtr, LVN_ITEMACTIVATE); + notify_itemactivate(infoPtr, NULL); } break; @@ -7507,7 +7534,7 @@ notify_click(infoPtr, NM_DBLCLK, &htInfo); /* To send the LVN_ITEMACTIVATE, it must be on an Item */ - if(htInfo.iItem != -1) notify(infoPtr, LVN_ITEMACTIVATE); + if(htInfo.iItem != -1) notify_itemactivate(infoPtr, &htInfo.pt); return 0; } @@ -7546,6 +7573,7 @@ nItem = LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE); TRACE("at %s, nItem=%d\n", debugpoint(&pt), nItem); + infoPtr->nEditLabelItem = -1; if ((nItem >= 0) && (nItem < infoPtr->nItemCount)) { @@ -7601,6 +7629,8 @@ LISTVIEW_SetSelection(infoPtr, nItem); } } + /* To send the LVN_ITEMACTIVATE, it must be on an Item */ + if(lvHitTestInfo.iItem != -1) notify_itemactivate(infoPtr, &lvHitTestInfo.pt); } else { Index: include/commctrl.h =================================================================== RCS file: /home/wine/wine/include/commctrl.h,v retrieving revision 1.100 diff -u -r1.100 commctrl.h --- include/commctrl.h 18 Nov 2002 19:45:47 -0000 1.100 +++ include/commctrl.h 15 Dec 2002 18:02:32 -0000 @@ -3068,6 +3068,10 @@ UINT uKeyFlags; } NMITEMACTIVATE, *LPNMITEMACTIVATE; +#define LVKF_ALT 0x0001 +#define LVKF_CONTROL 0x0002 +#define LVKF_SHIFT 0x0004 + typedef struct tagLVDISPINFOA { NMHDR hdr; -- Andreas Mohr Stauferstr. 6, D-71272 Renningen, Germany