Windows QPA: Fix frameless maximize on secondary screens
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 Pick-to: 5.15 6.2 6.3 Change-Id: Ib2205c480359d1a870dcfcf0312fbe417f650e28 Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This commit is contained in:
parent
cc70c397ce
commit
46e9852a1d
@ -2833,32 +2833,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");
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user