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

This commit is contained in:
Alexandre Julliard 2008-03-12 14:54:03 +01:00
parent f6603d9fcb
commit 4e129f88d0
3 changed files with 41 additions and 55 deletions

View File

@ -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;
HWND previous;
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;
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 );

View File

@ -2635,30 +2635,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
*
@ -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)
{

View File

@ -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;