Nikolay Sivov : comctl32/listview: Remove current sorting arguments from control structure.
Alexandre Julliard
julliard at winehq.org
Tue Mar 9 14:55:18 CST 2021
Module: wine
Branch: master
Commit: fef35d7b5d198b10f9a183d1c27e00947789c4de
URL: https://source.winehq.org/git/wine.git/?a=commit;h=fef35d7b5d198b10f9a183d1c27e00947789c4de
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Mar 8 17:44:38 2021 +0300
comctl32/listview: Remove current sorting arguments from control structure.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/comctl32/listview.c | 69 ++++++++++++++++--------------------------------
1 file changed, 23 insertions(+), 46 deletions(-)
diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c
index 150771b8937..ee67193ff27 100644
--- a/dlls/comctl32/listview.c
+++ b/dlls/comctl32/listview.c
@@ -254,10 +254,6 @@ typedef struct tagLISTVIEW_INFO
INT nItemHeight;
INT nItemWidth;
- /* sorting */
- PFNLVCOMPARE pfnCompare; /* sorting callback pointer */
- LPARAM lParamSort;
-
/* style */
DWORD dwStyle; /* the cached window GWL_STYLE */
DWORD dwLvExStyle; /* extended listview style */
@@ -9232,52 +9228,31 @@ static INT LISTVIEW_SetView(LISTVIEW_INFO *infoPtr, DWORD nView)
/* LISTVIEW_SetWorkAreas */
-/***
- * DESCRIPTION:
- * Callback internally used by LISTVIEW_SortItems() in response of LVM_SORTITEMS
- *
- * PARAMETER(S):
- * [I] first : pointer to first ITEM_INFO to compare
- * [I] second : pointer to second ITEM_INFO to compare
- * [I] lParam : HWND of control
- *
- * RETURN:
- * if first comes before second : negative
- * if first comes after second : positive
- * if first and second are equivalent : zero
- */
+struct sorting_context
+{
+ LISTVIEW_INFO *infoPtr;
+ PFNLVCOMPARE compare_func;
+ LPARAM lParam;
+};
+
+/* DPA_Sort() callback used for LVM_SORTITEMS */
static INT WINAPI LISTVIEW_CallBackCompare(LPVOID first, LPVOID second, LPARAM lParam)
{
- LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)lParam;
- ITEM_INFO* lv_first = DPA_GetPtr( first, 0 );
- ITEM_INFO* lv_second = DPA_GetPtr( second, 0 );
+ struct sorting_context *context = (struct sorting_context *)lParam;
+ ITEM_INFO* lv_first = DPA_GetPtr( first, 0 );
+ ITEM_INFO* lv_second = DPA_GetPtr( second, 0 );
- /* Forward the call to the client defined callback */
- return (infoPtr->pfnCompare)( lv_first->lParam , lv_second->lParam, infoPtr->lParamSort );
+ return context->compare_func(lv_first->lParam, lv_second->lParam, context->lParam);
}
-/***
- * DESCRIPTION:
- * Callback internally used by LISTVIEW_SortItems() in response of LVM_SORTITEMSEX
- *
- * PARAMETER(S):
- * [I] first : pointer to first ITEM_INFO to compare
- * [I] second : pointer to second ITEM_INFO to compare
- * [I] lParam : HWND of control
- *
- * RETURN:
- * if first comes before second : negative
- * if first comes after second : positive
- * if first and second are equivalent : zero
- */
+/* DPA_Sort() callback used for LVM_SORTITEMSEX */
static INT WINAPI LISTVIEW_CallBackCompareEx(LPVOID first, LPVOID second, LPARAM lParam)
{
- LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)lParam;
- INT first_idx = DPA_GetPtrIndex( infoPtr->hdpaItems, first );
- INT second_idx = DPA_GetPtrIndex( infoPtr->hdpaItems, second );
+ struct sorting_context *context = (struct sorting_context *)lParam;
+ INT first_idx = DPA_GetPtrIndex( context->infoPtr->hdpaItems, first );
+ INT second_idx = DPA_GetPtrIndex( context->infoPtr->hdpaItems, second );
- /* Forward the call to the client defined callback */
- return (infoPtr->pfnCompare)( first_idx, second_idx, infoPtr->lParamSort );
+ return context->compare_func(first_idx, second_idx, context->lParam);
}
/***
@@ -9301,6 +9276,7 @@ static BOOL LISTVIEW_SortItems(LISTVIEW_INFO *infoPtr, PFNLVCOMPARE pfnCompare,
ITEM_INFO *lpItem;
LPVOID selectionMarkItem = NULL;
LPVOID focusedItem = NULL;
+ struct sorting_context context;
int i;
TRACE("(pfnCompare=%p, lParamSort=%lx)\n", pfnCompare, lParamSort);
@@ -9322,12 +9298,13 @@ static BOOL LISTVIEW_SortItems(LISTVIEW_INFO *infoPtr, PFNLVCOMPARE pfnCompare,
if (infoPtr->nFocusedItem >= 0)
focusedItem = DPA_GetPtr(infoPtr->hdpaItems, infoPtr->nFocusedItem);
- infoPtr->pfnCompare = pfnCompare;
- infoPtr->lParamSort = lParamSort;
+ context.infoPtr = infoPtr;
+ context.compare_func = pfnCompare;
+ context.lParam = lParamSort;
if (IsEx)
- DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompareEx, (LPARAM)infoPtr);
+ DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompareEx, (LPARAM)&context);
else
- DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompare, (LPARAM)infoPtr);
+ DPA_Sort(infoPtr->hdpaItems, LISTVIEW_CallBackCompare, (LPARAM)&context);
/* restore selection ranges */
for (i=0; i < infoPtr->nItemCount; i++)
More information about the wine-cvs
mailing list