From 75e5ffe0f71bfccd6ae31d1b437dfea58bfb28a7 Mon Sep 17 00:00:00 2001 From: Dyami Caliri Date: Tue, 16 Sep 2014 09:35:11 -0700 Subject: Update widget winId when screen changes When a window's screen changes it may recreate the platform window. In that case, update the winId in the widget to keep it in sync. Task-number: QTBUG-40681 Change-Id: Iec815320214832bb63952de3a5bd1340a04dacd4 Reviewed-by: Laszlo Agocs --- src/widgets/kernel/qwidget.cpp | 6 +++++ .../kernel/qwidget_window/qwidget_window.pro | 2 +- .../kernel/qwidget_window/tst_qwidget_window.cpp | 31 ++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 65978ef562..8d1a24a4ec 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -9042,6 +9042,12 @@ bool QWidget::event(QEvent *event) event->ignore(); break; #endif + case QEvent::ScreenChangeInternal: + if (const QTLWExtra *te = d->maybeTopData()) { + const QWindow *win = te->window; + d->setWinId((win && win->handle()) ? win->handle()->winId() : 0); + } + break; #ifndef QT_NO_PROPERTIES case QEvent::DynamicPropertyChange: { const QByteArray &propName = static_cast(event)->propertyName(); diff --git a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro index baa2823f9a..d61681d5cb 100644 --- a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro +++ b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro @@ -1,7 +1,7 @@ CONFIG += testcase CONFIG += parallel_test TARGET = tst_qwidget_window -QT += widgets testlib +QT += widgets testlib core-private gui-private SOURCES += tst_qwidget_window.cpp x11 { diff --git a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp index 8084d50fbe..f9d705de26 100644 --- a/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp +++ b/tests/auto/widgets/kernel/qwidget_window/tst_qwidget_window.cpp @@ -52,6 +52,8 @@ #include #include #include +#include +#include static inline void setFrameless(QWidget *w) { @@ -97,6 +99,7 @@ private slots: #endif void tst_qtbug35600(); + void tst_updateWinId_QTBUG40681(); }; void tst_QWidget_window::initTestCase() @@ -603,5 +606,33 @@ void tst_QWidget_window::tst_qtbug35600() // QTBUG-35600: program may crash here or on exit } +void tst_QWidget_window::tst_updateWinId_QTBUG40681() +{ + QWidget w; + QVBoxLayout *vl = new QVBoxLayout(&w); + QLabel *lbl = new QLabel("HELLO1"); + lbl->setAttribute(Qt::WA_NativeWindow); + lbl->setObjectName("label1"); + vl->addWidget(lbl); + w.setMinimumWidth(200); + + w.show(); + + QVERIFY(QTest::qWaitForWindowExposed(&w)); + + QCOMPARE(lbl->winId(), lbl->windowHandle()->winId()); + + // simulate screen change and notification + QWindow *win = w.windowHandle(); + w.windowHandle()->destroy(); + lbl->windowHandle()->destroy(); + w.windowHandle()->create(); + lbl->windowHandle()->create(); + QWindowPrivate *p = qt_window_private(win); + p->emitScreenChangedRecursion(win->screen()); + + QCOMPARE(lbl->winId(), lbl->windowHandle()->winId()); +} + QTEST_MAIN(tst_QWidget_window) #include "tst_qwidget_window.moc" -- cgit v1.2.3