Piotr Caban : user32: Fix window style while CBT_CREATEWND hook is called.
Alexandre Julliard
julliard at winehq.org
Thu Oct 7 16:21:22 CDT 2021
Module: wine
Branch: master
Commit: fd60414fce64fb97c4ac66267f84b9c577d7473b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=fd60414fce64fb97c4ac66267f84b9c577d7473b
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Oct 7 16:34:11 2021 +0200
user32: Fix window style while CBT_CREATEWND hook is called.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/tests/win.c | 17 +++++++----------
dlls/user32/win.c | 40 +++++++++++++++++++++++++++-------------
include/wine/server_protocol.h | 4 +++-
server/protocol.def | 2 ++
server/request.h | 4 +++-
server/trace.c | 2 ++
server/window.c | 2 ++
7 files changed, 46 insertions(+), 25 deletions(-)
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 6715a26b631..6b13d93be14 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -1222,10 +1222,9 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam)
/* WS_VISIBLE should be turned off yet */
style = createwnd->lpcs->style & ~WS_VISIBLE;
- todo_wine_if(!(style & WS_CLIPSIBLINGS) && (!(style & WS_CHILD) || (style & WS_POPUP)))
- ok(style == GetWindowLongA(hwnd, GWL_STYLE),
- "style of hwnd and style in the CREATESTRUCT do not match: %08x != %08x\n",
- GetWindowLongA(hwnd, GWL_STYLE), style);
+ ok(style == GetWindowLongA(hwnd, GWL_STYLE),
+ "style of hwnd and style in the CREATESTRUCT do not match: %08x != %08x\n",
+ GetWindowLongA(hwnd, GWL_STYLE), style);
if (0)
{
@@ -4451,13 +4450,11 @@ static LRESULT WINAPI cbt_proc(int ncode, WPARAM wparam, LPARAM lparam)
c->lpcs->dwExStyle, ts->cs_exstyle);
style = GetWindowLongW(hwnd, GWL_STYLE);
- todo_wine_if(!(ts->cs_style & WS_CHILD) || (ts->cs_style & WS_POPUP))
- ok(style == ts->cs_style, "style = 0x%08x, expected 0x%08x\n",
- style, ts->cs_style);
+ ok(style == ts->cs_style, "style = 0x%08x, expected 0x%08x\n",
+ style, ts->cs_style);
style = GetWindowLongW(hwnd, GWL_EXSTYLE);
- todo_wine_if(ts->exstyle != ts->cs_exstyle)
- ok(style == (ts->cs_exstyle & ~WS_EX_LAYERED),
- "exstyle = 0x%08x, expected 0x%08x\n", style, ts->cs_exstyle);
+ ok(style == (ts->cs_exstyle & ~WS_EX_LAYERED),
+ "exstyle = 0x%08x, expected 0x%08x\n", style, ts->cs_exstyle);
return CallNextHookEx(NULL, ncode, wparam, lparam);
}
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 081d21a95d0..5e89f4c2c97 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -192,7 +192,8 @@ void *free_user_handle( HANDLE handle, enum user_obj_type type )
* Create a window handle with the server.
*/
static WND *create_window_handle( HWND parent, HWND owner, LPCWSTR name,
- HINSTANCE instance, BOOL unicode )
+ HINSTANCE instance, BOOL unicode,
+ DWORD style, DWORD ex_style )
{
WORD index;
WND *win;
@@ -209,6 +210,8 @@ static WND *create_window_handle( HWND parent, HWND owner, LPCWSTR name,
req->instance = wine_server_client_ptr( instance );
req->dpi = GetDpiForSystem();
req->awareness = awareness;
+ req->style = style;
+ req->ex_style = ex_style;
if (!(req->atom = get_int_atom_value( name )) && name)
wine_server_add_data( req, name, lstrlenW(name)*sizeof(WCHAR) );
if (!wine_server_call_err( req ))
@@ -1482,7 +1485,7 @@ static DWORD fix_exstyle( DWORD style, DWORD exstyle )
*/
HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module, BOOL unicode )
{
- INT cx, cy, style, sw = SW_SHOW;
+ INT cx, cy, style, ex_style, sw = SW_SHOW;
LRESULT result;
RECT rect;
WND *wndPtr;
@@ -1614,13 +1617,17 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
/* Create the window structure */
- if (!(wndPtr = create_window_handle( parent, owner, className, module, unicode )))
+ style = cs->style & ~WS_VISIBLE;
+ ex_style = cs->dwExStyle & ~WS_EX_LAYERED;
+ if (!(wndPtr = create_window_handle( parent, owner, className, module,
+ unicode, style, ex_style )))
{
WNDCLASSW wc;
/* if it's a comctl32 class, GetClassInfo will load it, then we can retry */
if (GetLastError() != ERROR_INVALID_HANDLE ||
!GetClassInfoW( 0, className, &wc ) ||
- !(wndPtr = create_window_handle( parent, owner, className, module, unicode )))
+ !(wndPtr = create_window_handle( parent, owner, className, module,
+ unicode, style, ex_style )))
return 0;
}
hwnd = wndPtr->obj.handle;
@@ -1630,8 +1637,8 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
wndPtr->tid = GetCurrentThreadId();
wndPtr->hInstance = cs->hInstance;
wndPtr->text = NULL;
- wndPtr->dwStyle = cs->style & ~WS_VISIBLE;
- wndPtr->dwExStyle = cs->dwExStyle;
+ wndPtr->dwStyle = style;
+ wndPtr->dwExStyle = ex_style;
wndPtr->wIDmenu = 0;
wndPtr->helpContext = 0;
wndPtr->pScroll = NULL;
@@ -1647,6 +1654,19 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
if (wndPtr->dwStyle & WS_SYSMENU) SetSystemMenu( hwnd, 0 );
+ /* call the WH_CBT hook */
+
+ WIN_ReleasePtr( wndPtr );
+ cbcs = *cs;
+ cbtc.lpcs = &cbcs;
+ cbtc.hwndInsertAfter = HWND_TOP;
+ if (HOOK_CallHooks( WH_CBT, HCBT_CREATEWND, (WPARAM)hwnd, (LPARAM)&cbtc, unicode ) ||
+ !(wndPtr = WIN_GetPtr( hwnd )))
+ {
+ free_window_handle( hwnd );
+ return 0;
+ }
+
/*
* Correct the window styles.
*
@@ -1660,6 +1680,7 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
wndPtr->dwStyle |= WS_CAPTION;
}
+ wndPtr->dwExStyle = cs->dwExStyle;
/* WS_EX_WINDOWEDGE depends on some other styles */
if ((wndPtr->dwStyle & (WS_DLGFRAME | WS_THICKFRAME)) &&
!(wndPtr->dwStyle & (WS_CHILD | WS_POPUP)))
@@ -1713,13 +1734,6 @@ HWND WIN_CreateWindowEx( CREATESTRUCTW *cs, LPCWSTR className, HINSTANCE module,
context = SetThreadDpiAwarenessContext( GetWindowDpiAwarenessContext( hwnd ));
- /* call the WH_CBT hook */
-
- cbcs = *cs;
- cbtc.lpcs = &cbcs;
- cbtc.hwndInsertAfter = HWND_TOP;
- if (HOOK_CallHooks( WH_CBT, HCBT_CREATEWND, (WPARAM)hwnd, (LPARAM)&cbtc, unicode )) goto failed;
-
/* send the WM_GETMINMAXINFO message and fix the size if needed */
cx = cs->cx;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 02c90ea9011..8a85e0bc4ff 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -3021,6 +3021,8 @@ struct create_window_request
mod_handle_t instance;
int dpi;
int awareness;
+ unsigned int style;
+ unsigned int ex_style;
/* VARARG(class,unicode_str); */
};
struct create_window_reply
@@ -6257,7 +6259,7 @@ union generic_reply
/* ### protocol_version begin ### */
-#define SERVER_PROTOCOL_VERSION 732
+#define SERVER_PROTOCOL_VERSION 733
/* ### protocol_version end ### */
diff --git a/server/protocol.def b/server/protocol.def
index a7a4b7cc957..0f58dc7c85a 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2241,6 +2241,8 @@ enum message_type
mod_handle_t instance; /* module instance */
int dpi; /* system DPI */
int awareness; /* thread DPI awareness */
+ unsigned int style; /* window style */
+ unsigned int ex_style; /* window extended style */
VARARG(class,unicode_str); /* class name */
@REPLY
user_handle_t handle; /* created window */
diff --git a/server/request.h b/server/request.h
index ff1744c1a80..778e7272bf5 100644
--- a/server/request.h
+++ b/server/request.h
@@ -1441,7 +1441,9 @@ C_ASSERT( FIELD_OFFSET(struct create_window_request, atom) == 20 );
C_ASSERT( FIELD_OFFSET(struct create_window_request, instance) == 24 );
C_ASSERT( FIELD_OFFSET(struct create_window_request, dpi) == 32 );
C_ASSERT( FIELD_OFFSET(struct create_window_request, awareness) == 36 );
-C_ASSERT( sizeof(struct create_window_request) == 40 );
+C_ASSERT( FIELD_OFFSET(struct create_window_request, style) == 40 );
+C_ASSERT( FIELD_OFFSET(struct create_window_request, ex_style) == 44 );
+C_ASSERT( sizeof(struct create_window_request) == 48 );
C_ASSERT( FIELD_OFFSET(struct create_window_reply, handle) == 8 );
C_ASSERT( FIELD_OFFSET(struct create_window_reply, parent) == 12 );
C_ASSERT( FIELD_OFFSET(struct create_window_reply, owner) == 16 );
diff --git a/server/trace.c b/server/trace.c
index a007cb280f0..5a2afac504a 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2929,6 +2929,8 @@ static void dump_create_window_request( const struct create_window_request *req
dump_uint64( ", instance=", &req->instance );
fprintf( stderr, ", dpi=%d", req->dpi );
fprintf( stderr, ", awareness=%d", req->awareness );
+ fprintf( stderr, ", style=%08x", req->style );
+ fprintf( stderr, ", ex_style=%08x", req->ex_style );
dump_varargs_unicode_str( ", class=", cur_size );
}
diff --git a/server/window.c b/server/window.c
index c94c745bd3c..7ea91d2a7dc 100644
--- a/server/window.c
+++ b/server/window.c
@@ -1964,6 +1964,8 @@ DECL_HANDLER(create_window)
win->dpi_awareness = req->awareness;
win->dpi = req->dpi;
}
+ win->style = req->style;
+ win->ex_style = req->ex_style;
reply->handle = win->handle;
reply->parent = win->parent ? win->parent->handle : 0;
More information about the wine-cvs
mailing list