Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- dlls/comctl32/tests/toolbar.c | 114 ++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+)
diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c index 9cfdcc689d9..d6ee358b04a 100644 --- a/dlls/comctl32/tests/toolbar.c +++ b/dlls/comctl32/tests/toolbar.c @@ -46,7 +46,10 @@ static INT (WINAPI *pImageList_GetImageCount)(HIMAGELIST); static BOOL (WINAPI *pImageList_GetIconSize)(HIMAGELIST, int *, int *); static HIMAGELIST (WINAPI *pImageList_LoadImageA)(HINSTANCE, LPCSTR, int, int, COLORREF, UINT, UINT);
+static HRESULT (WINAPI *pCloseThemeData)(HTHEME); static BOOL (WINAPI *pIsThemeActive)(VOID); +static HTHEME (WINAPI *pGetWindowTheme)(HWND); +static HTHEME (WINAPI *pOpenThemeData)(HWND, LPCWSTR);
static BOOL is_theme_active;
@@ -139,6 +142,40 @@ static void MakeButton(TBBUTTON *p, int idCommand, int fsStyle, int nString) { p->iString = nString; }
+/* try to make sure pending X events have been processed before continuing */ +static void flush_events(void) +{ + MSG msg; + int diff = 200; + int min_timeout = 100; + DWORD time = GetTickCount() + diff; + + while (diff > 0) + { + if (MsgWaitForMultipleObjects(0, NULL, FALSE, min_timeout, QS_ALLINPUT) == WAIT_TIMEOUT) + break; + while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) + DispatchMessageA(&msg); + diff = time - GetTickCount(); + } +} + +static BOOL equal_dc(HDC hdc1, HDC hdc2, int width, int height) +{ + int x, y; + + for (x = 0; x < width; ++x) + { + for (y = 0; y < height; ++y) + { + if (GetPixel(hdc1, x, y) != GetPixel(hdc2, x, y)) + return FALSE; + } + } + + return TRUE; +} + static void *alloced_str;
static LRESULT parent_wnd_notify(LPARAM lParam) @@ -2574,6 +2611,79 @@ static void test_imagelist(void) DestroyWindow(hwnd); }
+static void test_visual(void) +{ + HBITMAP mem_bitmap1, mem_bitmap2; + HDC mem_dc1, mem_dc2, toolbar_dc; + TBBUTTON tbbutton; + int width, height; + HTHEME theme; + HWND toolbar; + RECT rect; + BOOL ret; + + if (!is_theme_active) + { + skip("Theming is not active, skipping visual tests.\n"); + return; + } + + /* Test that toolbar shouldn't use outside theme handles */ + toolbar = CreateWindowA(TOOLBARCLASSNAMEA, "", WS_CHILD | WS_VISIBLE, 0, 0, 50, 50, hMainWnd, 0, 0, NULL); + ok(!!toolbar, "Failed to create a toolbar window.\n"); + + /* Toolbar needs data for it to show */ + memset(&tbbutton, 0, sizeof(tbbutton)); + tbbutton.fsState = TBSTATE_ENABLED; + tbbutton.iString = (INT_PTR)"test"; + SendMessageA(toolbar, TB_BUTTONSTRUCTSIZE, sizeof(tbbutton), 0); + ret = SendMessageA(toolbar, TB_ADDBUTTONSA, 1, (LPARAM)&tbbutton); + ok(ret, "TB_ADDBUTTONSA failed.\n"); + + theme = pGetWindowTheme(toolbar); + todo_wine + ok(!theme, "Expected theme not opened by window.\n"); + + toolbar_dc = GetDC(toolbar); + GetClientRect(toolbar, &rect); + width = rect.right - rect.left; + height = rect.bottom - rect.top; + + ret = RedrawWindow(toolbar, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW | RDW_UPDATENOW); + ok(ret, "RedrawWindow failed.\n"); + flush_events(); + + mem_dc1 = CreateCompatibleDC(toolbar_dc); + mem_bitmap1 = CreateCompatibleBitmap(toolbar_dc, width, height); + SelectObject(mem_dc1, mem_bitmap1); + BitBlt(mem_dc1, 0, 0, width, height, toolbar_dc, 0, 0, SRCCOPY); + + if (theme) + pCloseThemeData(theme); + theme = pOpenThemeData(toolbar, L"Rebar"); + ok(!!theme, "OpenThemeData failed.\n"); + + ret = RedrawWindow(toolbar, NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_ERASE | RDW_ERASENOW | RDW_UPDATENOW); + ok(ret, "RedrawWindow failed.\n"); + + mem_dc2 = CreateCompatibleDC(toolbar_dc); + mem_bitmap2 = CreateCompatibleBitmap(toolbar_dc, width, height); + SelectObject(mem_dc2, mem_bitmap2); + BitBlt(mem_dc2, 0, 0, width, height, toolbar_dc, 0, 0, SRCCOPY); + + ret = equal_dc(mem_dc1, mem_dc2, width, height); + todo_wine + ok(ret, "Expected same content.\n"); + + pCloseThemeData(theme); + DeleteObject(mem_bitmap2); + DeleteObject(mem_bitmap1); + DeleteDC(mem_dc2); + DeleteDC(mem_dc1); + ReleaseDC(toolbar, toolbar_dc); + DestroyWindow(toolbar); +} + static void init_functions(void) { HMODULE hComCtl32, hUxtheme; @@ -2590,7 +2700,10 @@ static void init_functions(void) #undef X
#define X(f) p##f = (void*)GetProcAddress(hUxtheme, #f) + X(GetWindowTheme); X(IsThemeActive); + X(OpenThemeData); + X(CloseThemeData); #undef X }
@@ -2649,6 +2762,7 @@ START_TEST(toolbar) return;
test_create(TRUE); + test_visual();
PostQuitMessage(0); while(GetMessageA(&msg,0,0,0)) {