Jacek Caban : win32u: Move GetWindow implementation from user32.

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


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

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

win32u: Move GetWindow 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/win.c    | 51 +---------------------------------------------
 dlls/win32u/window.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/ntuser.h     |  1 +
 3 files changed, 59 insertions(+), 50 deletions(-)

diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 8678aa39454..fb7d05b71dc 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -3200,56 +3200,7 @@ HWND WINAPI GetTopWindow( HWND hwnd )
  */
 HWND WINAPI GetWindow( HWND hwnd, UINT rel )
 {
-    HWND retval = 0;
-
-    if (rel == GW_OWNER)  /* this one may be available locally */
-    {
-        WND *wndPtr = WIN_GetPtr( hwnd );
-        if (!wndPtr)
-        {
-            SetLastError( ERROR_INVALID_HANDLE );
-            return 0;
-        }
-        if (wndPtr == WND_DESKTOP) return 0;
-        if (wndPtr != WND_OTHER_PROCESS)
-        {
-            retval = wndPtr->owner;
-            WIN_ReleasePtr( wndPtr );
-            return retval;
-        }
-        /* else fall through to server call */
-    }
-
-    SERVER_START_REQ( get_window_tree )
-    {
-        req->handle = wine_server_user_handle( hwnd );
-        if (!wine_server_call_err( req ))
-        {
-            switch(rel)
-            {
-            case GW_HWNDFIRST:
-                retval = wine_server_ptr_handle( reply->first_sibling );
-                break;
-            case GW_HWNDLAST:
-                retval = wine_server_ptr_handle( reply->last_sibling );
-                break;
-            case GW_HWNDNEXT:
-                retval = wine_server_ptr_handle( reply->next_sibling );
-                break;
-            case GW_HWNDPREV:
-                retval = wine_server_ptr_handle( reply->prev_sibling );
-                break;
-            case GW_OWNER:
-                retval = wine_server_ptr_handle( reply->owner );
-                break;
-            case GW_CHILD:
-                retval = wine_server_ptr_handle( reply->first_child );
-                break;
-            }
-        }
-    }
-    SERVER_END_REQ;
-    return retval;
+    return UlongToHandle( NtUserCallHwndParam( hwnd, rel, NtUserGetWindowRelative ));
 }
 
 
diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c
index 86356b609b0..f24fc531f16 100644
--- a/dlls/win32u/window.c
+++ b/dlls/win32u/window.c
@@ -361,6 +361,61 @@ static DWORD get_window_thread( HWND hwnd, DWORD *process )
     return tid;
 }
 
+/* see GetWindow */
+static HWND get_window_relative( HWND hwnd, UINT rel )
+{
+    HWND retval = 0;
+
+    if (rel == GW_OWNER)  /* this one may be available locally */
+    {
+        WND *win = get_win_ptr( hwnd );
+        if (!win)
+        {
+            SetLastError( ERROR_INVALID_HANDLE );
+            return 0;
+        }
+        if (win == WND_DESKTOP) return 0;
+        if (win != WND_OTHER_PROCESS)
+        {
+            retval = win->owner;
+            release_win_ptr( win );
+            return retval;
+        }
+        /* else fall through to server call */
+    }
+
+    SERVER_START_REQ( get_window_tree )
+    {
+        req->handle = wine_server_user_handle( hwnd );
+        if (!wine_server_call_err( req ))
+        {
+            switch(rel)
+            {
+            case GW_HWNDFIRST:
+                retval = wine_server_ptr_handle( reply->first_sibling );
+                break;
+            case GW_HWNDLAST:
+                retval = wine_server_ptr_handle( reply->last_sibling );
+                break;
+            case GW_HWNDNEXT:
+                retval = wine_server_ptr_handle( reply->next_sibling );
+                break;
+            case GW_HWNDPREV:
+                retval = wine_server_ptr_handle( reply->prev_sibling );
+                break;
+            case GW_OWNER:
+                retval = wine_server_ptr_handle( reply->owner );
+                break;
+            case GW_CHILD:
+                retval = wine_server_ptr_handle( reply->first_child );
+                break;
+            }
+        }
+    }
+    SERVER_END_REQ;
+    return retval;
+}
+
 static LONG_PTR get_win_data( const void *ptr, UINT size )
 {
     if (size == sizeof(WORD))
@@ -737,6 +792,8 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code )
         return get_window_long_ptr( hwnd, param, TRUE );
     case NtUserGetWindowLongPtrW:
         return get_window_long_ptr( hwnd, param, FALSE );
+    case NtUserGetWindowRelative:
+        return HandleToUlong( get_window_relative( hwnd, param ));
     case NtUserGetWindowThread:
         return get_window_thread( hwnd, (DWORD *)param );
     case NtUserGetWindowWord:
diff --git a/include/ntuser.h b/include/ntuser.h
index ccdfdb04de5..3021a8a9af4 100644
--- a/include/ntuser.h
+++ b/include/ntuser.h
@@ -155,6 +155,7 @@ enum
     NtUserGetWindowLongW,
     NtUserGetWindowLongPtrA,
     NtUserGetWindowLongPtrW,
+    NtUserGetWindowRelative,
     NtUserGetWindowThread,
     NtUserGetWindowWord,
 };




More information about the wine-cvs mailing list