From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/user32/user_private.h | 8 ++++---- dlls/win32u/window.c | 35 +++++++++++++++++++---------------- include/ntuser.h | 23 ++++------------------- 3 files changed, 27 insertions(+), 39 deletions(-) diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index 90b45d90fb0..1302d8decd9 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -190,22 +190,22 @@ static inline void mirror_rect( const RECT *window_rect, RECT *rect ) static inline HANDLE get_control_icon( HWND hwnd ) { - return UlongToHandle(NtUserGetPrivateData( hwnd, 8 )); + return (HANDLE)NtUserCallHwndParam( hwnd, 0, NtUserCallHwndParam_GetControlIcon ); } static inline HANDLE set_control_icon( HWND hwnd, HANDLE icon ) { - return UlongToHandle(NtUserSetPrivateData( hwnd, 8, (LONG_PTR)icon )); + return (HANDLE)NtUserCallHwndParam( hwnd, (LONG_PTR)icon, NtUserCallHwndParam_SetControlIcon ); } static inline HFONT get_control_font( HWND hwnd ) { - return UlongToHandle(NtUserGetPrivateData( hwnd, 4 )); + return (HFONT)NtUserCallHwndParam( hwnd, 0, NtUserCallHwndParam_GetControlFont ); } static inline HFONT set_control_font( HWND hwnd, HFONT font ) { - return UlongToHandle(NtUserSetPrivateData( hwnd, 4, (LONG_PTR)font )); + return (HFONT)NtUserCallHwndParam( hwnd, (LONG_PTR)font, NtUserCallHwndParam_SetControlFont ); } #endif /* __WINE_USER_PRIVATE_H */ diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 11ccd55b137..92b22da29c0 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -1163,23 +1163,15 @@ BOOL is_zoomed( HWND hwnd ) return (get_window_long( hwnd, GWL_STYLE ) & WS_MAXIMIZE) != 0; } -static UINT get_control_info( HWND hwnd, INT offset ) +static void get_control_info( HWND hwnd, struct control_info *info ) { struct object_lock lock = OBJECT_LOCK_INIT; const window_shm_t *window_shm = NULL; NTSTATUS status; - WORD fnid = 0; - UINT ret = 0; - - if (offset > sizeof(struct control_info) - sizeof(ret)) return 0; while ((status = get_shared_window( hwnd, &lock, &window_shm )) == STATUS_PENDING) - { - memcpy( &ret, (char *)&window_shm->control + offset, sizeof(ret) ); - fnid = window_shm->control.fnid; - } - - return !status && fnid ? ret : 0; + *info = window_shm->control; + if (status || !info->fnid) memset( info, 0, sizeof(*info) ); } static LONG_PTR get_window_long_size( HWND hwnd, INT offset, UINT size, BOOL ansi ) @@ -6268,15 +6260,26 @@ ULONG_PTR WINAPI NtUserCallHwndParam( HWND hwnd, DWORD_PTR param, DWORD code ) return set_raw_window_pos( hwnd, params->rect, params->flags, params->internal ); } - case NtUserCallHwndParam_GetPrivateData: - return get_control_info( hwnd, param ); + case NtUserCallHwndParam_GetControlFont: + { + struct control_info info = {0}; + get_control_info( hwnd, &info ); + return info.font; + } - case NtUserCallHwndParam_SetPrivateData: + case NtUserCallHwndParam_SetControlFont: + return server_set_control_info( hwnd, offsetof(struct control_info, font), param ); + + case NtUserCallHwndParam_GetControlIcon: { - struct set_private_data_params *params = (void *)param; - return server_set_control_info( hwnd, params->offset, params->value ); + struct control_info info = {0}; + get_control_info( hwnd, &info ); + return info.icon; } + case NtUserCallHwndParam_SetControlIcon: + return server_set_control_info( hwnd, offsetof(struct control_info, icon), param ); + default: FIXME( "invalid code %u\n", code ); return 0; diff --git a/include/ntuser.h b/include/ntuser.h index bbd35a6711a..fa1c2a0339e 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -1417,8 +1417,10 @@ enum NtUserCallHwndParam_ExposeWindowSurface, NtUserCallHwndParam_GetWinMonitorDpi, NtUserCallHwndParam_SetRawWindowPos, - NtUserCallHwndParam_GetPrivateData, - NtUserCallHwndParam_SetPrivateData, + NtUserCallHwndParam_GetControlFont, + NtUserCallHwndParam_SetControlFont, + NtUserCallHwndParam_GetControlIcon, + NtUserCallHwndParam_SetControlIcon, }; struct get_window_rects_params @@ -1645,21 +1647,4 @@ static inline BOOL NtUserSetRawWindowPos( HWND hwnd, RECT rect, UINT flags, BOOL return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, NtUserCallHwndParam_SetRawWindowPos ); } -static inline ULONG NtUserGetPrivateData( HWND hwnd, UINT offset ) -{ - return NtUserCallHwndParam( hwnd, offset, NtUserCallHwndParam_GetPrivateData ); -} - -struct set_private_data_params -{ - UINT offset; - ULONG value; -}; - -static inline ULONG NtUserSetPrivateData( HWND hwnd, UINT offset, ULONG value ) -{ - struct set_private_data_params params = { .offset = offset, .value = value }; - return NtUserCallHwndParam( hwnd, (UINT_PTR)¶ms, NtUserCallHwndParam_SetPrivateData ); -} - #endif /* _NTUSER_ */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10999