[PATCH v3 0/1] MR4674: comctl32/listview: Ignore the lParam to WM_PRINTCLIENT and add tests.
Based on simliar patch for comctl32/treeview: 231199bc46 WM_PRINTCLIENT paints the items of a listview, including the item backgrounds, but never the listview background. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54878 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55005 Co-authored-by: Alex Henrie <alexhenrie24(a)gmail.com> -- v3: comctl32/listview: Ignore the lParam to WM_PRINTCLIENT and add tests. https://gitlab.winehq.org/wine/wine/-/merge_requests/4674
From: Alex Henrie <alexhenrie24(a)gmail.com> Based on simliar patch for comctl32/treeview: 231199bc46 WM_PRINTCLIENT paints the items of a listview, including the item backgrounds, but never the listview background. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54878 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55005 Co-authored-by: Bernhard Übelacker <bernhardu(a)mailbox.org> --- dlls/comctl32/listview.c | 12 +---- dlls/comctl32/tests/listview.c | 81 +++++++++++++++++++++++++++++++--- 2 files changed, 78 insertions(+), 15 deletions(-) diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index 7972be9669d..c82473b6205 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -10832,17 +10832,9 @@ static inline LRESULT LISTVIEW_WMPaint(LISTVIEW_INFO *infoPtr, HDC hdc) */ static LRESULT LISTVIEW_PrintClient(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD options) { - if ((options & PRF_CHECKVISIBLE) && !IsWindowVisible(infoPtr->hwndSelf)) - return 0; - - if (options & ~(PRF_ERASEBKGND|PRF_CLIENT)) - FIXME("(hdc=%p options %#lx) partial stub\n", hdc, options); - - if (options & PRF_ERASEBKGND) - LISTVIEW_EraseBkgnd(infoPtr, hdc); + FIXME("(hdc=%p options=%#lx) partial stub\n", hdc, options); - if (options & PRF_CLIENT) - LISTVIEW_Paint(infoPtr, hdc); + LISTVIEW_Paint(infoPtr, hdc); return 0; } diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c index b1cb0ef16c2..0ab5a7d0ce7 100644 --- a/dlls/comctl32/tests/listview.c +++ b/dlls/comctl32/tests/listview.c @@ -24,11 +24,16 @@ #include <windows.h> #include <commctrl.h> #include <objbase.h> +#include <uxtheme.h> +#include <vsstyle.h> #include "wine/test.h" #include "v6util.h" #include "msg.h" +static HTHEME (WINAPI *pGetWindowTheme)(HWND); +static BOOL (WINAPI *pIsThemeBackgroundPartiallyTransparent)(HTHEME, int, int); + static HIMAGELIST (WINAPI *pImageList_Create)(int, int, UINT, int, int); static BOOL (WINAPI *pImageList_Destroy)(HIMAGELIST); static int (WINAPI *pImageList_Add)(HIMAGELIST, HBITMAP, HBITMAP); @@ -90,12 +95,16 @@ static HWND subclass_editbox(HWND hwndListview); static void init_functions(void) { HMODULE hComCtl32 = LoadLibraryA("comctl32.dll"); + HMODULE hUxtheme = LoadLibraryA("uxtheme.dll"); + +#define X(module, f) p##f = (void*)GetProcAddress(module, #f); + X(hComCtl32, ImageList_Create); + X(hComCtl32, ImageList_Destroy); + X(hComCtl32, ImageList_Add); + X(hComCtl32, _TrackMouseEvent); -#define X(f) p##f = (void*)GetProcAddress(hComCtl32, #f); - X(ImageList_Create); - X(ImageList_Destroy); - X(ImageList_Add); - X(_TrackMouseEvent); + X(hUxtheme, GetWindowTheme); + X(hUxtheme, IsThemeBackgroundPartiallyTransparent); #undef X } @@ -5978,6 +5987,66 @@ static void test_LVM_REDRAWITEMS(void) DestroyWindow(list); } +static void test_WM_PRINTCLIENT(void) +{ + static const int states[] = {SW_HIDE, SW_SHOW}; + static const LPARAM params[] = {0, PRF_CHECKVISIBLE, PRF_NONCLIENT, PRF_CLIENT, PRF_ERASEBKGND, + PRF_CHILDREN, PRF_OWNED}; + const DWORD list_background = RGB(255, 0, 0); + const DWORD text_background = RGB(0, 0, 255); + BOOL listitem_is_transparent; + HTHEME hTheme; + HWND hList; + COLORREF clr; + LONG ret; + RECT rc; + HDC hdc; + int i, j; + + hList = create_listview_control(LVS_LIST); + insert_item(hList, 0); + + ret = SendMessageA(hList, LVM_SETBKCOLOR, 0, list_background); + ok(ret == TRUE, "got 0x%lx, expected 0x%x\n", ret, TRUE); + + ret = SendMessageA(hList, LVM_SETTEXTBKCOLOR, 0, text_background); + ok(ret == TRUE, "got 0x%lx, expected 0x%x\n", ret, TRUE); + + hdc = GetDC(hwndparent); + GetClientRect(hwndparent, &rc); + + hTheme = pGetWindowTheme(hList); + listitem_is_transparent = hTheme && pIsThemeBackgroundPartiallyTransparent(hTheme, LVP_LISTITEM, 0); + + for (i = 0; i < ARRAY_SIZE(states); i++) + { + ShowWindow(hList, states[i]); + + for (j = 0; j < ARRAY_SIZE(params); j++) + { + winetest_push_context("state=%d lParam=0x%Ix", states[i], params[j]); + + FillRect(hdc, &rc, GetStockObject(BLACK_BRUSH)); + clr = GetPixel(hdc, 1, 1); + ok(clr == RGB(0, 0, 0), "got 0x%lx\n", clr); + clr = GetPixel(hdc, 50, 1); + ok(clr == RGB(0, 0, 0), "got 0x%lx\n", clr); + ret = SendMessageA(hList, WM_PRINTCLIENT, (WPARAM)hdc, params[j]); + ok(ret == 0, "got %ld\n", ret); + clr = GetPixel(hdc, 1, 1); + ok(clr == text_background || (listitem_is_transparent && clr == list_background), + "got 0x%lx\n", clr); + clr = GetPixel(hdc, 50, 1); + ok(clr == RGB(0, 0, 0), "got 0x%lx\n", clr); + + winetest_pop_context(); + } + } + + ReleaseDC(hwndparent, hdc); + DestroyWindow(hList); +} + static void test_imagelists(void) { HWND hwnd, header; @@ -7153,6 +7222,7 @@ START_TEST(listview) test_dispinfo(); test_LVM_SETITEMTEXT(); test_LVM_REDRAWITEMS(); + test_WM_PRINTCLIENT(); test_imagelists(); test_deleteitem(); test_insertitem(); @@ -7205,6 +7275,7 @@ START_TEST(listview) test_dispinfo(); test_LVM_SETITEMTEXT(); test_LVM_REDRAWITEMS(); + test_WM_PRINTCLIENT(); test_oneclickactivate(); test_state_image(); test_LVSCW_AUTOSIZE(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4674
On Thu Dec 14 16:52:59 2023 +0000, Alex Henrie wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/4674/diffs?diff_id=90116&start_sha=323ccba55971b67bd3cf1d73033411b103cf2e0f#0251bfdc5c488ffd767c45cd3a965188becc33f7_6044_6025) Sure, done.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/4674#note_56002
On Thu Dec 14 16:52:58 2023 +0000, Alex Henrie wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/4674/diffs?diff_id=90116&start_sha=323ccba55971b67bd3cf1d73033411b103cf2e0f#0251bfdc5c488ffd767c45cd3a965188becc33f7_6024_6023) Done.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/4674#note_56003
On Thu Dec 14 04:40:42 2023 +0000, Alex Henrie wrote:
You asked about comctl32 v5, but since test_WM_PRINTCLIENT also passes on v6, I've pushed a new patch that calls it in the v6 section too. I asked about it also because it checks for some uxtheme things, and that should not be relevant to v5.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/4674#note_56010
This merge request was approved by Nikolay Sivov. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/4674
On Thu Dec 14 19:05:13 2023 +0000, Nikolay Sivov wrote:
I asked about it also because it checks for some uxtheme things, and that should not be relevant to v5. I did some more testing today and it looks like uxtheme is not relevant to any of these tests, so I've removed that code.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/4674#note_56049
participants (3)
-
Alex Henrie -
Alex Henrie (@alexhenrie) -
Nikolay Sivov (@nsivov)