[Win32SS] Fix maximized window positioning.

Fix CORE-5177 TaskMgr and ProcExp possionong when maximized.
This commit is contained in:
jimtabor 2019-03-26 15:56:57 -05:00
parent 1fe58c4058
commit 1f619b2781
2 changed files with 58 additions and 46 deletions

View file

@ -888,14 +888,14 @@ UserGetWindowBorders(DWORD Style, DWORD ExStyle, SIZE *Size, BOOL WithClient)
if (UserHasWindowEdge(Style, ExStyle)) if (UserHasWindowEdge(Style, ExStyle))
Border += 2; Border += 2;
else if (ExStyle & WS_EX_STATICEDGE) else if ((ExStyle & (WS_EX_STATICEDGE|WS_EX_DLGMODALFRAME)) == WS_EX_STATICEDGE)
Border += 1; Border += 1; /* for the outer frame always present */
if ((ExStyle & WS_EX_CLIENTEDGE) && WithClient) if ((ExStyle & WS_EX_CLIENTEDGE) && WithClient)
Border += 2; Border += 2;
if (Style & WS_CAPTION || ExStyle & WS_EX_DLGMODALFRAME) if (Style & WS_CAPTION || ExStyle & WS_EX_DLGMODALFRAME)
Border ++; Border ++; /* The other border */
Size->cx = Size->cy = Border; Size->cx = Size->cy = Border;
if ((Style & WS_THICKFRAME) && !(Style & WS_MINIMIZE)) if ((Style & WS_THICKFRAME) && !(Style & WS_MINIMIZE)) /* The resize border */
{ {
Size->cx += UserGetSystemMetrics(SM_CXFRAME) - UserGetSystemMetrics(SM_CXDLGFRAME); Size->cx += UserGetSystemMetrics(SM_CXFRAME) - UserGetSystemMetrics(SM_CXDLGFRAME);
Size->cy += UserGetSystemMetrics(SM_CYFRAME) - UserGetSystemMetrics(SM_CYDLGFRAME); Size->cy += UserGetSystemMetrics(SM_CYFRAME) - UserGetSystemMetrics(SM_CYDLGFRAME);
@ -904,32 +904,27 @@ UserGetWindowBorders(DWORD Style, DWORD ExStyle, SIZE *Size, BOOL WithClient)
Size->cy *= UserGetSystemMetrics(SM_CYBORDER); Size->cy *= UserGetSystemMetrics(SM_CYBORDER);
} }
BOOL WINAPI //
UserAdjustWindowRectEx(LPRECT lpRect, // Fix CORE-5177
DWORD dwStyle, // See winetests:user32:win.c:wine_AdjustWindowRectEx,
BOOL bMenu, // Simplified version.
DWORD dwExStyle) //
DWORD IntGetWindowBorders(DWORD Style, DWORD ExStyle)
{ {
SIZE BorderSize; DWORD adjust = 0;
if (bMenu) if ( ExStyle & WS_EX_WINDOWEDGE ) // 1st
{ adjust = 2; /* outer */
lpRect->top -= UserGetSystemMetrics(SM_CYMENU); else if ( ExStyle & WS_EX_STATICEDGE ) // 2nd
} adjust = 1; /* for the outer frame always present */
if ((dwStyle & WS_CAPTION) == WS_CAPTION)
{
if (dwExStyle & WS_EX_TOOLWINDOW)
lpRect->top -= UserGetSystemMetrics(SM_CYSMCAPTION);
else
lpRect->top -= UserGetSystemMetrics(SM_CYCAPTION);
}
UserGetWindowBorders(dwStyle, dwExStyle, &BorderSize, TRUE);
RECTL_vInflateRect(
lpRect,
BorderSize.cx,
BorderSize.cy);
return TRUE; if (ExStyle & WS_EX_CLIENTEDGE)
adjust += 2;
if ( Style & WS_CAPTION || ExStyle & WS_EX_DLGMODALFRAME )
adjust++; /* The other border */
return adjust;
} }
UINT FASTCALL UINT FASTCALL
@ -943,6 +938,7 @@ co_WinPosGetMinMaxInfo(PWND Window, POINT* MaxSize, POINT* MaxPos,
LONG adjustedStyle; LONG adjustedStyle;
LONG exstyle = Window->ExStyle; LONG exstyle = Window->ExStyle;
RECT rc; RECT rc;
DWORD adjust;
ASSERT_REFS_CO(Window); ASSERT_REFS_CO(Window);
@ -957,9 +953,22 @@ co_WinPosGetMinMaxInfo(PWND Window, POINT* MaxSize, POINT* MaxPos,
else else
adjustedStyle = style; adjustedStyle = style;
if(Window->spwndParent) if (Window->spwndParent)
IntGetClientRect(Window->spwndParent, &rc); IntGetClientRect(Window->spwndParent, &rc);
UserAdjustWindowRectEx(&rc, adjustedStyle, ((style & WS_POPUP) && Window->IDMenu), exstyle);
adjust = IntGetWindowBorders(adjustedStyle, exstyle);
xinc = yinc = adjust;
if ((adjustedStyle & WS_THICKFRAME) && (adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
{
xinc += UserGetSystemMetrics(SM_CXFRAME) - UserGetSystemMetrics(SM_CXDLGFRAME);
yinc += UserGetSystemMetrics(SM_CYFRAME) - UserGetSystemMetrics(SM_CYDLGFRAME);
}
RECTL_vInflateRect( &rc,
xinc * UserGetSystemMetrics(SM_CXBORDER),
yinc * UserGetSystemMetrics(SM_CYBORDER) );
xinc = -rc.left; xinc = -rc.left;
yinc = -rc.top; yinc = -rc.top;
@ -1011,7 +1020,9 @@ co_WinPosGetMinMaxInfo(PWND Window, POINT* MaxSize, POINT* MaxPos,
} }
if (MinMax.ptMaxSize.x >= (monitor->rcMonitor.right - monitor->rcMonitor.left) && if (MinMax.ptMaxSize.x >= (monitor->rcMonitor.right - monitor->rcMonitor.left) &&
MinMax.ptMaxSize.y >= (monitor->rcMonitor.bottom - monitor->rcMonitor.top) ) MinMax.ptMaxSize.y >= (monitor->rcMonitor.bottom - monitor->rcMonitor.top) )
{
Window->state |= WNDS_MAXIMIZESTOMONITOR; Window->state |= WNDS_MAXIMIZESTOMONITOR;
}
else else
Window->state &= ~WNDS_MAXIMIZESTOMONITOR; Window->state &= ~WNDS_MAXIMIZESTOMONITOR;
} }
@ -1031,7 +1042,7 @@ co_WinPosGetMinMaxInfo(PWND Window, POINT* MaxSize, POINT* MaxPos,
if (MaxTrack) if (MaxTrack)
*MaxTrack = MinMax.ptMaxTrackSize; *MaxTrack = MinMax.ptMaxTrackSize;
return 0; // FIXME: What does it return? return 0; // FIXME: What does it return? Wine returns MINMAXINFO.
} }
static static

View file

@ -22,6 +22,7 @@ void mirror_rect( const RECT *window_rect, RECT *rect )
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
#if 0 // Keep legacy code. Moved to Win32k:NtUser:WinPos.c.
#define EMPTYPOINT(pt) ((pt).x == -1 && (pt).y == -1) #define EMPTYPOINT(pt) ((pt).x == -1 && (pt).y == -1)
UINT WINAPI UINT WINAPI
@ -126,9 +127,9 @@ WinPosGetMinMaxInfo(HWND hwnd, POINT* maxSize, POINT* maxPos,
if (minTrack) *minTrack = MinMax.ptMinTrackSize; if (minTrack) *minTrack = MinMax.ptMinTrackSize;
if (maxTrack) *maxTrack = MinMax.ptMaxTrackSize; if (maxTrack) *maxTrack = MinMax.ptMaxTrackSize;
return 0; //FIXME: what does it return? return 0; //FIXME: what does it return? Wine returns MINMAXINFO.
} }
#endif
/* /*
* @implemented * @implemented