diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2011-09-19 13:42:20 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-09-19 16:37:51 +0200 |
commit | 003060e2928209b8028fa176b6c8b19777f1617b (patch) | |
tree | 2ddb0ec1bd9a386ab383003c7ad54d83e624e901 /src | |
parent | 9a096d9eb078f83b1e6f934ebaf863145f067fbc (diff) |
Make sure to clip in QXcbBackingStore::flush()
Clip to image and window dimensions to prevent X errors.
Change-Id: I7fa581217444e00d6eb83ac356c600f86ae03636
Reviewed-on: http://codereview.qt-project.org/5140
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Holger Ihrig <holger.ihrig@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/platforms/xcb/qxcbbackingstore.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/plugins/platforms/xcb/qxcbbackingstore.cpp b/src/plugins/platforms/xcb/qxcbbackingstore.cpp index fadcb4d5b8..df6cf318bb 100644 --- a/src/plugins/platforms/xcb/qxcbbackingstore.cpp +++ b/src/plugins/platforms/xcb/qxcbbackingstore.cpp @@ -251,16 +251,25 @@ void QXcbBackingStore::endPaint(const QRegion &) void QXcbBackingStore::flush(QWindow *window, const QRegion ®ion, const QPoint &offset) { - QRect bounds = region.boundingRect(); - if (!m_image || m_image->size().isEmpty()) return; + QSize imageSize = m_image->size(); + + QRegion clipped = region; + clipped &= QRect(0, 0, window->width(), window->height()); + clipped &= QRect(0, 0, imageSize.width(), imageSize.height()).translated(-offset); + + QRect bounds = clipped.boundingRect(); + + if (bounds.isNull()) + return; + Q_XCB_NOOP(connection()); QXcbWindow *platformWindow = static_cast<QXcbWindow *>(window->handle()); - QVector<QRect> rects = region.rects(); + QVector<QRect> rects = clipped.rects(); for (int i = 0; i < rects.size(); ++i) m_image->put(platformWindow->xcb_window(), rects.at(i).topLeft(), rects.at(i).translated(offset)); |