Alexandre Julliard : user32: Add a helper function to set the capture window.

Alexandre Julliard julliard at winehq.org
Wed Mar 12 17:23:55 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Mar 12 14:54:03 2008 +0100

user32: Add a helper function to set the capture window.

---

 dlls/user32/input.c        |   62 ++++++++++++++++++++++++-------------------
 dlls/user32/menu.c         |   33 +++--------------------
 dlls/user32/user_private.h |    1 +
 3 files changed, 41 insertions(+), 55 deletions(-)

diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index a24980b..b0fc9c5 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -76,6 +76,38 @@ static WORD get_key_state(void)
 }
 
 
+/**********************************************************************
+ *		set_capture_window
+ */
+BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret )
+{
+    HWND previous = 0;
+    UINT flags = 0;
+    BOOL ret;
+
+    if (gui_flags & GUI_INMENUMODE) flags |= CAPTURE_MENU;
+    if (gui_flags & GUI_INMOVESIZE) flags |= CAPTURE_MOVESIZE;
+
+    SERVER_START_REQ( set_capture_window )
+    {
+        req->handle = hwnd;
+        req->flags  = flags;
+        if ((ret = !wine_server_call_err( req )))
+        {
+            previous = reply->previous;
+            hwnd = reply->full_handle;
+        }
+    }
+    SERVER_END_REQ;
+
+    if (previous && previous != hwnd)
+        SendMessageW( previous, WM_CAPTURECHANGED, 0, (LPARAM)hwnd );
+
+    if (prev_ret) *prev_ret = previous;
+    return ret;
+}
+
+
 /***********************************************************************
  *		SendInput  (USER32.@)
  */
@@ -191,22 +223,9 @@ BOOL WINAPI SetCursorPos( INT x, INT y )
  */
 HWND WINAPI SetCapture( HWND hwnd )
 {
-    HWND previous = 0;
-
-    SERVER_START_REQ( set_capture_window )
-    {
-        req->handle = hwnd;
-        req->flags  = 0;
-        if (!wine_server_call_err( req ))
-        {
-            previous = reply->previous;
-            hwnd = reply->full_handle;
-        }
-    }
-    SERVER_END_REQ;
+    HWND previous;
 
-    if (previous && previous != hwnd)
-        SendMessageW( previous, WM_CAPTURECHANGED, 0, (LPARAM)hwnd );
+    set_capture_window( hwnd, 0, &previous );
     return previous;
 }
 
@@ -216,18 +235,7 @@ HWND WINAPI SetCapture( HWND hwnd )
  */
 BOOL WINAPI ReleaseCapture(void)
 {
-    BOOL ret;
-    HWND previous = 0;
-
-    SERVER_START_REQ( set_capture_window )
-    {
-        req->handle = 0;
-        req->flags  = 0;
-        if ((ret = !wine_server_call_err( req ))) previous = reply->previous;
-    }
-    SERVER_END_REQ;
-
-    if (previous) SendMessageW( previous, WM_CAPTURECHANGED, 0, 0 );
+    BOOL ret = set_capture_window( 0, 0, NULL );
 
     /* Somebody may have missed some mouse movements */
     mouse_event( MOUSEEVENTF_MOVE, 0, 0, 0, 0 );
diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 660c5d5..17b2179 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -2636,30 +2636,6 @@ static BOOL MENU_MouseMove( MTRACKER* pmt, HMENU hPtMenu, UINT wFlags )
 
 
 /***********************************************************************
- *           MENU_SetCapture
- */
-static void MENU_SetCapture( HWND hwnd )
-{
-    HWND previous = 0;
-
-    SERVER_START_REQ( set_capture_window )
-    {
-        req->handle = hwnd;
-        req->flags  = CAPTURE_MENU;
-        if (!wine_server_call_err( req ))
-        {
-            previous = reply->previous;
-            hwnd = reply->full_handle;
-        }
-    }
-    SERVER_END_REQ;
-
-    if (previous && previous != hwnd)
-        SendMessageW( previous, WM_CAPTURECHANGED, 0, (LPARAM)hwnd );
-}
-
-
-/***********************************************************************
  *           MENU_DoNextMenu
  *
  * NOTE: WM_NEXTMENU documented in Win32 is a bit different.
@@ -2781,7 +2757,7 @@ static LRESULT MENU_DoNextMenu( MTRACKER* pmt, UINT vk )
 	if( hNewWnd != pmt->hOwnerWnd )
 	{
 	    pmt->hOwnerWnd = hNewWnd;
-	    MENU_SetCapture( pmt->hOwnerWnd );
+            set_capture_window( pmt->hOwnerWnd, GUI_INMENUMODE, NULL );
 	}
 
 	pmt->hTopMenu = pmt->hCurrentMenu = hNewMenu; /* all subpopups are hidden */
@@ -3015,7 +2991,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
 
     if (wFlags & TF_ENDMENU) fEndMenu = TRUE;
 
-    MENU_SetCapture( mt.hOwnerWnd );
+    set_capture_window( mt.hOwnerWnd, GUI_INMENUMODE, NULL );
 
     while (!fEndMenu)
     {
@@ -3239,7 +3215,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
 	else mt.trackFlags &= ~TF_SKIPREMOVE;
     }
 
-    MENU_SetCapture(0);  /* release the capture */
+    set_capture_window( 0, GUI_INMENUMODE, NULL );
 
     /* If dropdown is still painted and the close box is clicked on
        then the menu will be destroyed as part of the DispatchMessage above.
@@ -4122,7 +4098,8 @@ BOOL MENU_SetMenu( HWND hWnd, HMENU hMenu )
         return FALSE;
 
     hWnd = WIN_GetFullHandle( hWnd );
-    if (GetCapture() == hWnd) MENU_SetCapture(0);  /* release the capture */
+    if (GetCapture() == hWnd)
+        set_capture_window( 0, GUI_INMENUMODE, NULL );  /* release the capture */
 
     if (hMenu != 0)
     {
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 8292158..1131046 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -234,6 +234,7 @@ struct dce;
 extern BOOL CLIPBOARD_ReleaseOwner(void) DECLSPEC_HIDDEN;
 extern BOOL FOCUS_MouseActivate( HWND hwnd ) DECLSPEC_HIDDEN;
 extern BOOL HOOK_IsHooked( INT id ) DECLSPEC_HIDDEN;
+extern BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret );
 extern void free_dce( struct dce *dce, HWND hwnd ) DECLSPEC_HIDDEN;
 extern void invalidate_dce( HWND hwnd, const RECT *rect ) DECLSPEC_HIDDEN;
 extern void erase_now( HWND hwnd, UINT rdw_flags ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list