Piotr Caban : user32: Don' t fail on windows without menu bar in DrawMenuBar.
Alexandre Julliard
julliard at winehq.org
Thu Apr 10 12:21:29 CDT 2014
Module: wine
Branch: master
Commit: 55ff0661038da271d92b5951a62f66e898b8cba2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=55ff0661038da271d92b5951a62f66e898b8cba2
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Apr 10 14:50:33 2014 +0200
user32: Don't fail on windows without menu bar in DrawMenuBar.
---
dlls/user32/menu.c | 17 +++++++++--------
dlls/user32/tests/menu.c | 2 --
dlls/user32/tests/msg.c | 11 +++++++++--
3 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 8bb508d..4a49ce6 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -4360,17 +4360,18 @@ HMENU WINAPI GetSubMenu( HMENU hMenu, INT nPos )
BOOL WINAPI DrawMenuBar( HWND hWnd )
{
LPPOPUPMENU lppop;
- HMENU hMenu = GetMenu(hWnd);
+ HMENU hMenu;
- if (!WIN_ALLOWED_MENU(GetWindowLongW( hWnd, GWL_STYLE )))
+ if (!IsWindow( hWnd ))
return FALSE;
- if (!hMenu || !(lppop = MENU_GetMenu( hMenu ))) return FALSE;
- lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */
- lppop->hwndOwner = hWnd;
- SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
- SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
- return TRUE;
+ if ((hMenu = GetMenu( hWnd )) && (lppop = MENU_GetMenu( hMenu ))) {
+ lppop->Height = 0; /* Make sure we call MENU_MenuBarCalcSize */
+ lppop->hwndOwner = hWnd;
+ }
+
+ return SetWindowPos( hWnd, 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |
+ SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED );
}
/***********************************************************************
diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c
index 7cab0a0..5fbe317 100644
--- a/dlls/user32/tests/menu.c
+++ b/dlls/user32/tests/menu.c
@@ -425,9 +425,7 @@ static void test_menu_locked_by_window(void)
ok(ret, "DestroyMenu failed with error %d\n", GetLastError());
ret = DrawMenuBar(hwnd);
- todo_wine {
ok(ret, "DrawMenuBar failed with error %d\n", GetLastError());
- }
ret = IsMenu(GetMenu(hwnd));
ok(!ret || broken(ret) /* nt4 */, "Menu handle should have been destroyed\n");
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c
index 7053ead..a209492 100644
--- a/dlls/user32/tests/msg.c
+++ b/dlls/user32/tests/msg.c
@@ -4819,13 +4819,19 @@ static void test_messages(void)
after_end_dialog = FALSE;
test_def_id = FALSE;
- hwnd = CreateWindowExA(0, "TestDialogClass", NULL, WS_POPUP,
+ hwnd = CreateWindowExA(0, "TestDialogClass", NULL, WS_POPUP|WS_CHILD,
0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL);
ok(hwnd != 0, "Failed to create custom dialog window\n");
flush_sequence();
trace("call ShowWindow(%p, SW_SHOW)\n", hwnd);
ShowWindow(hwnd, SW_SHOW);
ok_sequence(WmShowCustomDialogSeq, "ShowCustomDialog", TRUE);
+
+ flush_events();
+ flush_sequence();
+ ok(DrawMenuBar(hwnd), "DrawMenuBar failed: %d\n", GetLastError());
+ flush_events();
+ ok_sequence(WmDrawMenuBarSeq, "DrawMenuBar", FALSE);
DestroyWindow(hwnd);
flush_sequence();
@@ -4836,7 +4842,8 @@ static void test_messages(void)
flush_sequence();
/* Message sequence for SetMenu */
- ok(!DrawMenuBar(hwnd), "DrawMenuBar should return FALSE for a window without a menu\n");
+ ok(!DrawMenuBar(hwnd), "DrawMenuBar should return FALSE for a destroyed window\n");
+ ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "last error is %d\n", GetLastError());
ok_sequence(WmEmptySeq, "DrawMenuBar for a window without a menu", FALSE);
hmenu = CreateMenu();
More information about the wine-cvs
mailing list