summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSamuel Rødal <samuel.rodal@nokia.com>2011-09-19 13:42:20 +0200
committerQt by Nokia <qt-info@nokia.com>2011-09-19 16:37:51 +0200
commit003060e2928209b8028fa176b6c8b19777f1617b (patch)
tree2ddb0ec1bd9a386ab383003c7ad54d83e624e901 /src
parent9a096d9eb078f83b1e6f934ebaf863145f067fbc (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.cpp15
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 &region, 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));