Alexandre Julliard : user32: Add mouse tracking on caption right-clicks to avoid messing with the capture .

Alexandre Julliard julliard at winehq.org
Wed Feb 15 13:14:05 CST 2012


Module: wine
Branch: master
Commit: 5d1a1471636c793e75cdd1ac8a52a6d98d8c9a1c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5d1a1471636c793e75cdd1ac8a52a6d98d8c9a1c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Feb 15 14:26:00 2012 +0100

user32: Add mouse tracking on caption right-clicks to avoid messing with the capture.

---

 dlls/user32/controls.h  |    1 +
 dlls/user32/defwnd.c    |   12 +-----------
 dlls/user32/nonclient.c |   38 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/dlls/user32/controls.h b/dlls/user32/controls.h
index 66d6659..6bd946b 100644
--- a/dlls/user32/controls.h
+++ b/dlls/user32/controls.h
@@ -170,6 +170,7 @@ extern LRESULT NC_HandleNCActivate( HWND hwnd, WPARAM wParam, LPARAM lParam ) DE
 extern LRESULT NC_HandleNCCalcSize( HWND hwnd, WPARAM wParam, RECT *winRect ) DECLSPEC_HIDDEN;
 extern LRESULT NC_HandleNCHitTest( HWND hwnd, POINT pt ) DECLSPEC_HIDDEN;
 extern LRESULT NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN;
+extern LRESULT NC_HandleNCRButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN;
 extern LRESULT NC_HandleNCLButtonDblClk( HWND hwnd, WPARAM wParam, LPARAM lParam) DECLSPEC_HIDDEN;
 extern LRESULT NC_HandleSysCommand( HWND hwnd, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN;
 extern LRESULT NC_HandleSetCursor( HWND hwnd, WPARAM wParam, LPARAM lParam ) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c
index 226b604..0ac308c 100644
--- a/dlls/user32/defwnd.c
+++ b/dlls/user32/defwnd.c
@@ -334,21 +334,11 @@ static LRESULT DEFWND_DefWinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
         return NC_HandleNCLButtonDblClk( hwnd, wParam, lParam );
 
     case WM_NCRBUTTONDOWN:
-        /* in Windows, capture is taken when right-clicking on the caption bar */
-        if (wParam==HTCAPTION)
-        {
-            SetCapture(hwnd);
-        }
-        break;
+        return NC_HandleNCRButtonDown( hwnd, wParam, lParam );
 
     case WM_RBUTTONUP:
         {
             POINT pt;
-
-            if (hwnd == GetCapture())
-                /* release capture if we took it on WM_NCRBUTTONDOWN */
-                ReleaseCapture();
-
             pt.x = (short)LOWORD(lParam);
             pt.y = (short)HIWORD(lParam);
             ClientToScreen(hwnd, &pt);
diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c
index 6bef9ff..5ca0a8d 100644
--- a/dlls/user32/nonclient.c
+++ b/dlls/user32/nonclient.c
@@ -1462,6 +1462,44 @@ LRESULT NC_HandleNCLButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
 
 
 /***********************************************************************
+ *           NC_HandleNCRButtonDown
+ *
+ * Handle a WM_NCRBUTTONDOWN message. Called from DefWindowProc().
+ */
+LRESULT NC_HandleNCRButtonDown( HWND hwnd, WPARAM wParam, LPARAM lParam )
+{
+    MSG msg;
+    INT hittest = wParam;
+    HMENU hSysMenu = GetSystemMenu(hwnd, FALSE);
+
+    switch (hittest)
+    {
+    case HTCAPTION:
+    case HTSYSMENU:
+        hSysMenu = GetSystemMenu(hwnd, FALSE);
+        if (!hSysMenu) break;
+
+        SetCapture( hwnd );
+        for (;;)
+        {
+            if (!GetMessageW( &msg, 0, WM_MOUSEFIRST, WM_MOUSELAST )) break;
+            if (CallMsgFilterW( &msg, MSGF_MAX )) continue;
+            if (msg.message == WM_RBUTTONUP)
+            {
+                hittest = NC_HandleNCHitTest( hwnd, msg.pt );
+                break;
+            }
+        }
+        ReleaseCapture();
+        if (hittest == HTCAPTION || hittest == HTSYSMENU)
+            SendMessageW( hwnd, WM_SYSCOMMAND, SC_MOUSEMENU + HTSYSMENU, msg.lParam );
+        break;
+    }
+    return 0;
+}
+
+
+/***********************************************************************
  *           NC_HandleNCLButtonDblClk
  *
  * Handle a WM_NCLBUTTONDBLCLK message. Called from DefWindowProc().




More information about the wine-cvs mailing list