Signed-off-by: Fabian Maurer <dark.shadow4(a)web.de> --- dlls/comctl32/listview.c | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index 200bf93be5..fa0d18e5d6 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -211,6 +211,8 @@ typedef struct tagDELAYED_ITEM_EDIT INT iItem; } DELAYED_ITEM_EDIT; +#define FLAG_NOTIFY_CHANGE (0x1) /* Whether we can send change notification messages */ + typedef struct tagLISTVIEW_INFO { /* control window */ @@ -225,7 +227,6 @@ typedef struct tagLISTVIEW_INFO /* notification window */ SHORT notifyFormat; HWND hwndNotify; - BOOL bDoChangeNotify; /* send change notification messages? */ UINT uCallbackMask; /* tooltips */ @@ -326,6 +327,7 @@ typedef struct tagLISTVIEW_INFO /* misc */ DWORD iVersion; /* CCM_[G,S]ETVERSION */ + DWORD notify_mask; } LISTVIEW_INFO; /* @@ -3507,13 +3509,13 @@ Parameters: */ static void LISTVIEW_ShiftFocus(LISTVIEW_INFO *infoPtr, INT focus, INT item, INT direction) { - BOOL old_change = infoPtr->bDoChangeNotify; + BOOL old_change = infoPtr->notify_mask & FLAG_NOTIFY_CHANGE; - infoPtr->bDoChangeNotify = FALSE; + infoPtr->notify_mask &= ~FLAG_NOTIFY_CHANGE; focus = shift_item(infoPtr, focus, item, direction); if (focus != infoPtr->nFocusedItem) LISTVIEW_SetItemFocus(infoPtr, focus); - infoPtr->bDoChangeNotify = old_change; + infoPtr->notify_mask |= old_change; } /** @@ -3565,8 +3567,8 @@ static BOOL LISTVIEW_AddGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem) * only one LVN_ODSTATECHANGED notification. * See MSDN documentation for LVN_ITEMCHANGED. */ - bOldChange = infoPtr->bDoChangeNotify; - if (infoPtr->dwStyle & LVS_OWNERDATA) infoPtr->bDoChangeNotify = FALSE; + bOldChange = infoPtr->notify_mask & FLAG_NOTIFY_CHANGE; + if (infoPtr->dwStyle & LVS_OWNERDATA) infoPtr->notify_mask &= ~FLAG_NOTIFY_CHANGE; if (nFirst == -1) nFirst = nItem; @@ -3585,7 +3587,7 @@ static BOOL LISTVIEW_AddGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem) notify_hdr(infoPtr, LVN_ODSTATECHANGED, (LPNMHDR)&nmlv); if (!IsWindow(hwndSelf)) return FALSE; - infoPtr->bDoChangeNotify = bOldChange; + infoPtr->notify_mask |= bOldChange; return TRUE; } @@ -3656,8 +3658,8 @@ static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem) /* disable per item notifications on LVS_OWNERDATA style FIXME: single LVN_ODSTATECHANGED should be used */ - bOldChange = infoPtr->bDoChangeNotify; - if (infoPtr->dwStyle & LVS_OWNERDATA) infoPtr->bDoChangeNotify = FALSE; + bOldChange = infoPtr->notify_mask & FLAG_NOTIFY_CHANGE; + if (infoPtr->dwStyle & LVS_OWNERDATA) infoPtr->notify_mask &= ~FLAG_NOTIFY_CHANGE; LISTVIEW_DeselectAllSkipItems(infoPtr, selection); @@ -3668,7 +3670,7 @@ static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem) /* this will also destroy the selection */ iterator_destroy(&i); - infoPtr->bDoChangeNotify = bOldChange; + infoPtr->notify_mask |= bOldChange; LISTVIEW_SetItemFocus(infoPtr, nItem); } @@ -4257,7 +4259,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL and we are _NOT_ virtual (LVS_OWNERDATA), and change notifications are enabled. Even nothing really changed we still need to send this, in this case uChanged mask is just set to passed item mask. */ - if(lpItem && !isNew && infoPtr->bDoChangeNotify) + if(lpItem && !isNew && (infoPtr->notify_mask & FLAG_NOTIFY_CHANGE)) { HWND hwndSelf = infoPtr->hwndSelf; @@ -4350,7 +4352,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL /* send LVN_ITEMCHANGED notification */ if (lpLVItem->mask & LVIF_PARAM) nmlv.lParam = lpLVItem->lParam; - if (infoPtr->bDoChangeNotify) notify_listview(infoPtr, LVN_ITEMCHANGED, &nmlv); + if (infoPtr->notify_mask & FLAG_NOTIFY_CHANGE) notify_listview(infoPtr, LVN_ITEMCHANGED, &nmlv); return TRUE; } @@ -8986,10 +8988,10 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE /* focus all isn't allowed */ if (lvItem.state & lvItem.stateMask & LVIS_FOCUSED) return FALSE; - notify = infoPtr->bDoChangeNotify; + notify = infoPtr->notify_mask & FLAG_NOTIFY_CHANGE; if (infoPtr->dwStyle & LVS_OWNERDATA) { - infoPtr->bDoChangeNotify = FALSE; + infoPtr->notify_mask &= ~FLAG_NOTIFY_CHANGE; if (!(lvItem.state & LVIS_SELECTED) && LISTVIEW_GetSelectedCount(infoPtr)) oldstate |= LVIS_SELECTED; if (infoPtr->nFocusedItem != -1) oldstate |= LVIS_FOCUSED; @@ -9003,7 +9005,7 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, const LVITE { NMLISTVIEW nmlv; - infoPtr->bDoChangeNotify = notify; + infoPtr->notify_mask |= notify; nmlv.iItem = -1; nmlv.iSubItem = 0; @@ -9484,7 +9486,7 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, WPARAM wParam, const CREATESTRUCTW * infoPtr->nHotItem = -1; infoPtr->redraw = TRUE; infoPtr->bNoItemMetrics = TRUE; - infoPtr->bDoChangeNotify = TRUE; + infoPtr->notify_mask = ~(0U); /* By default allow sending all notifications */ infoPtr->autoSpacing = TRUE; infoPtr->iconSpacing.cx = GetSystemMetrics(SM_CXICONSPACING) - GetSystemMetrics(SM_CXICON); infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING) - GetSystemMetrics(SM_CYICON); -- 2.18.0