From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/winproc.c | 15 ++------------- dlls/win32u/message.c | 26 ++++++++++++++++++++++---- dlls/win32u/tests/win32u.c | 12 ++++++++++++ dlls/wow64win/user.c | 10 ++++++++++ 4 files changed, 46 insertions(+), 17 deletions(-)
diff --git a/dlls/user32/winproc.c b/dlls/user32/winproc.c index d1fe0d4c4ce..fb41d444a45 100644 --- a/dlls/user32/winproc.c +++ b/dlls/user32/winproc.c @@ -845,22 +845,9 @@ BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lparam, case WM_MEASUREITEM: case WM_DELETEITEM: case WM_COMPAREITEM: - break; case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: - { - WINDOWPOS wp; - if (size < sizeof(ps->wp)) return FALSE; - wp.hwnd = unpack_handle( ps->wp.hwnd ); - wp.hwndInsertAfter = unpack_handle( ps->wp.hwndInsertAfter ); - wp.x = ps->wp.x; - wp.y = ps->wp.y; - wp.cx = ps->wp.cx; - wp.cy = ps->wp.cy; - wp.flags = ps->wp.flags; - memcpy( *buffer, &wp, sizeof(wp) ); break; - } case WM_COPYDATA: { COPYDATASTRUCT cds; @@ -1137,6 +1124,8 @@ BOOL WINAPI User32CallWindowProc( struct win_proc_params *params, ULONG size ) case WM_MEASUREITEM: case WM_DELETEITEM: case WM_COMPAREITEM: + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: { LRESULT *result_ptr = (LRESULT *)buffer - 1; *result_ptr = result; diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index a752407c52b..641fa905af3 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -489,6 +489,21 @@ static BOOL unpack_message( HWND hwnd, UINT message, WPARAM *wparam, LPARAM *lpa memcpy( *buffer, &cis, sizeof(cis) ); break; } + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + { + WINDOWPOS wp; + if (size < sizeof(ps->wp)) return FALSE; + wp.hwnd = wine_server_ptr_handle( ps->wp.hwnd ); + wp.hwndInsertAfter = wine_server_ptr_handle( ps->wp.hwndInsertAfter ); + wp.x = ps->wp.x; + wp.y = ps->wp.y; + wp.cx = ps->wp.cx; + wp.cy = ps->wp.cy; + wp.flags = ps->wp.flags; + memcpy( *buffer, &wp, sizeof(wp) ); + break; + } case WM_WINE_SETWINDOWPOS: { WINDOWPOS wp; @@ -1288,6 +1303,10 @@ size_t user_message_size( UINT message, WPARAM wparam, LPARAM lparam, BOOL other case WM_COMPAREITEM: size = sizeof(COMPAREITEMSTRUCT); break; + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + size = sizeof(WINDOWPOS); + break; }
return size; @@ -1405,6 +1424,9 @@ static void copy_user_result( void *buffer, size_t size, LRESULT result, UINT me case WM_MEASUREITEM: copy_size = sizeof(MEASUREITEMSTRUCT); break; + case WM_WINDOWPOSCHANGING: + copy_size = sizeof(WINDOWPOS); + break; default: return; } @@ -1429,10 +1451,6 @@ static void copy_reply( LRESULT result, HWND hwnd, UINT message, WPARAM wparam, case LB_GETTEXT: copy_size = (result + 1) * sizeof(WCHAR); break; - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - copy_size = sizeof(WINDOWPOS); - break; case CB_GETCOMBOBOXINFO: copy_size = sizeof(COMBOBOXINFO); break; diff --git a/dlls/win32u/tests/win32u.c b/dlls/win32u/tests/win32u.c index 38686535384..8d72dba243a 100644 --- a/dlls/win32u/tests/win32u.c +++ b/dlls/win32u/tests/win32u.c @@ -1626,6 +1626,8 @@ static void test_wndproc_hook(void) static const MEASUREITEMSTRUCT mis_out = { .itemID = 2, .CtlType = 3, .CtlID = 4, .itemData = 5 }; static const DELETEITEMSTRUCT dis_in = { .itemID = 1 }; static const COMPAREITEMSTRUCT cis_in = { .itemID1 = 1 }; + static const WINDOWPOS winpos_in = { .x = 1, .cy = 2 }; + static const WINDOWPOS winpos_out = { .x = 10, .cy = 22 };
static const struct lparam_hook_test lparam_hook_tests[] = { @@ -1730,6 +1732,16 @@ static void test_wndproc_hook(void) .lparam_size = sizeof(cis_in), .lparam = &cis_in, .poison_lparam = TRUE, .check_size = sizeof(cis_in), }, + { + "WM_WINDOWPOSCHANGING", WM_WINDOWPOSCHANGING, + .lparam_size = sizeof(WINDOWPOS), .lparam = &winpos_in, .change_lparam = &winpos_out, + .check_size = sizeof(WINDOWPOS) + }, + { + "WM_WINDOWPOSCHANGED", WM_WINDOWPOSCHANGED, + .lparam_size = sizeof(WINDOWPOS), .lparam = &winpos_in, .poison_lparam = TRUE, + .check_size = sizeof(WINDOWPOS), + }, /* messages that don't change lparam */ { "WM_USER", WM_USER }, { "WM_NOTIFY", WM_NOTIFY }, diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index 388a028e3f3..b2a7a3887cc 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -715,6 +715,11 @@ static size_t packed_message_64to32( UINT message, WPARAM wparam, memcpy( params32, &cis32, sizeof(cis32) ); return sizeof(cis32); } + + case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + winpos_64to32( params64, params32 ); + return sizeof(WINDOWPOS32); }
memmove( params32, params64, size ); @@ -776,6 +781,11 @@ static size_t packed_result_32to64( UINT message, WPARAM wparam, const void *par return sizeof(*mis64); }
+ case WM_WINDOWPOSCHANGING: + case WM_WINDOWPOSCHANGED: + winpos_32to64( params64, params32 ); + return sizeof(WINDOWPOS); + case WM_GETTEXT: case WM_ASKCBFORMATNAME: case WM_GETMINMAXINFO: