Jacek Caban : win32u: Move NtUserChildWindowFromPointEx implementation from user32.

Alexandre Julliard julliard at winehq.org
Thu Apr 14 16:50:33 CDT 2022


Module: wine
Branch: master
Commit: 4104b19ade7532aba5645cb7410b4c6aebe45b8e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=4104b19ade7532aba5645cb7410b4c6aebe45b8e

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Apr 14 14:10:33 2022 +0200

win32u: Move NtUserChildWindowFromPointEx implementation from user32.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 );




More information about the wine-cvs mailing list