[PATCH 9/14] user32: Send the WM_NCCALCSIZE message from user32's CreateWindow

Pierre d'Herbemont pdherbemont at free.fr
Sun Jan 21 17:36:32 CST 2007


---
   dlls/user32/driver.c              |    6 ++--
   dlls/user32/user_private.h        |    2 +-
   dlls/user32/win.c                 |   40
+++++++++++++++++++++++++++++++++++-
   dlls/winex11.drv/window.c         |   28 +++----------------------
   dlls/winex11.drv/winex11.drv.spec |    2 +-
   5 files changed, 47 insertions(+), 31 deletions(-)

-------------- next part --------------
diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c
index b102fa5..7c154bf 100644
--- a/dlls/user32/driver.c
+++ b/dlls/user32/driver.c
@@ -318,7 +318,7 @@ static BOOL nulldrv_CreateDesktopWindow(
     return TRUE;
 }
 
-static BOOL nulldrv_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
+static BOOL nulldrv_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, const RECT * window_rect, const RECT * client_rect, HWND insert_after, BOOL unicode )
 {
     static int warned;
     if (warned++)
@@ -658,9 +658,9 @@ static BOOL loaderdrv_CreateDesktopWindo
     return load_driver()->pCreateDesktopWindow( hwnd );
 }
 
