Module: wine Branch: master Commit: 4104b19ade7532aba5645cb7410b4c6aebe45b8e URL: https://source.winehq.org/git/wine.git/?a=commit;h=4104b19ade7532aba5645cb74...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Apr 14 14:10:33 2022 +0200
win32u: Move NtUserChildWindowFromPointEx implementation from user32.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/winpos.c | 42 +++++++----------------------------------- dlls/win32u/syscall.c | 1 + dlls/win32u/win32u.spec | 2 +- dlls/win32u/window.c | 37 +++++++++++++++++++++++++++++++++++++ dlls/wow64win/syscall.h | 1 + dlls/wow64win/user.c | 10 ++++++++++ include/ntuser.h | 1 + 7 files changed, 58 insertions(+), 36 deletions(-)
diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index a00686ee111..c38e0fabb1c 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -216,54 +216,26 @@ HWND WINAPI WindowFromPoint( POINT pt ) /******************************************************************* * ChildWindowFromPoint (USER32.@) */ -HWND WINAPI ChildWindowFromPoint( HWND hwndParent, POINT pt ) +HWND WINAPI ChildWindowFromPoint( HWND parent, POINT pt ) { - return ChildWindowFromPointEx( hwndParent, pt, CWP_ALL ); + return NtUserChildWindowFromPointEx( parent, pt.x, pt.y, CWP_ALL ); }
/******************************************************************* * RealChildWindowFromPoint (USER32.@) */ -HWND WINAPI RealChildWindowFromPoint( HWND hwndParent, POINT pt ) +HWND WINAPI RealChildWindowFromPoint( HWND parent, POINT pt ) { - return ChildWindowFromPointEx( hwndParent, pt, CWP_SKIPTRANSPARENT | CWP_SKIPINVISIBLE ); + return NtUserChildWindowFromPointEx( parent, pt.x, pt.y, + CWP_SKIPTRANSPARENT | CWP_SKIPINVISIBLE ); }
/******************************************************************* * ChildWindowFromPointEx (USER32.@) */ -HWND WINAPI ChildWindowFromPointEx( HWND hwndParent, POINT pt, UINT uFlags) +HWND WINAPI ChildWindowFromPointEx( HWND parent, POINT pt, UINT flags ) { - /* pt is in the client coordinates */ - HWND *list; - int i; - RECT rect; - HWND retvalue; - - GetClientRect( hwndParent, &rect ); - if (!PtInRect( &rect, pt )) return 0; - if (!(list = WIN_ListChildren( hwndParent ))) return hwndParent; - - for (i = 0; list[i]; i++) - { - if (!WIN_GetRectangles( list[i], COORDS_PARENT, &rect, NULL )) continue; - if (!PtInRect( &rect, pt )) continue; - if (uFlags & (CWP_SKIPINVISIBLE|CWP_SKIPDISABLED)) - { - LONG style = GetWindowLongW( list[i], GWL_STYLE ); - if ((uFlags & CWP_SKIPINVISIBLE) && !(style & WS_VISIBLE)) continue; - if ((uFlags & CWP_SKIPDISABLED) && (style & WS_DISABLED)) continue; - } - if (uFlags & CWP_SKIPTRANSPARENT) - { - if (GetWindowLongW( list[i], GWL_EXSTYLE ) & WS_EX_TRANSPARENT) continue; - } - break; - } - retvalue = list[i]; - HeapFree( GetProcessHeap(), 0, list ); - if (!retvalue) retvalue = hwndParent; - return retvalue; + return NtUserChildWindowFromPointEx( parent, pt.x, pt.y, flags ); }
diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index d19ab54fa90..4c316486099 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -106,6 +106,7 @@ static void * const syscalls[] = NtUserAddClipboardFormatListener, NtUserAttachThreadInput, NtUserBuildHwndList, + NtUserChildWindowFromPointEx, NtUserCloseDesktop, NtUserCloseWindowStation, NtUserCopyAcceleratorTable, diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 0bc95daafc8..cf419668789 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -790,7 +790,7 @@ @ stub NtUserCheckProcessForClipboardAccess @ stub NtUserCheckProcessSession @ stub NtUserCheckWindowThreadDesktop -@ stub NtUserChildWindowFromPointEx +@ stdcall -syscall NtUserChildWindowFromPointEx(long long long long) @ stub NtUserClearForeground @ stdcall NtUserClipCursor(ptr) @ stdcall NtUserCloseClipboard() diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 93c9f15afff..6eb272ec227 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -2255,6 +2255,43 @@ HWND WINAPI NtUserWindowFromPoint( LONG x, LONG y ) return window_from_point( 0, pt, &hittest ); }
+/******************************************************************* + * NtUserChildWindowFromPointEx (win32u.@) + */ +HWND WINAPI NtUserChildWindowFromPointEx( HWND parent, LONG x, LONG y, UINT flags ) +{ + POINT pt = { .x = x, .y = y }; /* in the client coordinates */ + HWND *list; + int i; + RECT rect; + HWND ret; + + get_client_rect( parent, &rect ); + if (!PtInRect( &rect, pt )) return 0; + if (!(list = list_window_children( 0, parent, NULL, 0 ))) return parent; + + for (i = 0; list[i]; i++) + { + if (!get_window_rects( list[i], COORDS_PARENT, &rect, NULL, get_thread_dpi() )) continue; + if (!PtInRect( &rect, pt )) continue; + if (flags & (CWP_SKIPINVISIBLE|CWP_SKIPDISABLED)) + { + LONG style = get_window_long( list[i], GWL_STYLE ); + if ((flags & CWP_SKIPINVISIBLE) && !(style & WS_VISIBLE)) continue; + if ((flags & CWP_SKIPDISABLED) && (style & WS_DISABLED)) continue; + } + if (flags & CWP_SKIPTRANSPARENT) + { + if (get_window_long( list[i], GWL_EXSTYLE ) & WS_EX_TRANSPARENT) continue; + } + break; + } + ret = list[i]; + free( list ); + if (!ret) ret = parent; + return ret; +} + /******************************************************************* * get_work_rect * diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h index ba921e7e543..509d5272038 100644 --- a/dlls/wow64win/syscall.h +++ b/dlls/wow64win/syscall.h @@ -93,6 +93,7 @@ SYSCALL_ENTRY( NtUserAddClipboardFormatListener ) \ SYSCALL_ENTRY( NtUserAttachThreadInput ) \ SYSCALL_ENTRY( NtUserBuildHwndList ) \ + SYSCALL_ENTRY( NtUserChildWindowFromPointEx ) \ SYSCALL_ENTRY( NtUserCloseDesktop ) \ SYSCALL_ENTRY( NtUserCloseWindowStation ) \ SYSCALL_ENTRY( NtUserCopyAcceleratorTable ) \ diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 9d957673ceb..db4ba246866 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -416,6 +416,16 @@ NTSTATUS WINAPI wow64_NtUserGetMouseMovePointsEx( UINT *args ) return NtUserGetMouseMovePointsEx( size, ptin, ptout, count, resolution ); }
+NTSTATUS WINAPI wow64_NtUserChildWindowFromPointEx( UINT *args ) +{ + HWND parent = get_handle( &args ); + LONG x = get_ulong( &args ); + LONG y = get_ulong( &args ); + UINT flags = get_ulong( &args ); + + return HandleToUlong( NtUserChildWindowFromPointEx( parent, x, y, flags )); +} + NTSTATUS WINAPI wow64_NtUserSetProcessDpiAwarenessContext( UINT *args ) { ULONG awareness = get_ulong( &args ); diff --git a/include/ntuser.h b/include/ntuser.h index efabbe64ad7..52bc6c12c32 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -403,6 +403,7 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ); ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code ); LONG WINAPI NtUserChangeDisplaySettings( UNICODE_STRING *devname, DEVMODEW *devmode, HWND hwnd, DWORD flags, void *lparam ); +HWND WINAPI NtUserChildWindowFromPointEx( HWND parent, LONG x, LONG y, UINT flags ); BOOL WINAPI NtUserClipCursor( const RECT *rect ); BOOL WINAPI NtUserCloseClipboard(void); BOOL WINAPI NtUserCloseDesktop( HDESK handle );