From: Alex Henrie Subject: [PATCH] user32: Translate WM_(NC)XBUTTONUP to WM_APPCOMMAND in DefWindowProc. Message-Id: <20170223061707.8831-1-alexhenrie24@gmail.com> Date: Wed, 22 Feb 2017 23:17:07 -0700 According to MSDN, "DefWindowProc generates the WM_APPCOMMAND message when it processes the WM_XBUTTONUP or WM_NCXBUTTONUP message, or when the user types an application command key." https://msdn.microsoft.com/en-us/library/windows/desktop/ms646275(v=vs.85).aspx Fixes https://bugs.winehq.org/show_bug.cgi?id=20215 See: https://dxr.mozilla.org/mozilla-central/rev/b06968288cff469814bf830aa90f1c84da490f61/widget/windows/nsWindow.cpp#5631 https://dxr.mozilla.org/mozilla-central/rev/b06968288cff469814bf830aa90f1c84da490f61/widget/windows/nsWindow.cpp#5713 This change only affects users who have a 5-button mouse. Signed-off-by: Alex Henrie --- dlls/user32/defwnd.c | 9 +++++++++ dlls/user32/tests/msg.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c index e62f021435..6fbaf1ef18 100644 --- a/dlls/user32/defwnd.c +++ b/dlls/user32/defwnd.c @@ -291,6 +291,15 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa */ break; + case WM_XBUTTONUP: + case WM_NCXBUTTONUP: + if (HIWORD(wParam) == XBUTTON1 || HIWORD(wParam) == XBUTTON2) + { + SendMessageW(hwnd, WM_APPCOMMAND, (WPARAM)hwnd, + MAKELPARAM(LOWORD(wParam), FAPPCOMMAND_MOUSE | HIWORD(wParam))); + } + break; + case WM_CONTEXTMENU: if (GetWindowLongW( hwnd, GWL_STYLE ) & WS_CHILD) SendMessageW( GetParent(hwnd), msg, wParam, lParam ); diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 883d26433b..23c261e2ac 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -14377,6 +14377,18 @@ static const struct message NCRBUTTONDOWNSeq[] = { 0 } }; +static const struct message NCXBUTTONUPSeq1[] = +{ + { WM_APPCOMMAND, sent|lparam, /*hwnd*/0, MAKELPARAM(0, FAPPCOMMAND_MOUSE | APPCOMMAND_BROWSER_BACKWARD) }, + { 0 } +}; + +static const struct message NCXBUTTONUPSeq2[] = +{ + { WM_APPCOMMAND, sent|lparam, /*hwnd*/0, MAKELPARAM(0, FAPPCOMMAND_MOUSE | APPCOMMAND_BROWSER_FORWARD) }, + { 0 } +}; + struct rbuttonup_thread_data { HWND hwnd; @@ -14436,6 +14448,22 @@ static void test_defwinproc(void) DefWindowProcA( hwnd, WM_NCRBUTTONDOWN, HTCAPTION, MAKELPARAM(x, y)); ok_sequence(NCRBUTTONDOWNSeq, "WM_NCRBUTTONDOWN on caption", FALSE); + res = DefWindowProcA(hwnd, WM_NCXBUTTONUP, 0, MAKELPARAM(x, y)); + ok(!res, "WM_NCXBUTTONUP returned %ld\n", res); + ok_sequence(WmEmptySeq, "WM_NCXBUTTONUP without button", FALSE); + + res = DefWindowProcA(hwnd, WM_NCXBUTTONUP, MAKEWPARAM(0, XBUTTON1), MAKELPARAM(x, y)); + ok(!res, "WM_NCXBUTTONUP returned %ld\n", res); + ok_sequence(NCXBUTTONUPSeq1, "WM_NCXBUTTONUP with XBUTTON1", FALSE); + + res = DefWindowProcA(hwnd, WM_NCXBUTTONUP, MAKEWPARAM(0, XBUTTON2), MAKELPARAM(x, y)); + ok(!res, "WM_NCXBUTTONUP returned %ld\n", res); + ok_sequence(NCXBUTTONUPSeq2, "WM_NCXBUTTONUP with XBUTTON2", FALSE); + + res = DefWindowProcA(hwnd, WM_NCXBUTTONUP, MAKEWPARAM(0, 3), MAKELPARAM(x, y)); + ok(!res, "WM_NCXBUTTONUP returned %ld\n", res); + ok_sequence(WmEmptySeq, "WM_NCXBUTTONUP with invalid button", FALSE); + SetEvent( data.wndproc_finished ); WaitForSingleObject( thread, 1000 ); CloseHandle( data.wndproc_finished ); -- 2.11.1