From dca6baee49e70ce4f215023fd68a4a76b09965a3 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Sat, 14 Oct 2023 16:44:21 +0300 Subject: [PATCH] Use and store restored window position after minimizing the window --- Source/Editor/Modules/WindowsModule.cs | 10 ++----- .../Engine/Platform/Windows/WindowsWindow.cpp | 28 +++++++++++++++++++ .../Engine/Platform/Windows/WindowsWindow.h | 1 + 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/Source/Editor/Modules/WindowsModule.cs b/Source/Editor/Modules/WindowsModule.cs index 826d57285..1a4f5ce9e 100644 --- a/Source/Editor/Modules/WindowsModule.cs +++ b/Source/Editor/Modules/WindowsModule.cs @@ -472,19 +472,13 @@ namespace FlaxEditor.Modules { writer.WriteStartElement("Bounds"); { - var isMaximized = win.IsMaximized; - var isMinimized = win.IsMinimized; - if (isMinimized) - win.Restore(); // Restore window back to desktop to get proper client bounds var bounds = win.ClientBounds; - if (isMinimized) - win.Minimize(); writer.WriteAttributeString("X", bounds.X.ToString(CultureInfo.InvariantCulture)); writer.WriteAttributeString("Y", bounds.Y.ToString(CultureInfo.InvariantCulture)); writer.WriteAttributeString("Width", bounds.Width.ToString(CultureInfo.InvariantCulture)); writer.WriteAttributeString("Height", bounds.Height.ToString(CultureInfo.InvariantCulture)); - writer.WriteAttributeString("IsMaximized", isMaximized.ToString()); - writer.WriteAttributeString("IsMinimized", isMinimized.ToString()); + writer.WriteAttributeString("IsMaximized", win.IsMaximized.ToString()); + writer.WriteAttributeString("IsMinimized", win.IsMinimized.ToString()); } writer.WriteEndElement(); } diff --git a/Source/Engine/Platform/Windows/WindowsWindow.cpp b/Source/Engine/Platform/Windows/WindowsWindow.cpp index fb9fbe09d..ff65e9864 100644 --- a/Source/Engine/Platform/Windows/WindowsWindow.cpp +++ b/Source/Engine/Platform/Windows/WindowsWindow.cpp @@ -532,6 +532,12 @@ Float2 WindowsWindow::ClientToScreen(const Float2& clientPos) const { ASSERT(HasHWND()); + if (_minimized) + { + // Return cached position when window is not on screen + return _minimizedScreenPosition + clientPos; + } + POINT p; p.x = static_cast(clientPos.X); p.y = static_cast(clientPos.Y); @@ -1109,6 +1115,28 @@ LRESULT WindowsWindow::WndProc(UINT msg, WPARAM wParam, LPARAM lParam) { if (SIZE_MINIMIZED == wParam) { + // Get the minimized window position in workspace coordinates + WINDOWPLACEMENT placement; + placement.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(_handle, &placement); + + // Calculate client offsets from window borders and title bar + RECT winRect = { 0, 0, static_cast(_clientSize.X), static_cast(_clientSize.Y) }; + LONG style = GetWindowLong(_handle, GWL_STYLE); + LONG exStyle = GetWindowLong(_handle, GWL_EXSTYLE); + AdjustWindowRectEx(&winRect, style, FALSE, exStyle); + + // Calculate monitor offsets from taskbar position + const HMONITOR monitor = MonitorFromWindow(_handle, MONITOR_DEFAULTTONEAREST); + MONITORINFO monitorInfo; + monitorInfo.cbSize = sizeof(MONITORINFO); + GetMonitorInfoW(monitor, &monitorInfo); + + // Convert the workspace coordinates to screen space and store it + _minimizedScreenPosition = Float2( + static_cast(placement.rcNormalPosition.left + monitorInfo.rcWork.left - monitorInfo.rcMonitor.left - winRect.left), + static_cast(placement.rcNormalPosition.top + monitorInfo.rcWork.top - monitorInfo.rcMonitor.top - winRect.top)); + _minimized = true; _maximized = false; } diff --git a/Source/Engine/Platform/Windows/WindowsWindow.h b/Source/Engine/Platform/Windows/WindowsWindow.h index e15f86a45..186793b1e 100644 --- a/Source/Engine/Platform/Windows/WindowsWindow.h +++ b/Source/Engine/Platform/Windows/WindowsWindow.h @@ -32,6 +32,7 @@ private: Windows::HANDLE _monitor = nullptr; Windows::LONG _clipCursorRect[4]; int32 _regionWidth = 0, _regionHeight = 0; + Float2 _minimizedScreenPosition = Float2::Zero; public: