[PATCH v2 1/2] comctl32/listview: Use bitmask to check if we can send notifications
Fabian Maurer
dark.shadow4 at web.de
Sat Aug 25 16:43:27 CDT 2018
Signed-off-by: Fabian Maurer <dark.shadow4 at 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
More information about the wine-devel
mailing list