From: Rémi Bernon rbernon@codeweavers.com
--- dlls/user32/nonclient.c | 78 ------------------------------------ dlls/user32/sysparams.c | 30 ++++++++++++++ dlls/win32u/defwnd.c | 13 +++--- dlls/win32u/sysparams.c | 6 +++ dlls/win32u/win32u_private.h | 1 + dlls/win32u/window.c | 2 +- dlls/winemac.drv/window.c | 21 ++++++++-- dlls/winex11.drv/window.c | 13 +++++- include/ntuser.h | 21 ++++++++++ 9 files changed, 93 insertions(+), 92 deletions(-)
diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c index b28e9e258da..d65e7c9864c 100644 --- a/dlls/user32/nonclient.c +++ b/dlls/user32/nonclient.c @@ -22,42 +22,9 @@ #include "controls.h" #include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(nonclient);
#define SC_ABOUTWINE (SC_SCREENSAVE+1)
- -static void adjust_window_rect( RECT *rect, DWORD style, BOOL menu, DWORD exStyle, NONCLIENTMETRICSW *ncm ) -{ - int adjust = 0; - - if ((exStyle & (WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) == WS_EX_STATICEDGE) - adjust = 1; /* for the outer frame always present */ - else if ((exStyle & WS_EX_DLGMODALFRAME) || (style & (WS_THICKFRAME|WS_DLGFRAME))) - adjust = 2; /* outer */ - - if (style & WS_THICKFRAME) - adjust += ncm->iBorderWidth + ncm->iPaddedBorderWidth; /* The resize border */ - - if ((style & (WS_BORDER|WS_DLGFRAME)) || (exStyle & WS_EX_DLGMODALFRAME)) - adjust++; /* The other border */ - - InflateRect (rect, adjust, adjust); - - if ((style & WS_CAPTION) == WS_CAPTION) - { - if (exStyle & WS_EX_TOOLWINDOW) - rect->top -= ncm->iSmCaptionHeight + 1; - else - rect->top -= ncm->iCaptionHeight + 1; - } - if (menu) rect->top -= ncm->iMenuHeight + 1; - - if (exStyle & WS_EX_CLIENTEDGE) - InflateRect(rect, GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE)); -} - - /*********************************************************************** * DrawCaption (USER32.@) Draws a caption bar */ @@ -91,51 +58,6 @@ BOOL WINAPI DrawCaptionTempA (HWND hwnd, HDC hdc, const RECT *rect, HFONT hFont, }
-/*********************************************************************** - * AdjustWindowRect (USER32.@) - */ -BOOL WINAPI DECLSPEC_HOTPATCH AdjustWindowRect( LPRECT rect, DWORD style, BOOL menu ) -{ - return AdjustWindowRectEx( rect, style, menu, 0 ); -} - - -/*********************************************************************** - * AdjustWindowRectEx (USER32.@) - */ -BOOL WINAPI DECLSPEC_HOTPATCH AdjustWindowRectEx( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle ) -{ - NONCLIENTMETRICSW ncm; - - TRACE("(%s) %08lx %d %08lx\n", wine_dbgstr_rect(rect), style, menu, exStyle ); - - ncm.cbSize = sizeof(ncm); - SystemParametersInfoW( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0 ); - - adjust_window_rect( rect, style, menu, exStyle, &ncm ); - return TRUE; -} - - -/*********************************************************************** - * AdjustWindowRectExForDpi (USER32.@) - */ -BOOL WINAPI DECLSPEC_HOTPATCH AdjustWindowRectExForDpi( LPRECT rect, DWORD style, BOOL menu, - DWORD exStyle, UINT dpi ) -{ - NONCLIENTMETRICSW ncm; - - TRACE("(%s) %08lx %d %08lx %u\n", wine_dbgstr_rect(rect), style, menu, exStyle, dpi ); - - ncm.cbSize = sizeof(ncm); - SystemParametersInfoForDpi( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0, dpi ); - - adjust_window_rect( rect, style, menu, exStyle, &ncm ); - return TRUE; -} - - - /*********************************************************************** * NC_HandleSysCommand * diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 2ec970fe1ac..273dccc6930 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -1026,3 +1026,33 @@ LONG WINAPI SetDisplayConfig(UINT32 path_info_count, DISPLAYCONFIG_PATH_INFO *pa
return ERROR_SUCCESS; } + + +/*********************************************************************** + * AdjustWindowRect (USER32.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH AdjustWindowRect( RECT *rect, DWORD style, BOOL menu ) +{ + TRACE( "(%s) %08lx %d\n", wine_dbgstr_rect( rect ), style, menu ); + return NtUserAdjustWindowRect( rect, style, menu, 0, system_dpi ); +} + + +/*********************************************************************** + * AdjustWindowRectEx (USER32.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH AdjustWindowRectEx( RECT *rect, DWORD style, BOOL menu, DWORD ex_style ) +{ + TRACE( "(%s) %08lx %d %08lx\n", wine_dbgstr_rect( rect ), style, menu, ex_style ); + return NtUserAdjustWindowRect( rect, style, menu, ex_style, system_dpi ); +} + + +/*********************************************************************** + * AdjustWindowRectExForDpi (USER32.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH AdjustWindowRectExForDpi( RECT *rect, DWORD style, BOOL menu, DWORD ex_style, UINT dpi ) +{ + TRACE( "(%s) %08lx %d %08lx %u\n", wine_dbgstr_rect( rect ), style, menu, ex_style, dpi ); + return NtUserAdjustWindowRect( rect, style, menu, ex_style, dpi ); +} diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c index 43d31bc4f54..9524b1956cc 100644 --- a/dlls/win32u/defwnd.c +++ b/dlls/win32u/defwnd.c @@ -250,16 +250,13 @@ BOOL draw_rect_edge( HDC hdc, RECT *rc, UINT type, UINT flags, UINT width ) return retval; }
-/*********************************************************************** - * AdjustWindowRectEx (win32u.so) - */ -BOOL WINAPI AdjustWindowRectEx( RECT *rect, DWORD style, BOOL menu, DWORD ex_style ) +/* see AdjustWindowRectExForDpi */ +BOOL adjust_window_rect( RECT *rect, DWORD style, BOOL menu, DWORD ex_style, UINT dpi ) { - NONCLIENTMETRICSW ncm; + NONCLIENTMETRICSW ncm = {.cbSize = sizeof(ncm)}; int adjust = 0;
- ncm.cbSize = sizeof(ncm); - NtUserSystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0 ); + NtUserSystemParametersInfoForDpi( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0, dpi );
if ((ex_style & (WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) == WS_EX_STATICEDGE) adjust = 1; /* for the outer frame always present */ @@ -1856,7 +1853,7 @@ static void handle_nc_calc_size( HWND hwnd, WPARAM wparam, RECT *win_rect )
if (!(style & WS_MINIMIZE)) { - AdjustWindowRectEx( &rect, style, FALSE, ex_style & ~WS_EX_CLIENTEDGE ); + adjust_window_rect( &rect, style, FALSE, ex_style & ~WS_EX_CLIENTEDGE, get_system_dpi() );
win_rect->left -= rect.left; win_rect->top -= rect.top; diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 49bf26214e7..d44dc4521ff 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -6448,6 +6448,12 @@ ULONG_PTR WINAPI NtUserCallTwoParam( ULONG_PTR arg1, ULONG_PTR arg2, ULONG code case NtUserCallTwoParam_UnhookWindowsHook: return unhook_windows_hook( arg1, (HOOKPROC)arg2 );
+ case NtUserCallTwoParam_AdjustWindowRect: + { + struct adjust_window_rect_params *params = (void *)arg2; + return adjust_window_rect( (RECT *)arg1, params->style, params->menu, params->ex_style, params->dpi ); + } + /* temporary exports */ case NtUserAllocWinProc: return (UINT_PTR)alloc_winproc( (WNDPROC)arg1, arg2 ); diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 8aed662d2d8..856779b3fa0 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -59,6 +59,7 @@ extern void register_window_surface( struct window_surface *old, struct window_surface *new );
/* defwnd.c */ +extern BOOL adjust_window_rect( RECT *rect, DWORD style, BOOL menu, DWORD ex_style, UINT dpi ); extern LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, BOOL ansi ); extern LRESULT desktop_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ); diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 207e93e6a4c..a35f544d8bc 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -3841,7 +3841,7 @@ MINMAXINFO get_min_max_info( HWND hwnd ) adjusted_style = style;
get_client_rect( NtUserGetAncestor( hwnd, GA_PARENT ), &rc ); - AdjustWindowRectEx( &rc, adjusted_style, (style & WS_POPUP) && get_menu( hwnd ), exstyle ); + adjust_window_rect( &rc, adjusted_style, (style & WS_POPUP) && get_menu( hwnd ), exstyle, get_system_dpi() );
xinc = -rc.left; yinc = -rc.top; diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index 84668b44c51..b75b5aca8c6 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -46,6 +46,15 @@ static CFMutableDictionaryRef win_datas; static unsigned int activate_on_focus_time;
+/********************************************************************** + * get_win_monitor_dpi + */ +static UINT get_win_monitor_dpi(HWND hwnd) +{ + return NtUserGetSystemDpiForProcess(NULL); /* FIXME: get monitor dpi */ +} + + /*********************************************************************** * get_cocoa_window_features */ @@ -133,6 +142,7 @@ static void get_mac_rect_offset(struct macdrv_win_data *data, unsigned int style const RECT *window_rect, const RECT *client_rect) { unsigned int ex_style, style_mask = 0, ex_style_mask = 0; + UINT dpi = get_win_monitor_dpi(data->hwnd);
rect->top = rect->bottom = rect->left = rect->right = 0;
@@ -155,7 +165,7 @@ static void get_mac_rect_offset(struct macdrv_win_data *data, unsigned int style } }
- AdjustWindowRectEx(rect, style & style_mask, FALSE, ex_style & ex_style_mask); + NtUserAdjustWindowRect(rect, style & style_mask, FALSE, ex_style & ex_style_mask, dpi);
TRACE("%p/%p style %08x ex_style %08x shaped %d -> %s\n", data->hwnd, data->cocoa_window, style, ex_style, data->shaped, wine_dbgstr_rect(rect)); @@ -522,6 +532,7 @@ static void sync_window_min_max_info(HWND hwnd) { LONG style = NtUserGetWindowLongW(hwnd, GWL_STYLE); LONG exstyle = NtUserGetWindowLongW(hwnd, GWL_EXSTYLE); + UINT dpi = get_win_monitor_dpi(hwnd); RECT win_rect, primary_monitor_rect; MINMAXINFO minmax; LONG adjustedStyle; @@ -529,6 +540,7 @@ static void sync_window_min_max_info(HWND hwnd) WINDOWPLACEMENT wpl; HMONITOR monitor; struct macdrv_win_data *data; + BOOL menu;
TRACE("win %p\n", hwnd);
@@ -546,8 +558,8 @@ static void sync_window_min_max_info(HWND hwnd) primary_monitor_rect.left = primary_monitor_rect.top = 0; primary_monitor_rect.right = NtUserGetSystemMetrics(SM_CXSCREEN); primary_monitor_rect.bottom = NtUserGetSystemMetrics(SM_CYSCREEN); - AdjustWindowRectEx(&primary_monitor_rect, adjustedStyle, - ((style & WS_POPUP) && NtUserGetWindowLongPtrW(hwnd, GWLP_ID)), exstyle); + menu = ((style & WS_POPUP) && NtUserGetWindowLongPtrW(hwnd, GWLP_ID)); + NtUserAdjustWindowRect(&primary_monitor_rect, adjustedStyle, menu, exstyle, dpi);
xinc = -primary_monitor_rect.left; yinc = -primary_monitor_rect.top; @@ -1313,6 +1325,7 @@ static HMONITOR monitor_from_point(POINT pt, UINT flags) */ static LRESULT move_window(HWND hwnd, WPARAM wparam) { + UINT dpi = get_win_monitor_dpi(hwnd); MSG msg; RECT origRect, movedRect, desktopRect; int hittest = (int)(wparam & 0x0f); @@ -1334,7 +1347,7 @@ static LRESULT move_window(HWND hwnd, WPARAM wparam) TRACE("hwnd %p hittest %d, pos %d,%d\n", hwnd, hittest, (int)capturePoint.x, (int)capturePoint.y);
origRect.left = origRect.right = origRect.top = origRect.bottom = 0; - if (AdjustWindowRectEx(&origRect, style, FALSE, NtUserGetWindowLongW(hwnd, GWL_EXSTYLE))) + if (NtUserAdjustWindowRect(&origRect, style, FALSE, NtUserGetWindowLongW(hwnd, GWL_EXSTYLE), dpi)) captionHeight = -origRect.top; else captionHeight = 0; diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index f1d6fd1a732..a96c70b887b 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -113,6 +113,15 @@ static const WCHAR clip_window_prop[] = static pthread_mutex_t win_data_mutex = PTHREAD_MUTEX_INITIALIZER;
+/********************************************************************** + * get_win_monitor_dpi + */ +static UINT get_win_monitor_dpi( HWND hwnd ) +{ + return NtUserGetSystemDpiForProcess( NULL ); /* FIXME: get monitor dpi */ +} + + /*********************************************************************** * http://standards.freedesktop.org/startup-notification-spec */ @@ -1301,10 +1310,12 @@ static void get_decoration_rect( struct x11drv_win_data *data, RECT *rect, { DWORD style, ex_style, style_mask = 0, ex_style_mask = 0; unsigned long decor; + UINT dpi;
SetRectEmpty( rect ); if (!data->managed) return;
+ dpi = get_win_monitor_dpi( data->hwnd ); style = NtUserGetWindowLongW( data->hwnd, GWL_STYLE ); ex_style = NtUserGetWindowLongW( data->hwnd, GWL_EXSTYLE ); decor = get_mwm_decorations( data, style, ex_style, window_rect, client_rect ); @@ -1316,7 +1327,7 @@ static void get_decoration_rect( struct x11drv_win_data *data, RECT *rect, ex_style_mask |= WS_EX_DLGMODALFRAME; }
- AdjustWindowRectEx( rect, style & style_mask, FALSE, ex_style & ex_style_mask ); + NtUserAdjustWindowRect( rect, style & style_mask, FALSE, ex_style & ex_style_mask, dpi ); }
diff --git a/include/ntuser.h b/include/ntuser.h index ff45ffa2bc8..f26bce82806 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -1045,6 +1045,7 @@ enum NtUserCallTwoParam_SetCaretPos, NtUserCallTwoParam_SetIconParam, NtUserCallTwoParam_UnhookWindowsHook, + NtUserCallTwoParam_AdjustWindowRect, /* temporary exports */ NtUserAllocWinProc, }; @@ -1092,6 +1093,26 @@ static inline BOOL NtUserUnhookWindowsHook( INT id, HOOKPROC proc ) return NtUserCallTwoParam( id, (UINT_PTR)proc, NtUserCallTwoParam_UnhookWindowsHook ); }
+struct adjust_window_rect_params +{ + DWORD style; + DWORD ex_style; + BOOL menu; + UINT dpi; +}; + +static inline BOOL NtUserAdjustWindowRect( RECT *rect, DWORD style, BOOL menu, DWORD ex_style, UINT dpi ) +{ + struct adjust_window_rect_params params = + { + .style = style, + .ex_style = ex_style, + .menu = menu, + .dpi = dpi, + }; + return NtUserCallTwoParam( (ULONG_PTR)rect, (ULONG_PTR)¶ms, NtUserCallTwoParam_AdjustWindowRect ); +} + /* NtUserCallHwnd codes, not compatible with Windows */ enum {