From: Jacek Caban jacek@codeweavers.com
Signed-off-by: Jacek Caban jacek@codeweavers.com --- dlls/user32/win.c | 42 ++------------------------------- dlls/win32u/gdiobj.c | 1 + dlls/win32u/input.c | 45 ++++++++++++++++++++++++++++++++++++ dlls/win32u/win32u.spec | 2 +- dlls/win32u/win32u_private.h | 1 + dlls/win32u/wrappers.c | 6 +++++ include/ntuser.h | 1 + 7 files changed, 57 insertions(+), 41 deletions(-)
diff --git a/dlls/user32/win.c b/dlls/user32/win.c index 4adffc37d6b..7b0fc884402 100644 --- a/dlls/user32/win.c +++ b/dlls/user32/win.c @@ -1482,47 +1482,9 @@ BOOL WINAPI SetWindowContextHelpId( HWND hwnd, DWORD id ) /******************************************************************* * DragDetect (USER32.@) */ -BOOL WINAPI DragDetect( HWND hWnd, POINT pt ) +BOOL WINAPI DragDetect( HWND hwnd, POINT pt ) { - MSG msg; - RECT rect; - WORD wDragWidth, wDragHeight; - - TRACE( "%p,%s\n", hWnd, wine_dbgstr_point( &pt ) ); - - if (!(NtUserGetKeyState( VK_LBUTTON ) & 0x8000)) - return FALSE; - - wDragWidth = GetSystemMetrics(SM_CXDRAG); - wDragHeight= GetSystemMetrics(SM_CYDRAG); - SetRect(&rect, pt.x - wDragWidth, pt.y - wDragHeight, pt.x + wDragWidth, pt.y + wDragHeight); - - NtUserSetCapture( hWnd ); - - while(1) - { - while (PeekMessageW( &msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE )) - { - if( msg.message == WM_LBUTTONUP ) - { - ReleaseCapture(); - return FALSE; - } - if( msg.message == WM_MOUSEMOVE ) - { - POINT tmp; - tmp.x = (short)LOWORD(msg.lParam); - tmp.y = (short)HIWORD(msg.lParam); - if( !PtInRect( &rect, tmp )) - { - ReleaseCapture(); - return TRUE; - } - } - } - WaitMessage(); - } - return FALSE; + return NtUserDragDetect( hwnd, pt.x, pt.y ); }
/****************************************************************************** diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 222b74b45d6..7d9adcdec6a 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1158,6 +1158,7 @@ static struct unix_funcs unix_funcs = NtUserDestroyMenu, NtUserDestroyWindow, NtUserDispatchMessage, + NtUserDragDetect, NtUserDrawIconEx, NtUserEmptyClipboard, NtUserEnableMenuItem, diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 2b196fb5b1d..6f0e4f45501 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -1394,6 +1394,51 @@ BOOL WINAPI NtUserTrackMouseEvent( TRACKMOUSEEVENT *info ) return TRUE; }
+/******************************************************************* + * NtUserDragDetect (win32u.@) + */ +BOOL WINAPI NtUserDragDetect( HWND hwnd, int x, int y ) +{ + WORD width, height; + RECT rect; + MSG msg; + + TRACE( "%p (%d,%d)\n", hwnd, x, y ); + + if (!(NtUserGetKeyState( VK_LBUTTON ) & 0x8000)) return FALSE; + + width = get_system_metrics( SM_CXDRAG ); + height = get_system_metrics( SM_CYDRAG ); + SetRect( &rect, x - width, y - height, x + width, y + height ); + + NtUserSetCapture( hwnd ); + + for (;;) + { + while (NtUserPeekMessage( &msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE )) + { + if (msg.message == WM_LBUTTONUP) + { + release_capture(); + return FALSE; + } + if (msg.message == WM_MOUSEMOVE) + { + POINT tmp; + tmp.x = (short)LOWORD( msg.lParam ); + tmp.y = (short)HIWORD( msg.lParam ); + if (!PtInRect( &rect, tmp )) + { + release_capture(); + return TRUE; + } + } + } + NtUserMsgWaitForMultipleObjectsEx( 0, NULL, INFINITE, QS_ALLINPUT, 0 ); + } + return FALSE; +} + /********************************************************************** * set_capture_window */ diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 86d359b8386..28c839f5901 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -845,7 +845,7 @@ @ stub NtUserDoSoundConnect @ stub NtUserDoSoundDisconnect @ stub NtUserDownlevelTouchpad -@ stub NtUserDragDetect +@ stdcall NtUserDragDetect(long long long) @ stub NtUserDragObject @ stub NtUserDrawAnimatedRects @ stub NtUserDrawCaption diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 2394a8850a5..e72ab8ff1d7 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -214,6 +214,7 @@ struct unix_funcs BOOL (WINAPI *pNtUserDestroyMenu)( HMENU handle ); BOOL (WINAPI *pNtUserDestroyWindow)( HWND hwnd ); LRESULT (WINAPI *pNtUserDispatchMessage)( const MSG *msg ); + BOOL (WINAPI *pNtUserDragDetect)( HWND hwnd, int x, int y ); BOOL (WINAPI *pNtUserDrawIconEx)( HDC hdc, INT x0, INT y0, HICON icon, INT width, INT height, UINT istep, HBRUSH hbr, UINT flags ); BOOL (WINAPI *pNtUserEmptyClipboard)(void); diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index 679cce95b9a..e4219ed5648 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -855,6 +855,12 @@ LRESULT WINAPI NtUserDispatchMessage( const MSG *msg ) return unix_funcs->pNtUserDispatchMessage( msg ); }
+BOOL WINAPI NtUserDragDetect( HWND hwnd, int x, int y ) +{ + if (!unix_funcs) return FALSE; + return unix_funcs->pNtUserDragDetect( hwnd, x, y ); +} + BOOL WINAPI NtUserDrawIconEx( HDC hdc, INT x0, INT y0, HICON icon, INT width, INT height, UINT istep, HBRUSH hbr, UINT flags ) { diff --git a/include/ntuser.h b/include/ntuser.h index 482bdbcbddd..7451d649702 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -513,6 +513,7 @@ BOOL WINAPI NtUserDestroyCursor( HCURSOR cursor, ULONG arg ); BOOL WINAPI NtUserDestroyMenu( HMENU menu ); BOOL WINAPI NtUserDestroyWindow( HWND hwnd ); LRESULT WINAPI NtUserDispatchMessage( const MSG *msg ); +BOOL WINAPI NtUserDragDetect( HWND hwnd, int x, int y ); BOOL WINAPI NtUserDrawIconEx( HDC hdc, INT x0, INT y0, HICON icon, INT width, INT height, UINT istep, HBRUSH hbr, UINT flags ); BOOL WINAPI NtUserEmptyClipboard(void);