Module: wine Branch: master Commit: b4ac51effaa19b3ddf64f89b23894254608b6294 URL: http://source.winehq.org/git/wine.git/?a=commit;h=b4ac51effaa19b3ddf64f89b23...
Author: Sebastian Lackner sebastian@fds-team.de Date: Tue Apr 19 18:28:59 2016 +0200
user32: Do not block sending/posting WM_NOTIFY messages.
Signed-off-by: Sebastian Lackner sebastian@fds-team.de Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/message.c | 3 +-- dlls/user32/tests/msg.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 94d7a84..fb4786b 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -310,8 +310,7 @@ static const unsigned int message_pointer_flags[] = SET(WM_GETMINMAXINFO) | SET(WM_DRAWITEM) | SET(WM_MEASUREITEM) | SET(WM_DELETEITEM) | SET(WM_COMPAREITEM), /* 0x40 - 0x5f */ - SET(WM_WINDOWPOSCHANGING) | SET(WM_WINDOWPOSCHANGED) | SET(WM_COPYDATA) | - SET(WM_NOTIFY) | SET(WM_HELP), + SET(WM_WINDOWPOSCHANGING) | SET(WM_WINDOWPOSCHANGED) | SET(WM_COPYDATA) | SET(WM_HELP), /* 0x60 - 0x7f */ SET(WM_STYLECHANGING) | SET(WM_STYLECHANGED), /* 0x80 - 0x9f */ diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index d2059a8..b2630ce 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -11188,6 +11188,70 @@ static void test_quit_message(void) ok_sequence(WmStopQuitSeq, "WmStopQuitSeq", FALSE); }
+static const struct message WmNotifySeq[] = { + { WM_NOTIFY, sent|wparam|lparam, 0x1234, 0xdeadbeef }, + { 0 } +}; + +static void test_notify_message(void) +{ + HWND hwnd; + BOOL ret; + MSG msg; + + hwnd = CreateWindowExA(0, "TestWindowClass", NULL, WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, 0, NULL, NULL, 0); + ok(hwnd != 0, "Failed to create window\n"); + flush_events(); + flush_sequence(); + + ret = SendNotifyMessageA(hwnd, WM_NOTIFY, 0x1234, 0xdeadbeef); + ok(ret == TRUE, "SendNotifyMessageA failed with error %u\n", GetLastError()); + ok_sequence(WmNotifySeq, "WmNotifySeq", FALSE); + + ret = SendNotifyMessageW(hwnd, WM_NOTIFY, 0x1234, 0xdeadbeef); + ok(ret == TRUE, "SendNotifyMessageW failed with error %u\n", GetLastError()); + ok_sequence(WmNotifySeq, "WmNotifySeq", FALSE); + + ret = SendMessageCallbackA(hwnd, WM_NOTIFY, 0x1234, 0xdeadbeef, NULL, 0); + ok(ret == TRUE, "SendMessageCallbackA failed with error %u\n", GetLastError()); + ok_sequence(WmNotifySeq, "WmNotifySeq", FALSE); + + ret = SendMessageCallbackW(hwnd, WM_NOTIFY, 0x1234, 0xdeadbeef, NULL, 0); + ok(ret == TRUE, "SendMessageCallbackW failed with error %u\n", GetLastError()); + ok_sequence(WmNotifySeq, "WmNotifySeq", FALSE); + + ret = PostMessageA(hwnd, WM_NOTIFY, 0x1234, 0xdeadbeef); + ok(ret == TRUE, "PostMessageA failed with error %u\n", GetLastError()); + flush_events(); + ok_sequence(WmNotifySeq, "WmNotifySeq", FALSE); + + ret = PostMessageW(hwnd, WM_NOTIFY, 0x1234, 0xdeadbeef); + ok(ret == TRUE, "PostMessageW failed with error %u\n", GetLastError()); + flush_events(); + ok_sequence(WmNotifySeq, "WmNotifySeq", FALSE); + + ret = PostThreadMessageA(GetCurrentThreadId(), WM_NOTIFY, 0x1234, 0xdeadbeef); + ok(ret == TRUE, "PostThreadMessageA failed with error %u\n", GetLastError()); + while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) + { + msg.hwnd = hwnd; + DispatchMessageA(&msg); + } + ok_sequence(WmNotifySeq, "WmNotifySeq", FALSE); + + ret = PostThreadMessageW(GetCurrentThreadId(), WM_NOTIFY, 0x1234, 0xdeadbeef); + ok(ret == TRUE, "PostThreadMessageW failed with error %u\n", GetLastError()); + while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) + { + msg.hwnd = hwnd; + DispatchMessageA(&msg); + } + ok_sequence(WmNotifySeq, "WmNotifySeq", FALSE); + + DestroyWindow(hwnd); +} + static const struct message WmMouseHoverSeq[] = { { WM_MOUSEACTIVATE, sent|optional }, /* we can get those when moving the mouse in focus-follow-mouse mode under X11 */ { WM_MOUSEACTIVATE, sent|optional }, @@ -15793,6 +15857,7 @@ START_TEST(msg) test_SendMessageTimeout(); test_edit_messages(); test_quit_message(); + test_notify_message(); test_SetActiveWindow();
if (!pTrackMouseEvent)