Module: wine Branch: master Commit: a289bab122fd001688505012e0126137c91db4b8 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a289bab122fd001688505012e0...
Author: Mikołaj Zalewski mikolaj@zalewski.pl Date: Tue Jul 22 14:29:27 2008 +0200
comctl32: toolbar: TB_SETBITMAPSIZE should not change a coordinate when passed -1 (with testcase).
---
dlls/comctl32/tests/toolbar.c | 19 +++++++++++++++++++ dlls/comctl32/toolbar.c | 34 +++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 11 deletions(-)
diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c index 2693025..4b6d3c3 100644 --- a/dlls/comctl32/tests/toolbar.c +++ b/dlls/comctl32/tests/toolbar.c @@ -203,6 +203,13 @@ static void rebuild_toolbar_with_buttons(HWND *hToolbar) ok(SendMessage(*hToolbar, TB_AUTOSIZE, 0, 0) == 0, "TB_AUTOSIZE failed\n"); }
+static void add_128x15_bitmap(HWND hToolbar, int nCmds) +{ + TBADDBITMAP bmp128; + bmp128.hInst = GetModuleHandle(NULL); + bmp128.nID = IDB_BITMAP_128x15; + ok(SendMessageA(hToolbar, TB_ADDBITMAP, nCmds, (LPARAM)&bmp128) == 0, "TB_ADDBITMAP - unexpected return\n"); +}
#define CHECK_IMAGELIST(count, dx, dy) { \ int cx, cy; \ @@ -854,6 +861,18 @@ static void test_sizes(void) ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); SendMessageA(hToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(16, 15)); ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 21), "Unexpected button size\n"); + /* -1 in TB_SETBITMAPSIZE is a special code meaning that the coordinate shouldn't be changed */ + add_128x15_bitmap(hToolbar, 16); + ok(SendMessageA(hToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(14, -1)), "TB_SETBITMAPSIZE failed\n"); + compare((int)SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0), MAKELONG(21, 21), "%x"); + ok(SendMessageA(hToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(-1, 12)), "TB_SETBITMAPSIZE failed\n"); + compare((int)SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0), MAKELONG(21, 18), "%x"); + ok(SendMessageA(hToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(-1, -1)), "TB_SETBITMAPSIZE failed\n"); + compare((int)SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0), MAKELONG(21, 18), "%x"); + /* check the imagelist */ + InvalidateRect(hToolbar, NULL, TRUE); + UpdateWindow(hToolbar); + CHECK_IMAGELIST(16, 14, 12);
rebuild_toolbar(&hToolbar); SendMessageA(hToolbar, TB_ADDSTRINGA, 0, (LPARAM)"A\0MMMMMMMMMMMMM\0"); diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c index 15e65b3..0beb2c6 100644 --- a/dlls/comctl32/toolbar.c +++ b/dlls/comctl32/toolbar.c @@ -4374,26 +4374,38 @@ TOOLBAR_SetBitmapSize (HWND hwnd, WPARAM wParam, LPARAM lParam) { TOOLBAR_INFO *infoPtr = TOOLBAR_GetInfoPtr (hwnd); HIMAGELIST himlDef = GETDEFIMAGELIST(infoPtr, 0); + short width = (short)LOWORD(lParam); + short height = (short)HIWORD(lParam);
TRACE("hwnd=%p, wParam=%ld, lParam=%ld\n", hwnd, wParam, lParam);
if (wParam != 0) FIXME("wParam is %ld. Perhaps image list index?\n", wParam);
- if (LOWORD(lParam) == 0) - lParam = MAKELPARAM(1, HIWORD(lParam)); - - if (HIWORD(lParam)==0) - lParam = MAKELPARAM(LOWORD(lParam), 1); + /* 0 width or height is changed to 1 */ + if (width == 0) + width = 1; + if (height == 0) + height = 1;
if (infoPtr->nNumButtons > 0) - WARN("%d buttons, undoc increase to bitmap size : %d-%d -> %d-%d\n", - infoPtr->nNumButtons, - infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, - LOWORD(lParam), HIWORD(lParam)); + TRACE("%d buttons, undoc change to bitmap size : %d-%d -> %d-%d\n", + infoPtr->nNumButtons, + infoPtr->nBitmapWidth, infoPtr->nBitmapHeight, width, height); + + if (width < -1 || height < -1) + { + /* Windows destroys the imagelist and seems to actually use negative + * values to compute button sizes */ + FIXME("Negative bitmap sizes not supported (%d, %d)\n", width, height); + return FALSE; + }
- infoPtr->nBitmapWidth = (INT)LOWORD(lParam); - infoPtr->nBitmapHeight = (INT)HIWORD(lParam); + /* width or height of -1 means no change */ + if (width != -1) + infoPtr->nBitmapWidth = width; + if (height != -1) + infoPtr->nBitmapHeight = height;
if ((himlDef == infoPtr->himlInt) && (ImageList_GetImageCount(infoPtr->himlInt) == 0))