[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