comctl32: toolbar: Fix the tests and handling of TB_SETHOTITEM on a disabled button.
This commit is contained in:
parent
2d6b9cafc6
commit
39c4bbe56a
|
@ -35,7 +35,11 @@
|
||||||
HWND hMainWnd;
|
HWND hMainWnd;
|
||||||
BOOL g_fBlockHotItemChange;
|
BOOL g_fBlockHotItemChange;
|
||||||
BOOL g_fReceivedHotItemChange;
|
BOOL g_fReceivedHotItemChange;
|
||||||
|
BOOL g_fExpectedHotItemOld;
|
||||||
|
BOOL g_fExpectedHotItemNew;
|
||||||
|
|
||||||
|
#define compare(val, exp, format) ok((val) == (exp), #val " value " format " expected " format "\n", (val), (exp));
|
||||||
|
|
||||||
static void MakeButton(TBBUTTON *p, int idCommand, int fsStyle, int nString) {
|
static void MakeButton(TBBUTTON *p, int idCommand, int fsStyle, int nString) {
|
||||||
p->iBitmap = -2;
|
p->iBitmap = -2;
|
||||||
p->idCommand = idCommand;
|
p->idCommand = idCommand;
|
||||||
|
@ -47,10 +51,17 @@ static void MakeButton(TBBUTTON *p, int idCommand, int fsStyle, int nString) {
|
||||||
LRESULT MyWnd_Notify(hWnd, wParam, lParam)
|
LRESULT MyWnd_Notify(hWnd, wParam, lParam)
|
||||||
{
|
{
|
||||||
NMHDR *hdr = (NMHDR *)lParam;
|
NMHDR *hdr = (NMHDR *)lParam;
|
||||||
|
NMTBHOTITEM *nmhi;
|
||||||
switch (hdr->code)
|
switch (hdr->code)
|
||||||
{
|
{
|
||||||
case TBN_HOTITEMCHANGE:
|
case TBN_HOTITEMCHANGE:
|
||||||
|
nmhi = (NMTBHOTITEM *)lParam;
|
||||||
g_fReceivedHotItemChange = TRUE;
|
g_fReceivedHotItemChange = TRUE;
|
||||||
|
if (g_fExpectedHotItemOld != g_fExpectedHotItemNew)
|
||||||
|
{
|
||||||
|
compare(nmhi->idOld, g_fExpectedHotItemOld, "%d");
|
||||||
|
compare(nmhi->idNew, g_fExpectedHotItemNew, "%d");
|
||||||
|
}
|
||||||
if (g_fBlockHotItemChange)
|
if (g_fBlockHotItemChange)
|
||||||
return 1;
|
return 1;
|
||||||
break;
|
break;
|
||||||
|
@ -422,6 +433,17 @@ void test_add_string()
|
||||||
CHECK_STRING_TABLE(14, ret7);
|
CHECK_STRING_TABLE(14, ret7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void expect_hot_notify(int idold, int idnew)
|
||||||
|
{
|
||||||
|
g_fExpectedHotItemOld = idold;
|
||||||
|
g_fExpectedHotItemNew = idnew;
|
||||||
|
g_fReceivedHotItemChange = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define check_hot_notify() \
|
||||||
|
ok(g_fReceivedHotItemChange, "TBN_HOTITEMCHANGE not received\n"); \
|
||||||
|
g_fExpectedHotItemOld = g_fExpectedHotItemNew = 0;
|
||||||
|
|
||||||
void test_hotitem()
|
void test_hotitem()
|
||||||
{
|
{
|
||||||
HWND hToolbar = NULL;
|
HWND hToolbar = NULL;
|
||||||
|
@ -452,10 +474,10 @@ void test_hotitem()
|
||||||
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
||||||
ok(ret == -1, "Hot item: %lx, expected -1\n", ret);
|
ok(ret == -1, "Hot item: %lx, expected -1\n", ret);
|
||||||
|
|
||||||
g_fReceivedHotItemChange = FALSE;
|
expect_hot_notify(0, 7);
|
||||||
ret = SendMessage(hToolbar, TB_SETHOTITEM, 3, 0);
|
ret = SendMessage(hToolbar, TB_SETHOTITEM, 3, 0);
|
||||||
ok(ret == -1, "TB_SETHOTITEM returned %ld, expected -1\n", ret);
|
ok(ret == -1, "TB_SETHOTITEM returned %ld, expected -1\n", ret);
|
||||||
ok(g_fReceivedHotItemChange, "TBN_HOTITEMCHANGE not received\n");
|
check_hot_notify();
|
||||||
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
||||||
ok(ret == 3, "Hot item: %lx, expected 3\n", ret);
|
ok(ret == 3, "Hot item: %lx, expected 3\n", ret);
|
||||||
g_fBlockHotItemChange = TRUE;
|
g_fBlockHotItemChange = TRUE;
|
||||||
|
@ -475,22 +497,27 @@ void test_hotitem()
|
||||||
ok(ret == 3, "TB_SETHOTITEM returned %ld, expected 3\n", ret);
|
ok(ret == 3, "TB_SETHOTITEM returned %ld, expected 3\n", ret);
|
||||||
ok(g_fReceivedHotItemChange == FALSE, "TBN_HOTITEMCHANGE received after a duplication\n");
|
ok(g_fReceivedHotItemChange == FALSE, "TBN_HOTITEMCHANGE received after a duplication\n");
|
||||||
|
|
||||||
|
expect_hot_notify(7, 0);
|
||||||
ret = SendMessage(hToolbar, TB_SETHOTITEM, -0xbeaf, 0);
|
ret = SendMessage(hToolbar, TB_SETHOTITEM, -0xbeaf, 0);
|
||||||
ok(ret == 3, "TB_SETHOTITEM returned %ld, expected 3\n", ret);
|
ok(ret == 3, "TB_SETHOTITEM returned %ld, expected 3\n", ret);
|
||||||
ok(g_fReceivedHotItemChange, "TBN_HOTITEMCHANGE not received\n");
|
check_hot_notify();
|
||||||
SendMessage(hToolbar, TB_SETHOTITEM, 3, 0);
|
SendMessage(hToolbar, TB_SETHOTITEM, 3, 0);
|
||||||
|
|
||||||
/* setting disabled buttons as hot failed and generates no notify */
|
/* setting disabled buttons will generate a notify with the button id but no button will be hot */
|
||||||
g_fReceivedHotItemChange = FALSE;
|
expect_hot_notify(7, 9);
|
||||||
ret = SendMessage(hToolbar, TB_SETHOTITEM, 4, 0);
|
ret = SendMessage(hToolbar, TB_SETHOTITEM, 4, 0);
|
||||||
ok(ret == 3, "TB_SETHOTITEM returned %ld, expected 3\n", ret);
|
ok(ret == 3, "TB_SETHOTITEM returned %ld, expected 3\n", ret);
|
||||||
ok(!g_fReceivedHotItemChange, "TBN_HOTITEMCHANGE received\n");
|
check_hot_notify();
|
||||||
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
||||||
ok(ret == 3, "Hot item: %lx, expected 3\n", ret);
|
ok(ret == -1, "Hot item: %lx, expected -1\n", ret);
|
||||||
|
/* enabling the button won't change that */
|
||||||
|
SendMessage(hToolbar, TB_ENABLEBUTTON, 9, TRUE);
|
||||||
|
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
||||||
|
ok(ret == -1, "TB_SETHOTITEM returned %ld, expected -1\n", ret);
|
||||||
|
|
||||||
/* but disabling a hot button works */
|
/* disabling a hot button works */
|
||||||
ret = SendMessage(hToolbar, TB_SETHOTITEM, 3, 0);
|
ret = SendMessage(hToolbar, TB_SETHOTITEM, 3, 0);
|
||||||
ok(ret == 3, "TB_SETHOTITEM returned %ld, expected 3\n", ret);
|
ok(ret == -1, "TB_SETHOTITEM returned %ld, expected -1\n", ret);
|
||||||
g_fReceivedHotItemChange = FALSE;
|
g_fReceivedHotItemChange = FALSE;
|
||||||
SendMessage(hToolbar, TB_ENABLEBUTTON, 7, FALSE);
|
SendMessage(hToolbar, TB_ENABLEBUTTON, 7, FALSE);
|
||||||
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
ret = SendMessage(hToolbar, TB_GETHOTITEM, 0, 0);
|
||||||
|
|
|
@ -4783,40 +4783,45 @@ TOOLBAR_SetHotItemEx (TOOLBAR_INFO *infoPtr, INT nHit, DWORD dwReason)
|
||||||
NMTBHOTITEM nmhotitem;
|
NMTBHOTITEM nmhotitem;
|
||||||
TBUTTON_INFO *btnPtr = NULL, *oldBtnPtr = NULL;
|
TBUTTON_INFO *btnPtr = NULL, *oldBtnPtr = NULL;
|
||||||
|
|
||||||
|
nmhotitem.dwFlags = dwReason;
|
||||||
if(infoPtr->nHotItem >= 0)
|
if(infoPtr->nHotItem >= 0)
|
||||||
{
|
{
|
||||||
oldBtnPtr = &infoPtr->buttons[infoPtr->nHotItem];
|
oldBtnPtr = &infoPtr->buttons[infoPtr->nHotItem];
|
||||||
nmhotitem.idOld = oldBtnPtr->idCommand;
|
nmhotitem.idOld = oldBtnPtr->idCommand;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
nmhotitem.dwFlags |= HICF_ENTERING;
|
nmhotitem.dwFlags |= HICF_ENTERING;
|
||||||
|
nmhotitem.idOld = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (nHit >= 0)
|
if (nHit >= 0)
|
||||||
{
|
{
|
||||||
btnPtr = &infoPtr->buttons[nHit];
|
btnPtr = &infoPtr->buttons[nHit];
|
||||||
nmhotitem.idNew = btnPtr->idCommand;
|
nmhotitem.idNew = btnPtr->idCommand;
|
||||||
/* setting disabled buttons as hot fails */
|
|
||||||
if (!(btnPtr->fsState & TBSTATE_ENABLED))
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
nmhotitem.dwFlags |= HICF_LEAVING;
|
nmhotitem.dwFlags |= HICF_LEAVING;
|
||||||
|
nmhotitem.idNew = 0;
|
||||||
nmhotitem.dwFlags = dwReason;
|
}
|
||||||
|
|
||||||
/* now change the hot and invalidate the old and new buttons - if the
|
/* now change the hot and invalidate the old and new buttons - if the
|
||||||
* parent agrees */
|
* parent agrees */
|
||||||
if (!TOOLBAR_SendNotify(&nmhotitem.hdr, infoPtr, TBN_HOTITEMCHANGE))
|
if (!TOOLBAR_SendNotify(&nmhotitem.hdr, infoPtr, TBN_HOTITEMCHANGE))
|
||||||
{
|
{
|
||||||
infoPtr->nHotItem = nHit;
|
|
||||||
if (btnPtr) {
|
|
||||||
btnPtr->bHot = TRUE;
|
|
||||||
InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE);
|
|
||||||
}
|
|
||||||
if (oldBtnPtr) {
|
if (oldBtnPtr) {
|
||||||
oldBtnPtr->bHot = FALSE;
|
oldBtnPtr->bHot = FALSE;
|
||||||
InvalidateRect(infoPtr->hwndSelf, &oldBtnPtr->rect, TRUE);
|
InvalidateRect(infoPtr->hwndSelf, &oldBtnPtr->rect, TRUE);
|
||||||
}
|
}
|
||||||
|
/* setting disabled buttons as hot fails even if the notify contains the button id */
|
||||||
|
if (btnPtr && (btnPtr->fsState & TBSTATE_ENABLED)) {
|
||||||
|
btnPtr->bHot = TRUE;
|
||||||
|
InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE);
|
||||||
|
infoPtr->nHotItem = nHit;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
infoPtr->nHotItem = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue