[PATCH] user32: Translate WM_(NC)XBUTTONUP to WM_APPCOMMAND in DefWindowProc.

Alex Henrie alexhenrie24 at gmail.com
Thu Feb 23 00:17:07 CST 2017


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 <alexhenrie24 at gmail.com>
---
 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




More information about the wine-patches mailing list