From 7baaec17edb06634f1d6235a55c7adbd112cba3e Mon Sep 17 00:00:00 2001 From: Alexander Volkov Date: Thu, 26 Feb 2015 16:16:56 +0300 Subject: Fix use of the window geometry specification Until now we applied the geometry in QWidget::setVisible() by calling QWidget::move() and QWidget::resize(). But these methods are unreliable when the window is created but not visible yet. For example, specifying the window position by "-geometry +0+0" will take no effect. Apply the geometry directly to QWindow in QWindow::setVisible(). QWidget will update its geometry after the response of the window system. Besides it allows to specify the geometry for QML applications. Task-number: QTBUG-44713 Change-Id: I9a0e110e81e569c81da802729707fec104fef887 Reviewed-by: Friedemann Kleint Reviewed-by: Shawn Rutledge --- src/gui/kernel/qguiapplication.cpp | 26 +++++++++++++------------- src/gui/kernel/qguiapplication_p.h | 2 +- src/gui/kernel/qwindow.cpp | 7 +++++++ 3 files changed, 21 insertions(+), 14 deletions(-) (limited to 'src/gui') diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 42b80846eb..a3ac0ff189 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -226,9 +226,7 @@ struct QWindowGeometrySpecification { QWindowGeometrySpecification() : corner(Qt::TopLeftCorner), xOffset(-1), yOffset(-1), width(-1), height(-1) {} static QWindowGeometrySpecification fromArgument(const QByteArray &a); - QRect apply(const QRect &windowGeometry, const QSize &windowMinimumSize, const QSize &windowMaximumSize, const QRect &availableGeometry) const; - inline QRect apply(const QRect &windowGeometry, const QWindow *window) const - { return apply(windowGeometry, window->minimumSize(), window->maximumSize(), window->screen()->virtualGeometry()); } + void applyTo(QWindow *window) const; Qt::Corner corner; int xOffset; @@ -290,32 +288,34 @@ QWindowGeometrySpecification QWindowGeometrySpecification::fromArgument(const QB return result; } -QRect QWindowGeometrySpecification::apply(const QRect &windowGeometry, const QSize &windowMinimumSize, const QSize &windowMaximumSize, const QRect &availableGeometry) const +void QWindowGeometrySpecification::applyTo(QWindow *window) const { - QRect result = windowGeometry; + QRect windowGeometry = window->frameGeometry(); + QSize size = windowGeometry.size(); if (width >= 0 || height >= 0) { - QSize size = windowGeometry.size(); + const QSize windowMinimumSize = window->minimumSize(); + const QSize windowMaximumSize = window->maximumSize(); if (width >= 0) size.setWidth(qBound(windowMinimumSize.width(), width, windowMaximumSize.width())); if (height >= 0) size.setHeight(qBound(windowMinimumSize.height(), height, windowMaximumSize.height())); - result.setSize(size); + window->resize(size); } if (xOffset >= 0 || yOffset >= 0) { + const QRect availableGeometry = window->screen()->virtualGeometry(); QPoint topLeft = windowGeometry.topLeft(); if (xOffset >= 0) { topLeft.setX(corner == Qt::TopLeftCorner || corner == Qt::BottomLeftCorner ? xOffset : - qMax(availableGeometry.right() - result.width() - xOffset, availableGeometry.left())); + qMax(availableGeometry.right() - size.width() - xOffset, availableGeometry.left())); } if (yOffset >= 0) { topLeft.setY(corner == Qt::TopLeftCorner || corner == Qt::TopRightCorner ? yOffset : - qMax(availableGeometry.bottom() - result.height() - yOffset, availableGeometry.top())); + qMax(availableGeometry.bottom() - size.height() - yOffset, availableGeometry.top())); } - result.moveTopLeft(topLeft); + window->setFramePosition(topLeft); } - return result; } static QWindowGeometrySpecification windowGeometrySpecification; @@ -2730,9 +2730,9 @@ void QGuiApplication::setPalette(const QPalette &pal) emit qGuiApp->paletteChanged(*QGuiApplicationPrivate::app_pal); } -QRect QGuiApplicationPrivate::applyWindowGeometrySpecification(const QRect &windowGeometry, const QWindow *window) +void QGuiApplicationPrivate::applyWindowGeometrySpecificationTo(QWindow *window) { - return windowGeometrySpecification.apply(windowGeometry, window); + windowGeometrySpecification.applyTo(window); } /*! diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index eed3d5c10e..c57d1d8080 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -277,7 +277,7 @@ public: virtual void notifyWindowIconChanged(); - static QRect applyWindowGeometrySpecification(const QRect &windowGeometry, const QWindow *window); + static void applyWindowGeometrySpecificationTo(QWindow *window); static void setApplicationState(Qt::ApplicationState state, bool forcePropagate = false); diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index ad17621f9d..6561e0f502 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -487,6 +487,13 @@ void QWindow::setVisible(bool visible) } if (!app_priv->forcedWindowIcon.isNull()) setIcon(app_priv->forcedWindowIcon); + + // Handling of the -qwindowgeometry, -geometry command line arguments + static bool geometryApplied = false; + if (!geometryApplied) { + geometryApplied = true; + QGuiApplicationPrivate::applyWindowGeometrySpecificationTo(this); + } } QShowEvent showEvent; -- cgit v1.2.3