We were not properly masking the item that was sent with the message
and also we where not sending the notification at the proper times.
diff --git a/dlls/comctl32/header.c b/dlls/comctl32/header.c
index 019e10e..e83add6 100644
--- a/dlls/comctl32/header.c
+++ b/dlls/comctl32/header.c
@@ -437,6 +437,32 @@
(WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
}
+static BOOL
+HEADER_SendItemChange(HWND hwnd, INT iItem, UINT mask, UINT msg)
+{
+ HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
+ NMHEADERA nmhdr;
+ HDITEMA nmitem;
+
+ nmhdr.hdr.hwndFrom = hwnd;
+ nmhdr.hdr.idFrom = GetWindowLongA (hwnd, GWL_ID);
+ nmhdr.hdr.code = msg;
+ nmhdr.iItem = iItem;
+ nmhdr.iButton = 0;
+ nmhdr.pitem = &nmitem;
+ nmitem.mask = mask;
+ nmitem.cxy = infoPtr->items[iItem].cxy;
+ nmitem.hbm = infoPtr->items[iItem].hbm;
+ nmitem.pszText = NULL;
+ nmitem.cchTextMax = 0;
+ nmitem.fmt = infoPtr->items[iItem].fmt;
+ nmitem.lParam = infoPtr->items[iItem].lParam;
+ nmitem.iOrder = infoPtr->items[iItem].iOrder;
+ nmitem.iImage = infoPtr->items[iItem].iImage;
+
+ return (BOOL)SendMessageA (GetParent (hwnd), WM_NOTIFY,
+ (WPARAM)nmhdr.hdr.idFrom, (LPARAM)&nmhdr);
+}
static BOOL
HEADER_SendHeaderNotify (HWND hwnd, UINT code, INT iItem)
@@ -934,7 +960,7 @@
TRACE("[nItem=%d]\n", nItem);
- if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem))
+ if (HEADER_SendItemChange(hwnd, nItem, phdi->mask,HDN_ITEMCHANGINGA))
return FALSE;
lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
@@ -972,7 +998,7 @@
if (phdi->mask & HDI_ORDER)
lpItem->iOrder = phdi->iOrder;
- HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, nItem);
+ HEADER_SendItemChange(hwnd,nItem,phdi->mask,HDN_ITEMCHANGEDA);
HEADER_SetItemBounds (hwnd);
@@ -997,7 +1023,7 @@
TRACE("[nItem=%d]\n", nItem);
- if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, nItem))
+ if (HEADER_SendItemChange(hwnd,nItem,phdi->mask,HDN_ITEMCHANGINGW))
return FALSE;
lpItem = (HEADER_ITEM*)&infoPtr->items[nItem];
@@ -1035,7 +1061,7 @@
if (phdi->mask & HDI_ORDER)
lpItem->iOrder = phdi->iOrder;
- HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, nItem);
+ HEADER_SendItemChange(hwnd, nItem, phdi->mask,HDN_ITEMCHANGEDW);
HEADER_SetItemBounds (hwnd);
@@ -1208,7 +1234,9 @@
HEADER_LButtonUp (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
HEADER_INFO *infoPtr = HEADER_GetInfoPtr (hwnd);
- DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
+ /*
+ *DWORD dwStyle = GetWindowLongA (hwnd, GWL_STYLE);
+ */
POINT pt;
UINT flags;
INT nItem, nWidth;
@@ -1236,23 +1264,33 @@
HEADER_SendHeaderNotify (hwnd, HDN_ENDTRACKA, infoPtr->iMoveItem);
- if (!(dwStyle & HDS_FULLDRAG)) {
+ /*
+ * we want to do this even for HDS_FULLDRAG because this is where
+ * we send the HDN_ITEMCHANGING and HDN_ITEMCHANGED notifications
+ *
+ * if (!(dwStyle & HDS_FULLDRAG)) {
+ */
+
hdc = GetDC (hwnd);
HEADER_DrawTrackLine (hwnd, hdc, infoPtr->xOldTrack);
- ReleaseDC (hwnd, hdc);
- if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem))
+ ReleaseDC (hwnd, hdc);
+ if (HEADER_SendItemChange(hwnd, infoPtr->iMoveItem,HDI_WIDTH,
+ HDN_ITEMCHANGINGA))
infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
else {
nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
if (nWidth < 0)
nWidth = 0;
infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
- HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA, infoPtr->iMoveItem);
- }
+ }
+ HEADER_SendItemChange(hwnd,infoPtr->iMoveItem,HDI_WIDTH,
+ HDN_ITEMCHANGEDA);
HEADER_SetItemBounds (hwnd);
InvalidateRect(hwnd, NULL, FALSE);
- }
+ /*
+ * }
+ */
}
if (infoPtr->bCaptured) {
@@ -1301,16 +1339,27 @@
}
else if (infoPtr->bTracking) {
if (dwStyle & HDS_FULLDRAG) {
- if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem))
- infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
- else {
- nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
- if (nWidth < 0)
- nWidth = 0;
- infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
- HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGEDA,
- infoPtr->iMoveItem);
- }
+ /*
+ * Investigation shows that the changing message occure only
+ * after tracking is done
+ *
+ *if (HEADER_SendHeaderNotify (hwnd, HDN_ITEMCHANGINGA, infoPtr->iMoveItem))
+ * infoPtr->items[infoPtr->iMoveItem].cxy = infoPtr->nOldWidth;
+ *else {
+ *
+ */
+ nWidth = pt.x - infoPtr->items[infoPtr->iMoveItem].rect.left + infoPtr->xTrackOffset;
+ if (nWidth < 0)
+ nWidth = 0;
+ infoPtr->items[infoPtr->iMoveItem].cxy = nWidth;
+ /*
+ * Invistigation shows that the item changed only occures
+ * after the tracking is done
+ *
+ * HEADER_SendItemChanged(FALSE,hwnd,infoPtr->iMoveItem,HDI_WIDTH);
+ *}
+ */
+
HEADER_SetItemBounds (hwnd);
InvalidateRect(hwnd, NULL, FALSE);
}