[PATCH] taskmgr: Implement process page sorting.

Haoyang Chen chenhaoyang at uniontech.com
Mon Apr 5 20:48:34 CDT 2021


Signed-off-by: Haoyang Chen <chenhaoyang at uniontech.com>
---
 programs/taskmgr/perfdata.c | 76 +++++++++++++++++++++++++++++++++++++
 programs/taskmgr/perfdata.h |  1 +
 programs/taskmgr/procpage.c | 10 ++---
 3 files changed, 81 insertions(+), 6 deletions(-)

diff --git a/programs/taskmgr/perfdata.c b/programs/taskmgr/perfdata.c
index 2cbd6b01669..52a08da4d88 100644
--- a/programs/taskmgr/perfdata.c
+++ b/programs/taskmgr/perfdata.c
@@ -833,3 +833,79 @@ ULONG PerfDataGetTotalThreadCount(void)
 
     return ThreadCount;
 }
+/* sort code copied from DPA */
+static BOOL bSortAscending = TRUE;
+static INT CALLBACK ProcessPageCompareFunc(LPVOID first, LPVOID second, LPARAM lParam)
+{
+    PPERFDATA pPerfData1 = NULL;
+    PPERFDATA pPerfData2 = NULL;
+    INT iSubItem = lParam;
+
+    if (bSortAscending)
+    {
+        pPerfData1 = (PPERFDATA) first;
+        pPerfData2 = (PPERFDATA) second;
+    }
+    else
+    {
+        pPerfData2 = (PPERFDATA) first;
+        pPerfData1 = (PPERFDATA) second;
+    }
+
+    switch (iSubItem)
+    {
+        case 0:
+            return lstrcmpW(pPerfData1->ImageName, pPerfData2->ImageName);
+        case 1:
+            return pPerfData1->ProcessId > pPerfData2->ProcessId;
+        case 2:
+            return pPerfData1->CPUUsage > pPerfData2->CPUUsage;
+        case 3:
+            return pPerfData1->CPUTime.QuadPart > pPerfData2->CPUTime.QuadPart;
+        case 4:
+            return pPerfData1->vmCounters.VirtualSize > pPerfData2->vmCounters.VirtualSize;
+    }
+    return 0;
+}
+
+static VOID DPA_QuickSort (PPERFDATA lpPtrs, INT l, INT r,
+                           PFNDPACOMPARE pfnCompare, LPARAM lParam)
+{
+    INT m;
+    PERFDATA  t;
+
+    if (l==r)    /* one element is always sorted */
+        return;
+    if (r<l)     /* oops, got it in the wrong order */
+    {
+        DPA_QuickSort(lpPtrs, r, l, pfnCompare, lParam);
+        return;
+    }
+    m = (l+r)/2; /* divide by two */
+    DPA_QuickSort(lpPtrs, l, m, pfnCompare, lParam);
+    DPA_QuickSort(lpPtrs, m+1, r, pfnCompare, lParam);
+
+    /* join the two sides */
+    while( (l<=m) && (m<r) )
+    {
+        if(pfnCompare(&lpPtrs[l],&lpPtrs[m+1],lParam)>0)
+        {
+            t = lpPtrs[m+1];
+            memmove(&lpPtrs[l+1],&lpPtrs[l],(m-l+1)*sizeof(lpPtrs[l]));
+            lpPtrs[l] = t;
+
+            m++;
+        }
+        l++;
+    }
+}
+
+VOID PerDataSort(UINT iSubItem)
+{
+    EnterCriticalSection(&PerfDataCriticalSection);
+
+    bSortAscending = !bSortAscending;
+    DPA_QuickSort(pPerfData, 0, ProcessCount - 1, ProcessPageCompareFunc, iSubItem);
+
+    LeaveCriticalSection(&PerfDataCriticalSection);
+}
\ No newline at end of file
diff --git a/programs/taskmgr/perfdata.h b/programs/taskmgr/perfdata.h
index 615e7db2a64..f39b03c503d 100644
--- a/programs/taskmgr/perfdata.h
+++ b/programs/taskmgr/perfdata.h
@@ -110,4 +110,5 @@ ULONG	PerfDataGetSystemHandleCount(void);
 
 ULONG	PerfDataGetTotalThreadCount(void);
 
+VOID    PerDataSort(UINT iSubItem);
 #endif /* __PERFDATA_H */
diff --git a/programs/taskmgr/procpage.c b/programs/taskmgr/procpage.c
index 5ea2e6b044f..f8dc0a0e89d 100644
--- a/programs/taskmgr/procpage.c
+++ b/programs/taskmgr/procpage.c
@@ -155,12 +155,14 @@ static void ProcessPageOnNotify(LPARAM lParam)
     ULONG              ColumnIndex;
     IO_COUNTERS        iocounters;
     TIME               time;
+    NMLISTVIEW*        pnmListView;
     static const WCHAR wszFmtD[] = {'%','d',0};
     static const WCHAR wszFmt02D[] = {'%','0','2','d',0};
     static const WCHAR wszUnitK[] = {' ','K',0};
 
     pnmh = (LPNMHDR) lParam;
     pnmdi = (NMLVDISPINFOW*) lParam;
+    pnmListView = (NM_LISTVIEW*)lParam;
 
     if (pnmh->hwndFrom == hProcessPageListCtrl)
     {
@@ -343,12 +345,8 @@ static void ProcessPageOnNotify(LPARAM lParam)
         {
         case HDN_ITEMCLICKW:
 
-            /*
-             * FIXME: Fix the column sorting
-             *
-             *ListView_SortItems(hApplicationPageListCtrl, ApplicationPageCompareFunc, NULL);
-             *bSortAscending = !bSortAscending;
-             */
+             PerDataSort(pnmListView->iItem);
+             InvalidateRect(hProcessPageListCtrl, NULL, TRUE);
 
             break;
 
-- 
2.20.1






More information about the wine-devel mailing list