diff options
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 26 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication_p.h | 2 | ||||
-rw-r--r-- | src/gui/kernel/qwindow.cpp | 7 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 17 |
4 files changed, 22 insertions, 30 deletions
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; diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index cb2e9e0bec..637afb3888 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -8029,28 +8029,13 @@ void QWidget::setVisible(bool visible) && !parentWidget()->testAttribute(Qt::WA_WState_Created)) parentWidget()->window()->d_func()->createRecursively(); - //we have to at least create toplevels before applyX11SpecificCommandLineArguments - //but not children of non-visible parents + //create toplevels but not children of non-visible parents QWidget *pw = parentWidget(); if (!testAttribute(Qt::WA_WState_Created) && (isWindow() || pw->testAttribute(Qt::WA_WState_Created))) { create(); } - // Handling of the -qwindowgeometry, -geometry command line arguments - if (windowType() == Qt::Window && windowHandle()) { - static bool done = false; - if (!done) { - done = true; - const QRect oldGeometry = frameGeometry(); - const QRect geometry = QGuiApplicationPrivate::applyWindowGeometrySpecification(oldGeometry, windowHandle()); - if (oldGeometry.size() != geometry.size()) - resize(geometry.size()); - if (geometry.topLeft() != oldGeometry.topLeft()) - move(geometry.topLeft()); - } // done - } - bool wasResized = testAttribute(Qt::WA_Resized); Qt::WindowStates initialWindowState = windowState(); |