Cocoa: Make sure that resizeEvent is invoked after calling resize

The QWindow::resizeEvent documentation states that resizeEvent
is invoked after the windowing system has acknowledged a
setGeometry() or resize() request.

The Cocoa plugin however did set the platform window geometry
immediately so that the qnsview's updateGeometry returned too
early.

Task-number: QTBUG-32706
Change-Id: I1f359ab368833d174ab6740f4467b0848c290f13
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
This commit is contained in:
Nils Jeisecke 2013-07-26 17:51:42 +02:00 committed by The Qt Project
parent 5d192deed9
commit cf3e435299
2 changed files with 25 additions and 2 deletions

View File

@ -267,7 +267,6 @@ void QCocoaWindow::setGeometry(const QRect &rect)
#ifdef QT_COCOA_ENABLE_WINDOW_DEBUG
qDebug() << "QCocoaWindow::setGeometry" << this << rect;
#endif
QPlatformWindow::setGeometry(rect);
setCocoaGeometry(rect);
}
@ -275,8 +274,10 @@ void QCocoaWindow::setCocoaGeometry(const QRect &rect)
{
QCocoaAutoReleasePool pool;
if (m_contentViewIsEmbedded)
if (m_contentViewIsEmbedded) {
QPlatformWindow::setGeometry(rect);
return;
}
if (m_nsWindow) {
NSRect bounds = qt_mac_flipRect(rect, window());
@ -284,6 +285,8 @@ void QCocoaWindow::setCocoaGeometry(const QRect &rect)
} else {
[m_contentView setFrame : NSMakeRect(rect.x(), rect.y(), rect.width(), rect.height())];
}
// will call QPlatformWindow::setGeometry(rect) during resize confirmation (see qnsview.mm)
}
void QCocoaWindow::setVisible(bool visible)

View File

@ -59,6 +59,7 @@ class tst_QWindow: public QObject
private slots:
void eventOrderOnShow();
void resizeEventAfterResize();
void mapGlobal();
void positioning();
void isExposed();
@ -168,6 +169,25 @@ void tst_QWindow::eventOrderOnShow()
QVERIFY(window.eventIndex(QEvent::Resize) < window.eventIndex(QEvent::Expose));
}
void tst_QWindow::resizeEventAfterResize()
{
// Some platforms enforce minimum widths for windows, which can cause extra resize
// events, so set the width to suitably large value to avoid those.
QRect geometry(QGuiApplication::primaryScreen()->availableGeometry().topLeft() + QPoint(20, 20), QSize(300, 40));
Window window;
window.setGeometry(geometry);
window.show();
QTRY_COMPARE(window.received(QEvent::Resize), 1);
// QTBUG-32706
// Make sure we get a resizeEvent after calling resize
window.resize(400, 100);
QTRY_COMPARE(window.received(QEvent::Resize), 2);
}
void tst_QWindow::positioning()
{
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(