From 8c8c39c948e02efedfb2b1fe72318f39c3aee819 Mon Sep 17 00:00:00 2001 From: Viktor Arvidsson Date: Mon, 31 Jan 2022 19:59:37 +0100 Subject: Windows QPA: Fix frameless maximize on secondary screens MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Frameless windows shouldn't cover the taskbar when maximized. This has been fixed for the main screen in the past but did not work for secondary screens. According to the code the MINMAXINFO is only available for the main screen but I believe this is a misunderstanding of the Windows documentation. Besides we use QScreen::availableGeometry() which seems to be correct. Fixes: QTBUG-51327 Change-Id: Ib2205c480359d1a870dcfcf0312fbe417f650e28 Reviewed-by: Morten Johan Sørvig (cherry picked from commit 46e9852a1d04357c98b2c62338e1e2af0de9b486) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/platforms/windows/qwindowswindow.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'src/plugins/platforms/windows/qwindowswindow.cpp') diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 991a3a8e91..186d9fe44b 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -2683,32 +2683,30 @@ void QWindowsWindow::getSizeHints(MINMAXINFO *mmi) const // This block fixes QTBUG-8361, QTBUG-4362: Frameless/title-less windows shouldn't cover the // taskbar when maximized - if ((testFlag(WithinMaximize) || window()->windowStates().testFlag(Qt::WindowMinimized)) - && (m_data.flags.testFlag(Qt::FramelessWindowHint) - || (m_data.flags.testFlag(Qt::CustomizeWindowHint) && !m_data.flags.testFlag(Qt::WindowTitleHint)))) { - const QScreen *screen = window()->screen(); - - // Documentation of MINMAXINFO states that it will only work for the primary screen - if (screen && screen == QGuiApplication::primaryScreen()) { - const QRect availableGeometry = QHighDpi::toNativePixels(screen->availableGeometry(), screen); + if (m_data.flags.testFlag(Qt::FramelessWindowHint) + || (m_data.flags.testFlag(Qt::CustomizeWindowHint) && !m_data.flags.testFlag(Qt::WindowTitleHint))) { + if (QPlatformScreen *currentScreen = screen()) { + const QRect geometry = currentScreen->geometry(); + const QRect availableGeometry = currentScreen->availableGeometry(); mmi->ptMaxSize.y = availableGeometry.height(); // Width, because you can have the taskbar on the sides too. mmi->ptMaxSize.x = availableGeometry.width(); // If you have the taskbar on top, or on the left you don't want it at (0,0): - mmi->ptMaxPosition.x = availableGeometry.x(); - mmi->ptMaxPosition.y = availableGeometry.y(); + QPoint availablePositionDiff = geometry.topLeft() - availableGeometry.topLeft(); + mmi->ptMaxPosition.x = availablePositionDiff.x(); + mmi->ptMaxPosition.y = availablePositionDiff.y(); if (!m_data.flags.testFlag(Qt::FramelessWindowHint)) { - const int borderWidth = getBorderWidth(screen->handle()); + const int borderWidth = getBorderWidth(currentScreen); mmi->ptMaxSize.x += borderWidth * 2; mmi->ptMaxSize.y += borderWidth * 2; mmi->ptMaxTrackSize = mmi->ptMaxSize; mmi->ptMaxPosition.x -= borderWidth; mmi->ptMaxPosition.y -= borderWidth; } - } else if (!screen){ - qWarning("window()->screen() returned a null screen"); + } else { + qWarning("screen() returned a null screen"); } } -- cgit v1.2.3