https://git.reactos.org/?p=reactos.git;a=commitdiff;h=cc3ba6e41cd53c022fb9e…
commit cc3ba6e41cd53c022fb9e393c5602611063cb251
Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Mon Jul 9 21:52:30 2018 +0900
Commit: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito(a)reactos.org>
CommitDate: Mon Jul 9 14:52:30 2018 +0200
[USER32][WIN32SS] Improve CascadeWindows function (#677)
If the window is too large, then shrink it if possible.
CORE-14807
---
win32ss/user/user32/windows/mdi.c | 57 ++++++++++++++++++++++++++++++++-------
1 file changed, 47 insertions(+), 10 deletions(-)
diff --git a/win32ss/user/user32/windows/mdi.c b/win32ss/user/user32/windows/mdi.c
index 38ee4af264..5e892de252 100644
--- a/win32ss/user/user32/windows/mdi.c
+++ b/win32ss/user/user32/windows/mdi.c
@@ -2047,6 +2047,22 @@ GetCascadeChildProc(HWND hwnd, LPARAM lParam)
return TRUE;
}
+static void
+QuerySizeFix(HWND hwnd, LPINT pcx, LPINT pcy)
+{
+ MINMAXINFO mmi;
+ DWORD_PTR dwResult;
+
+ mmi.ptMinTrackSize.x = mmi.ptMinTrackSize.y = 0;
+ mmi.ptMaxTrackSize.x = mmi.ptMaxTrackSize.y = MAXLONG;
+ if (SendMessageTimeoutW(hwnd, WM_GETMINMAXINFO, 0, (LPARAM)&mmi,
+ SMTO_ABORTIFHUNG | SMTO_NORMAL, 120, &dwResult))
+ {
+ *pcx = min(max(*pcx, mmi.ptMinTrackSize.x), mmi.ptMaxTrackSize.x);
+ *pcy = min(max(*pcy, mmi.ptMinTrackSize.y), mmi.ptMaxTrackSize.y);
+ }
+}
+
WORD WINAPI
CascadeWindows(HWND hwndParent, UINT wFlags, LPCRECT lpRect,
UINT cKids, const HWND *lpKids)
@@ -2057,8 +2073,9 @@ CascadeWindows(HWND hwndParent, UINT wFlags, LPCRECT lpRect,
MONITORINFO mi;
RECT rcWork, rcWnd;
DWORD i, ret = 0;
- INT x, y, cx, cy, dx, dy;
+ INT x, y, cx, cy, cxNew, cyNew, cxWork, cyWork, dx, dy;
HDWP hDWP;
+ POINT pt;
TRACE("(%p,0x%08x,...,%u,...)\n", hwndParent, wFlags, cKids);
@@ -2098,7 +2115,8 @@ CascadeWindows(HWND hwndParent, UINT wFlags, LPCRECT lpRect,
}
else
{
- hMon = MonitorFromWindow(hwndParent, MONITOR_DEFAULTTONEAREST);
+ pt.x = pt.y = 0;
+ hMon = MonitorFromPoint(pt, MONITOR_DEFAULTTOPRIMARY);
mi.cbSize = sizeof(mi);
GetMonitorInfoW(hMon, &mi);
rcWork = mi.rcWork;
@@ -2112,30 +2130,49 @@ CascadeWindows(HWND hwndParent, UINT wFlags, LPCRECT lpRect,
y = rcWork.top;
dx = GetSystemMetrics(SM_CXSIZEFRAME) + GetSystemMetrics(SM_CXSIZE);
dy = GetSystemMetrics(SM_CYSIZEFRAME) + GetSystemMetrics(SM_CYSIZE);
+ cxWork = rcWork.right - rcWork.left;
+ cyWork = rcWork.bottom - rcWork.top;
hwndPrev = NULL;
for (i = info.chwnd; i > 0;) /* in reverse order */
{
--i;
hwnd = info.ahwnd[i];
+ if (!IsWindowVisible(hwnd) || IsIconic(hwnd))
+ continue;
+
+ if ((info.wFlags & MDITILE_SKIPDISABLED) && !IsWindowEnabled(hwnd))
+ continue;
+
if (IsZoomed(hwnd))
ShowWindow(hwnd, SW_RESTORE | SW_SHOWNA);
GetWindowRect(hwnd, &rcWnd);
- cx = rcWnd.right - rcWnd.left;
- cy = rcWnd.bottom - rcWnd.top;
+ cxNew = cx = rcWnd.right - rcWnd.left;
+ cyNew = cy = rcWnd.bottom - rcWnd.top;
+
+ /* if we can change the window size and it is not only one */
+ if (info.chwnd != 1 && (GetWindowLongPtrW(hwnd, GWL_STYLE) &
WS_THICKFRAME))
+ {
+ /* check the size */
+#define THRESHOLD(xy) (((xy) * 5) / 7) /* in the rate 5/7 */
+ cxNew = min(cxNew, THRESHOLD(cxWork));
+ cyNew = min(cyNew, THRESHOLD(cyWork));
+#undef THRESHOLD
+ if (cx != cxNew || cy != cyNew)
+ {
+ /* too large. shrink if we can */
+ QuerySizeFix(hwnd, &cxNew, &cyNew);
+ cx = cxNew;
+ cy = cyNew;
+ }
+ }
if (x + cx > rcWork.right)
x = rcWork.left;
if (y + cy > rcWork.bottom)
y = rcWork.top;
- if (!IsWindowVisible(hwnd) || IsIconic(hwnd))
- continue;
-
- if ((info.wFlags & MDITILE_SKIPDISABLED) && !IsWindowEnabled(hwnd))
- continue;
-
hDWP = DeferWindowPos(hDWP, hwnd, HWND_TOP, x, y, cx, cy, SWP_NOACTIVATE);
if (hDWP == NULL)
{