summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/widgets/kernel/qwidgetrepaintmanager/BLACKLIST11
-rw-r--r--tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp38
2 files changed, 37 insertions, 12 deletions
diff --git a/tests/auto/widgets/kernel/qwidgetrepaintmanager/BLACKLIST b/tests/auto/widgets/kernel/qwidgetrepaintmanager/BLACKLIST
deleted file mode 100644
index 94692ee20a..0000000000
--- a/tests/auto/widgets/kernel/qwidgetrepaintmanager/BLACKLIST
+++ /dev/null
@@ -1,11 +0,0 @@
-# Temporary for QTBUG-109036
-[fastMove]
-opensuse-leap
-
-# Temporary for QTBUG-109036
-[moveAccross]
-opensuse-leap
-
-# Temporary for QTBUG-109036
-[moveInOutOverlapped]
-opensuse-leap
diff --git a/tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp b/tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp
index f53d5aeb05..feb8a99131 100644
--- a/tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp
+++ b/tests/auto/widgets/kernel/qwidgetrepaintmanager/tst_qwidgetrepaintmanager.cpp
@@ -262,6 +262,8 @@ private slots:
void moveInOutOverlapped();
protected:
+ bool m_xcb = false;
+
/*
This helper compares the widget as rendered into the backingstore with the widget
as rendered via QWidget::grab. The latter always produces a fully rendered image,
@@ -279,14 +281,44 @@ protected:
}
QImage backingstoreContent = platformBackingStore->toImage();
+
+ // QXcbBackingStore::toImage() is not reliable. Take a screenshot instead.
+ // X11 draws the screen in a thread, which is not a QThread.
+ // The first screenshot is therefore unlikely to contain the correct image.
+ // It is taken just to obtain size and format.
+ QWidget *window = nullptr;
+ if (m_xcb) {
+
+ // Widget must be shown to be caught on a screen shot
+ if (!w->isWindow()) {
+ qWarning() << "Hidden widget" << w << "cannot be compared on XCB";
+ return false;
+ }
+
+ window = w->window();
+ Q_ASSERT(window);
+
+ backingstoreContent = window->screen()->grabWindow(window->winId()).toImage();
+ }
+
if (!w->isWindow()) {
const qreal dpr = w->devicePixelRatioF();
const QPointF offset = w->mapTo(w->window(), QPointF(0, 0)) * dpr;
backingstoreContent = backingstoreContent.copy(offset.x(), offset.y(), w->width() * dpr, w->height() * dpr);
}
+
const QImage widgetRender = w->grab().toImage().convertToFormat(backingstoreContent.format());
- const bool result = backingstoreContent == widgetRender;
+ // XCB: Process events, until screenshot equals widgetRender or timeout kicks in.
+ if (m_xcb) {
+ // Unuse result to hit MANUAL_DEBUG code path
+ Q_UNUSED(QTest::qWaitFor([&](){
+ backingstoreContent = window->screen()->grabWindow(window->winId()).toImage();
+ return widgetRender == backingstoreContent;
+ }));
+ }
+
+ const bool result = widgetRender == backingstoreContent;
#ifdef MANUAL_DEBUG
if (!result) {
@@ -334,6 +366,10 @@ void tst_QWidgetRepaintManager::initTestCase()
m_implementsScroll = widget.backingStore()->handle()->scroll(QRegion(widget.rect()), 1, 1);
qInfo() << QGuiApplication::platformName() << "QPA backend implements scroll:" << m_implementsScroll;
+
+#if defined(QT_BUILD_INTERNAL)
+ m_xcb = QGuiApplication::platformName().contains("xcb", Qt::CaseInsensitive);
+#endif
}
void tst_QWidgetRepaintManager::cleanup()