Jacek Caban : win32u: Move IsChild implementation from user32.

Alexandre Julliard julliard at winehq.org
Tue Mar 8 16:10:49 CST 2022


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Mar  8 14:24:15 2022 +0100

win32u: Move IsChild 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/user_main.c      |  1 -
 dlls/user32/win.c            | 19 +------------------
 dlls/win32u/ntuser_private.h |  2 +-
 dlls/win32u/palette.c        |  2 +-
 dlls/win32u/window.c         | 25 +++++++++++++++++++++++++
 include/ntuser.h             |  1 +
 6 files changed, 29 insertions(+), 21 deletions(-)

diff --git a/dlls/user32/user_main.c b/dlls/user32/user_main.c
index 3afda0d528d..f9fce07ddab 100644
--- a/dlls/user32/user_main.c
+++ b/dlls/user32/user_main.c
@@ -138,7 +138,6 @@ static const struct user_callbacks user_funcs =
     CopyImage,
     GetDesktopWindow,
     GetWindowRect,
-    IsChild,
     RedrawWindow,
     SendMessageTimeoutW,
     WindowFromDC,
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index fe8d929a102..58c581c26da 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -3007,24 +3007,7 @@ HWND WINAPI SetParent( HWND hwnd, HWND parent )
  */
 BOOL WINAPI IsChild( HWND parent, HWND child )
 {
-    HWND *list;
-    int i;
-    BOOL ret = FALSE;
-
-    if (!(GetWindowLongW( child, GWL_STYLE ) & WS_CHILD)) return FALSE;
-    if (!(list = list_window_parents( child ))) return FALSE;
-    parent = WIN_GetFullHandle( parent );
-    for (i = 0; list[i]; i++)
-    {
-        if (list[i] == parent)
-        {
-            ret = list[i] && list[i+1];
-            break;
-        }
-        if (!(GetWindowLongW( list[i], GWL_STYLE ) & WS_CHILD)) break;
-    }
-    HeapFree( GetProcessHeap(), 0, list );
-    return ret;
+    return NtUserCallHwndParam( parent, HandleToUlong(child), NtUserIsChild );
 }
 
 
diff --git a/dlls/win32u/ntuser_private.h b/dlls/win32u/ntuser_private.h
index 5f3cf41c1a2..4c05d070a0a 100644
--- a/dlls/win32u/ntuser_private.h
+++ b/dlls/win32u/ntuser_private.h
@@ -32,7 +32,6 @@ struct user_callbacks
     HANDLE (WINAPI *pCopyImage)( HANDLE, UINT, INT, INT, UINT );
     HWND (WINAPI *pGetDesktopWindow)(void);
     BOOL (WINAPI *pGetWindowRect)( HWND hwnd, LPRECT rect );
-    BOOL (WINAPI *pIsChild)( HWND, HWND );
     BOOL (WINAPI *pRedrawWindow)( HWND, const RECT*, HRGN, UINT );
     LRESULT (WINAPI *pSendMessageTimeoutW)( HWND, UINT, WPARAM, LPARAM, UINT, UINT, PDWORD_PTR );
     HWND (WINAPI *pWindowFromDC)( HDC );
@@ -232,6 +231,7 @@ void *get_user_handle_ptr( HANDLE handle, unsigned int type ) DECLSPEC_HIDDEN;
 void release_user_handle_ptr( void *ptr ) DECLSPEC_HIDDEN;
 
 WND *get_win_ptr( HWND hwnd ) DECLSPEC_HIDDEN;
+BOOL is_child( HWND parent, HWND child );
 BOOL is_window( HWND hwnd ) DECLSPEC_HIDDEN;
 
 #endif /* __WINE_NTUSER_PRIVATE_H */
diff --git a/dlls/win32u/palette.c b/dlls/win32u/palette.c
index d09fc9d4d73..367bfea21b4 100644
--- a/dlls/win32u/palette.c
+++ b/dlls/win32u/palette.c
@@ -521,7 +521,7 @@ HPALETTE WINAPI NtUserSelectPalette( HDC hdc, HPALETTE hpal, WORD bkg )
         {
             /* set primary palette if it's related to current active */
             HWND foreground = NtUserGetForegroundWindow();
-            is_primary = foreground == hwnd || user_callbacks->pIsChild( foreground, hwnd );
+            is_primary = foreground == hwnd || is_child( foreground, hwnd );
         }
     }
 
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index f7f0d4e6a65..3c65d3ec1ce 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -583,6 +583,29 @@ HWND WINAPI NtUserGetAncestor( HWND hwnd, UINT type )
     return ret;
 }
 
+/* see IsChild */
+BOOL is_child( HWND parent, HWND child )
+{
+    HWND *list;
+    int i;
+    BOOL ret = FALSE;
+
+    if (!(get_window_long( child, GWL_STYLE ) & WS_CHILD)) return FALSE;
+    if (!(list = list_window_parents( child ))) return FALSE;
+    parent = get_full_window_handle( parent );
+    for (i = 0; list[i]; i++)
+    {
+        if (list[i] == parent)
+        {
+            ret = list[i] && list[i+1];
+            break;
+        }
+        if (!(get_window_long( list[i], GWL_STYLE ) & WS_CHILD)) break;
+    }
+    free( list );
+    return ret;
+}
+
 static LONG_PTR get_win_data( const void *ptr, UINT size )
 {
     if (size == sizeof(WORD))
@@ -969,6 +992,8 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code )
         return get_window_thread( hwnd, (DWORD *)param );
     case NtUserGetWindowWord:
         return get_window_word( hwnd, param );
+    case NtUserIsChild:
+        return is_child( hwnd, UlongToHandle(param) );
     default:
         FIXME( "invalid code %u\n", code );
         return 0;
diff --git a/include/ntuser.h b/include/ntuser.h
index d62a4ed4459..8d724971d53 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -159,6 +159,7 @@ enum
     NtUserGetWindowRelative,
     NtUserGetWindowThread,
     NtUserGetWindowWord,
+    NtUserIsChild,
 };
 
 /* color index used to retrieve system 55aa brush */




More information about the wine-cvs mailing list