[PATCH v2] taskmgr: Implement process page sorting.

Nikolay Sivov nsivov at codeweavers.com
Tue Apr 6 05:02:17 CDT 2021



On 4/6/21 12:45 PM, Haoyang Chen wrote:
> +static BOOL bSortAscending = TRUE;
> +static UINT ColumnDataHintIndex = 0;
> +static INT ProcessPageCompareFunc(const VOID* first, const VOID* second)
You could probably use qsort_s() to pack that, also please fix prototype.

> +    switch (ColumnDataHintIndex)
> +    {
> +        case COLUMN_IMAGENAME:
> +            return lstrcmpW(pPerfData1->ImageName, pPerfData2->ImageName);
> +        case COLUMN_PID:
> +            return pPerfData1->ProcessId > pPerfData2->ProcessId;
> +        case COLUMN_USERNAME:
> +            return lstrcmpW(pPerfData1->UserName, pPerfData2->UserName);
> +        case COLUMN_SESSIONID:
> +            return pPerfData1->SessionId > pPerfData2->SessionId;
> +        case COLUMN_CPUUSAGE:
> +            return pPerfData1->CPUUsage > pPerfData2->CPUUsage;
> +        case COLUMN_CPUTIME:
> +            return pPerfData1->CPUTime.QuadPart > pPerfData2->CPUTime.QuadPart;
> +        case COLUMN_MEMORYUSAGE:
> +            return pPerfData1->vmCounters.WorkingSetSize > pPerfData2->vmCounters.WorkingSetSize;
> +        case COLUMN_PEAKMEMORYUSAGE:
> +            return pPerfData1->vmCounters.PeakWorkingSetSize > pPerfData2->vmCounters.PeakWorkingSetSize;
> +        case COLUMN_MEMORYUSAGEDELTA:
> +            return pPerfData1->WorkingSetSizeDelta > pPerfData2->WorkingSetSizeDelta;
> +        case COLUMN_PAGEFAULTS:
> +            return pPerfData1->vmCounters.PageFaultCount > pPerfData2->vmCounters.PageFaultCount;
> +        case COLUMN_PAGEFAULTSDELTA:
> +            return pPerfData1->PageFaultCountDelta > pPerfData2->PageFaultCountDelta;
> +        case COLUMN_VIRTUALMEMORYSIZE:
> +            return pPerfData1->vmCounters.VirtualSize > pPerfData2->vmCounters.VirtualSize;
> +        case COLUMN_PAGEDPOOL:
> +            return pPerfData1->vmCounters.QuotaPagedPoolUsage > pPerfData2->vmCounters.QuotaPagedPoolUsage;
> +        case COLUMN_NONPAGEDPOOL:
> +            return pPerfData1->vmCounters.QuotaNonPagedPoolUsage > pPerfData2->vmCounters.QuotaNonPagedPoolUsage;
> +        case COLUMN_BASEPRIORITY:
> +            return pPerfData1->BasePriority > pPerfData2->BasePriority;
> +        case COLUMN_HANDLECOUNT:
> +            return pPerfData1->HandleCount > pPerfData2->HandleCount;
> +        case COLUMN_THREADCOUNT:
> +            return pPerfData1->ThreadCount > pPerfData2->ThreadCount;
> +        case COLUMN_USEROBJECTS:
> +            return pPerfData1->USERObjectCount > pPerfData2->USERObjectCount;
> +        case COLUMN_GDIOBJECTS:
> +            return pPerfData1->GDIObjectCount > pPerfData2->GDIObjectCount;
> +        case COLUMN_IOREADS:
> +            return pPerfData1->IOCounters.ReadOperationCount > pPerfData2->IOCounters.ReadOperationCount;
> +        case COLUMN_IOWRITES:
> +            return pPerfData1->IOCounters.WriteOperationCount > pPerfData2->IOCounters.WriteOperationCount;
> +        case COLUMN_IOREADBYTES:
> +            return pPerfData1->IOCounters.ReadTransferCount > pPerfData2->IOCounters.ReadTransferCount;
> +        case COLUMN_IOWRITEBYTES:
> +            return pPerfData1->IOCounters.WriteTransferCount > pPerfData2->IOCounters.WriteTransferCount;
> +        case COLUMN_IOOTHERBYTES:
> +            return pPerfData1->IOCounters.OtherTransferCount > pPerfData2->IOCounters.OtherTransferCount;
> +    }
Have you tested this? I looks like it will only work correctly for
string fields.

>  static void ProcessPageOnNotify(LPARAM lParam)
>  {
> -    LPNMHDR            pnmh;
> +    LPNMHEADERW        pnmh;
This is incorrect.

> -    else if (pnmh->hwndFrom == hProcessPageHeaderCtrl)
> +    else if (pnmh->hdr.hwndFrom == hProcessPageHeaderCtrl)
>      {
> -        switch (pnmh->code)
> +        switch (pnmh->hdr.code)
>          {
>          case HDN_ITEMCLICKW:
>  
> -            /*
> -             * FIXME: Fix the column sorting
> -             *
> -             *ListView_SortItems(hApplicationPageListCtrl, ApplicationPageCompareFunc, NULL);
> -             *bSortAscending = !bSortAscending;
> -             */
> +             PerDataSort(ColumnDataHints[pnmh->iItem]);
> +             InvalidateRect(hProcessPageListCtrl, NULL, TRUE);
>  
>              break;
Again, why do you sort only on user clicks? How should it work?



More information about the wine-devel mailing list