Alexandre Julliard : user32: Reimplement AdjustWindowRectEx using NONCLIENTMETRICSW.
Alexandre Julliard
julliard at winehq.org
Tue Apr 17 14:53:58 CDT 2018
Module: wine
Branch: master
Commit: 77013e97960e10a7e0ea4dd7e239dc0668d54f48
URL: https://source.winehq.org/git/wine.git/?a=commit;h=77013e97960e10a7e0ea4dd7e239dc0668d54f48
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Apr 17 11:22:52 2018 +0200
user32: Reimplement AdjustWindowRectEx using NONCLIENTMETRICSW.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/nonclient.c | 100 +++++++++---------------------------------------
dlls/user32/tests/win.c | 32 +++++++---------
2 files changed, 33 insertions(+), 99 deletions(-)
diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c
index 3f3d96a..1bdb823 100644
--- a/dlls/user32/nonclient.c
+++ b/dlls/user32/nonclient.c
@@ -55,54 +55,22 @@ WINE_DEFAULT_DEBUG_CHANNEL(nonclient);
(((exStyle) & (WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) == \
WS_EX_STATICEDGE)
-#define HAS_ANYFRAME(style,exStyle) \
- (((style) & (WS_THICKFRAME | WS_DLGFRAME | WS_BORDER)) || \
- ((exStyle) & WS_EX_DLGMODALFRAME) || \
- !((style) & (WS_CHILD | WS_POPUP)))
-
#define HAS_MENU(hwnd,style) ((((style) & (WS_CHILD | WS_POPUP)) != WS_CHILD) && GetMenu(hwnd))
-/******************************************************************************
- * NC_AdjustRectOuter
- *
- * Computes the size of the "outside" parts of the window based on the
- * parameters of the client area.
- *
- * PARAMS
- * LPRECT rect
- * DWORD style
- * BOOL menu
- * DWORD exStyle
- *
- * NOTES
- * "Outer" parts of a window means the whole window frame, caption and
- * menu bar. It does not include "inner" parts of the frame like client
- * edge, static edge or scroll bars.
- *
- *****************************************************************************/
-
-static void
-NC_AdjustRectOuter (LPRECT rect, DWORD style, BOOL menu, DWORD exStyle)
+static void adjust_window_rect( RECT *rect, DWORD style, BOOL menu, DWORD exStyle, NONCLIENTMETRICSW *ncm )
{
- int adjust;
+ int adjust = 0;
- if ((exStyle & (WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) ==
- WS_EX_STATICEDGE)
- {
+ if ((exStyle & (WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) == WS_EX_STATICEDGE)
adjust = 1; /* for the outer frame always present */
- }
- else
- {
- adjust = 0;
- if ((exStyle & WS_EX_DLGMODALFRAME) ||
- (style & (WS_THICKFRAME|WS_DLGFRAME))) adjust = 2; /* outer */
- }
+ else if ((exStyle & WS_EX_DLGMODALFRAME) || (style & (WS_THICKFRAME|WS_DLGFRAME)))
+ adjust = 2; /* outer */
+
if (style & WS_THICKFRAME)
- adjust += ( GetSystemMetrics (SM_CXFRAME)
- - GetSystemMetrics (SM_CXDLGFRAME)); /* The resize border */
- if ((style & (WS_BORDER|WS_DLGFRAME)) ||
- (exStyle & WS_EX_DLGMODALFRAME))
+ 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);
@@ -110,50 +78,17 @@ NC_AdjustRectOuter (LPRECT rect, DWORD style, BOOL menu, DWORD exStyle)
if ((style & WS_CAPTION) == WS_CAPTION)
{
if (exStyle & WS_EX_TOOLWINDOW)
- rect->top -= GetSystemMetrics(SM_CYSMCAPTION);
+ rect->top -= ncm->iSmCaptionHeight + 1;
else
- rect->top -= GetSystemMetrics(SM_CYCAPTION);
+ rect->top -= ncm->iCaptionHeight + 1;
}
- if (menu) rect->top -= GetSystemMetrics(SM_CYMENU);
-}
+ if (menu) rect->top -= ncm->iMenuHeight + 1;
-
-/******************************************************************************
- * NC_AdjustRectInner
- *
- * Computes the size of the "inside" part of the window based on the
- * parameters of the client area.
- *
- * PARAMS
- * LPRECT rect
- * DWORD style
- * DWORD exStyle
- *
- * NOTES
- * "Inner" part of a window means the window frame inside of the flat
- * window frame. It includes the client edge, the static edge and the
- * scroll bars.
- *
- *****************************************************************************/
-
-static void
-NC_AdjustRectInner (LPRECT rect, DWORD style, DWORD exStyle)
-{
if (exStyle & WS_EX_CLIENTEDGE)
InflateRect(rect, GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE));
-
- if (style & WS_VSCROLL)
- {
- if((exStyle & WS_EX_LEFTSCROLLBAR) != 0)
- rect->left -= GetSystemMetrics(SM_CXVSCROLL);
- else
- rect->right += GetSystemMetrics(SM_CXVSCROLL);
- }
- if (style & WS_HSCROLL) rect->bottom += GetSystemMetrics(SM_CYHSCROLL);
}
-
static HICON NC_IconForWindow( HWND hwnd )
{
HICON hIcon = 0;
@@ -378,13 +313,16 @@ BOOL WINAPI DECLSPEC_HOTPATCH AdjustWindowRect( LPRECT rect, DWORD style, BOOL m
*/
BOOL WINAPI DECLSPEC_HOTPATCH AdjustWindowRectEx( LPRECT rect, DWORD style, BOOL menu, DWORD exStyle )
{
+ NONCLIENTMETRICSW ncm;
+
if (style & WS_MINIMIZE) return TRUE;
- style &= ~(WS_HSCROLL | WS_VSCROLL);
TRACE("(%s) %08x %d %08x\n", wine_dbgstr_rect(rect), style, menu, exStyle );
- NC_AdjustRectOuter( rect, style, menu, exStyle );
- NC_AdjustRectInner( rect, style, exStyle );
+ ncm.cbSize = sizeof(ncm);
+ SystemParametersInfoW( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0 );
+
+ adjust_window_rect( rect, style, menu, exStyle, &ncm );
return TRUE;
}
@@ -411,7 +349,7 @@ LRESULT NC_HandleNCCalcSize( HWND hwnd, WPARAM wparam, RECT *winRect )
if (!(style & WS_MINIMIZE))
{
- NC_AdjustRectOuter( &tmpRect, style, FALSE, exStyle );
+ AdjustWindowRectEx( &tmpRect, style, FALSE, exStyle & ~WS_EX_CLIENTEDGE);
winRect->left -= tmpRect.left;
winRect->top -= tmpRect.top;
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index e8d0b0f..61bb736 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -1014,23 +1014,19 @@ static void FixedAdjustWindowRectEx(RECT* rc, LONG style, BOOL menu, LONG exstyl
/* reimplement it to check that the Wine algorithm gives the correct result */
static void wine_AdjustWindowRectEx( RECT *rect, LONG style, BOOL menu, LONG exStyle )
{
- int adjust;
+ NONCLIENTMETRICSW ncm;
+ int adjust = 0;
- if ((exStyle & (WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) ==
- WS_EX_STATICEDGE)
- {
+ ncm.cbSize = offsetof( NONCLIENTMETRICSW, iPaddedBorderWidth );
+ SystemParametersInfoW( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0 );
+
+ if ((exStyle & (WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) == WS_EX_STATICEDGE)
adjust = 1; /* for the outer frame always present */
- }
- else
- {
- adjust = 0;
- if ((exStyle & WS_EX_DLGMODALFRAME) ||
- (style & (WS_THICKFRAME|WS_DLGFRAME))) adjust = 2; /* outer */
- }
- if (style & WS_THICKFRAME)
- adjust += GetSystemMetrics(SM_CXFRAME) - GetSystemMetrics(SM_CXDLGFRAME); /* The resize border */
- if ((style & (WS_BORDER|WS_DLGFRAME)) ||
- (exStyle & WS_EX_DLGMODALFRAME))
+ else if ((exStyle & WS_EX_DLGMODALFRAME) || (style & (WS_THICKFRAME|WS_DLGFRAME)))
+ adjust = 2; /* outer */
+
+ if (style & WS_THICKFRAME) adjust += ncm.iBorderWidth; /* The resize border */
+ if ((style & (WS_BORDER|WS_DLGFRAME)) || (exStyle & WS_EX_DLGMODALFRAME))
adjust++; /* The other border */
InflateRect (rect, adjust, adjust);
@@ -1038,11 +1034,11 @@ static void wine_AdjustWindowRectEx( RECT *rect, LONG style, BOOL menu, LONG exS
if ((style & WS_CAPTION) == WS_CAPTION)
{
if (exStyle & WS_EX_TOOLWINDOW)
- rect->top -= GetSystemMetrics(SM_CYSMCAPTION);
+ rect->top -= ncm.iSmCaptionHeight + 1;
else
- rect->top -= GetSystemMetrics(SM_CYCAPTION);
+ rect->top -= ncm.iCaptionHeight + 1;
}
- if (menu) rect->top -= GetSystemMetrics(SM_CYMENU);
+ if (menu) rect->top -= ncm.iMenuHeight + 1;
if (exStyle & WS_EX_CLIENTEDGE)
InflateRect(rect, GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE));
More information about the wine-cvs
mailing list