-static BOOL loaderdrv_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
+static BOOL loaderdrv_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, const RECT * window_rect, const RECT * client_rect, HWND insert_after, BOOL unicode )
 {
-    return load_driver()->pCreateWindow( hwnd, cs, unicode );
+    return load_driver()->pCreateWindow( hwnd, cs, window_rect, client_rect, insert_after, unicode );
 }
 
 static void loaderdrv_DestroyWindow( HWND hwnd )
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index 99915cc..49369ce 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -142,7 +142,7 @@ typedef struct tagUSER_DRIVER {
     BOOL   (*pGetMonitorInfo)(HMONITOR,MONITORINFO*);
     /* windowing functions */
     BOOL   (*pCreateDesktopWindow)(HWND);
-    BOOL   (*pCreateWindow)(HWND,CREATESTRUCTA*,BOOL);
+    BOOL   (*pCreateWindow)(HWND,CREATESTRUCTA*,const RECT*,const RECT*,HWND,BOOL);
     void   (*pDestroyWindow)(HWND);
     HDC    (*pGetDCEx)(HWND,HRGN,DWORD);
     DWORD  (*pMsgWaitForMultipleObjectsEx)(DWORD,const HANDLE*,DWORD,DWORD,DWORD);
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 8e99bc1..551dfd8 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -867,7 +867,8 @@ static HWND WIN_CreateWindowEx( CREATEST
     MDICREATESTRUCTA mdi_cs;
     CBT_CREATEWNDA cbtc;
     CREATESTRUCTA cbcs;
-    RECT rect;
+    HWND insert_after;
+    RECT rect, window_rect, client_rect;
     BOOL ret = FALSE;
 
     TRACE("%s %s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
@@ -1152,7 +1153,42 @@ static HWND WIN_CreateWindowEx( CREATEST
         return 0;
     }
 
-    if (!USER_Driver->pCreateWindow( hwnd, cs, unicode))
+    /* send WM_NCCALCSIZE */
+    if (!(wndPtr = WIN_GetPtr(hwnd)))
+    {
+        WIN_DestroyWindow( hwnd );
+        return 0;
+    }
+
+    rect = wndPtr->rectWindow;
+    
+    WIN_ReleasePtr( wndPtr );
+
+    SendMessageW( hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&rect );
+
+    if (!(wndPtr = WIN_GetPtr(hwnd)))
+    {
+        WIN_DestroyWindow( hwnd );
+        return 0;
+    }
+
+    /* yes, even if the CBT hook was called with HWND_TOP */
+    insert_after = (wndPtr->dwStyle & WS_CHILD) ? HWND_BOTTOM : HWND_TOP;
+
+    USER_Driver->pSetWindowPos( hwnd, insert_after, &wndPtr->rectWindow, &rect, 0, NULL );
+
+    TRACE( "win %p window %d,%d,%d,%d client %d,%d,%d,%d\n",
+           hwnd, wndPtr->rectWindow.left, wndPtr->rectWindow.top,
+           wndPtr->rectWindow.right, wndPtr->rectWindow.bottom,
+           wndPtr->rectClient.left, wndPtr->rectClient.top,
+           wndPtr->rectClient.right, wndPtr->rectClient.bottom );
+
+    client_rect = wndPtr->rectClient;
+    window_rect = wndPtr->rectWindow;
+
+    WIN_ReleasePtr( wndPtr );
+
+    if (!USER_Driver->pCreateWindow( hwnd, cs, &window_rect, &client_rect, insert_after, unicode))
     {
         WIN_DestroyWindow( hwnd );
         return 0;
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c
index a15f7ca..fdffc80 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -1002,13 +1002,11 @@ BOOL X11DRV_CreateDesktopWindow( HWND hw
 /**********************************************************************
  *		CreateWindow   (X11DRV.@)
  */
-BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, BOOL unicode )
+BOOL X11DRV_CreateWindow( HWND hwnd, CREATESTRUCTA *cs, const RECT * window_rect, const RECT * client_rect, HWND insert_after, BOOL unicode )
 {
     Display *display = thread_display();
     WND *wndPtr;
     struct x11drv_win_data *data;
-    HWND insert_after;
-    RECT rect;
     LPWSTR text;
     DWORD style;
     BOOL ret = FALSE;
@@ -1016,8 +1014,7 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CRE
     if (!(data = alloc_win_data( display, hwnd ))) return FALSE;
 
     /* init the win_data dimension */
-    SetRect( &rect, cs->x, cs->y, cs->x + cs->cx, cs->y + cs->cy );
-    X11DRV_SetWindowPos( hwnd, 0, &rect, &rect, SWP_NOZORDER, NULL );
+    X11DRV_SetWindowPos(hwnd, insert_after, window_rect, client_rect, SWP_NOZORDER, NULL);
 
     /* create an X window if it's a top level window */
     if (GetAncestor( hwnd, GA_PARENT ) == GetDesktopWindow())
@@ -1034,30 +1031,13 @@ BOOL X11DRV_CreateWindow( HWND hwnd, CRE
 
     if (data->whole_window) X11DRV_sync_window_style( display, data );
 
-    /* send WM_NCCALCSIZE */
-    rect = data->window_rect;
-    SendMessageW( hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&rect );
-
-    if (!(wndPtr = WIN_GetPtr(hwnd))) return FALSE;
-
-    /* yes, even if the CBT hook was called with HWND_TOP */
-    insert_after = (wndPtr->dwStyle & WS_CHILD) ? HWND_BOTTOM : HWND_TOP;
-
-    X11DRV_SetWindowPos( hwnd, insert_after, &wndPtr->rectWindow, &rect, 0, NULL );
-
-    TRACE( "win %p window %d,%d,%d,%d client %d,%d,%d,%d whole %d,%d,%d,%d X client %d,%d,%d,%d xwin %x\n",
-           hwnd, wndPtr->rectWindow.left, wndPtr->rectWindow.top,
-           wndPtr->rectWindow.right, wndPtr->rectWindow.bottom,
-           wndPtr->rectClient.left, wndPtr->rectClient.top,
-           wndPtr->rectClient.right, wndPtr->rectClient.bottom,
-           data->whole_rect.left, data->whole_rect.top,
+    TRACE( "win %p whole %d,%d,%d,%d X client %d,%d,%d,%d xwin %x\n",
+           hwnd, data->whole_rect.left, data->whole_rect.top,
            data->whole_rect.right, data->whole_rect.bottom,
            data->client_rect.left, data->client_rect.top,
            data->client_rect.right, data->client_rect.bottom,
            (unsigned int)data->whole_window );
 
-    WIN_ReleasePtr( wndPtr );
-
     if (unicode)
         ret = (SendMessageW( hwnd, WM_CREATE, 0, (LPARAM)cs ) != -1);
     else
diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec
index 6a6c173..5e9f901 100644
--- a/dlls/winex11.drv/winex11.drv.spec
+++ b/dlls/winex11.drv/winex11.drv.spec
@@ -89,7 +89,7 @@
 @ cdecl AcquireClipboard(long) X11DRV_AcquireClipboard
 @ cdecl CountClipboardFormats() X11DRV_CountClipboardFormats
 @ cdecl CreateDesktopWindow(long) X11DRV_CreateDesktopWindow
-@ cdecl CreateWindow(long ptr long) X11DRV_CreateWindow
+@ cdecl CreateWindow(long ptr ptr ptr long long) X11DRV_CreateWindow
 @ cdecl DestroyWindow(long) X11DRV_DestroyWindow
 @ cdecl EmptyClipboard(long) X11DRV_EmptyClipboard
 @ cdecl EndClipboardUpdate() X11DRV_EndClipboardUpdate


More information about the wine-patches mailing list