public void resizeWindowToZone(SystemWindow window, WindowZone zone, int?rectangleInZone = null) { FormWindowState oldWindowState = window.WindowState; if (!window.Resizable && oldWindowState != FormWindowState.Maximized) { return; } if (oldWindowState == FormWindowState.Maximized) { rectangleInZone = 0; } IList <Rect> proportionalRectanglesForZone = getProportionalRectanglesForZone(zone).ToList(); RECT windowPadding = windowResizer.getWindowPadding(window); Rect proportionalRectangleToResizeTo; Rectangle workingArea = Screen.PrimaryScreen.WorkingArea; if (rectangleInZone != null) { proportionalRectangleToResizeTo = proportionalRectanglesForZone[rectangleInZone.Value]; } else { WindowZoneSearchResult closestZoneRectangleToOldWindowPosition = findClosestZoneRectangleToWindow(windowResizer.shrinkRectangle(window.Position, windowPadding), workingArea, zone); int zoneRectangleIndex = closestZoneRectangleToOldWindowPosition switch { { distance : <= RECTANGLE_DISTANCE_SAME } r => (r.zoneRectangleIndex + 1) % proportionalRectanglesForZone.Count, { distance : <= RECTANGLE_DISTANCE_CLOSE } r => r.zoneRectangleIndex, _ => 0 }; proportionalRectangleToResizeTo = proportionalRectanglesForZone[zoneRectangleIndex]; } RECT newPositionRelativeToWorkingArea = convertProportionalRectangleToActualRectangle(proportionalRectangleToResizeTo, workingArea); RECT newPositionRelativeToScreen = windowResizer.getRelativePosition(newPositionRelativeToWorkingArea, workingArea.Location); RECT newPositionWithPaddingRemoved = windowResizer.enlargeRectangle(newPositionRelativeToScreen, windowPadding); // LOGGER.Debug( // $"Moving {window.Process.ProcessName} to [top={newPositionRelativeToScreen.Top}, bottom={newPositionRelativeToScreen.Bottom}, left={newPositionRelativeToScreen.Left}, right={newPositionRelativeToScreen.Right}, width={newPositionRelativeToScreen.Width}, height={newPositionRelativeToScreen.Height}], accounting for window padding of {windowPadding.toString()}"); if (oldWindowState == FormWindowState.Maximized) { window.WindowState = FormWindowState.Normal; } windowResizer.moveWindowToPosition(window, newPositionWithPaddingRemoved); }