diff options
Diffstat (limited to 'src/plugins/platforms/wayland/qwaylandshmsurface.cpp')
-rw-r--r-- | src/plugins/platforms/wayland/qwaylandshmsurface.cpp | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp index 83bb993..54da9a1 100644 --- a/src/plugins/platforms/wayland/qwaylandshmsurface.cpp +++ b/src/plugins/platforms/wayland/qwaylandshmsurface.cpp @@ -1,10 +1,10 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** -** This file is part of the QtOpenVG module of the Qt Toolkit. +** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage @@ -44,7 +44,7 @@ #include <QtGui/private/qapplication_p.h> #include "qwaylanddisplay.h" -#include "qwaylandwindow.h" +#include "qwaylandshmwindow.h" #include "qwaylandscreen.h" #include <wayland-client.h> @@ -95,6 +95,7 @@ QWaylandShmWindowSurface::QWaylandShmWindowSurface(QWidget *window) : QWindowSurface(window) , mBuffer(0) , mDisplay(QWaylandScreen::waylandScreenFromWidget(window)->display()) + , mWaitingForFrameSync(false) { } @@ -107,27 +108,41 @@ QPaintDevice *QWaylandShmWindowSurface::paintDevice() return mBuffer->image(); } +void QWaylandShmWindowSurface::beginPaint(const QRegion &) +{ + while (mWaitingForFrameSync) { + mDisplay->iterate(); + } +} + +void QWaylandShmWindowSurface::frameCallback(void *data, uint32_t time) +{ + QWaylandShmWindowSurface *self = static_cast<QWaylandShmWindowSurface*>(data); + self->mWaitingForFrameSync = false; +} + void QWaylandShmWindowSurface::flush(QWidget *widget, const QRegion ®ion, const QPoint &offset) { Q_UNUSED(widget); Q_UNUSED(offset); - QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); - QVector<QRect> rects = region.rects(); - const QRect *r; - int i; + QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow()); + Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm); - for (i = 0; i < rects.size(); i++) { - r = &rects.at(i); - wl_surface_damage(ww->surface(), - r->x(), r->y(), r->width(), r->height()); + QVector<QRect> rects = region.rects(); + for (int i = 0; i < rects.size(); i++) { + waylandWindow->damage(rects.at(i)); } + mWaitingForFrameSync = true; + mDisplay->frameCallback(QWaylandShmWindowSurface::frameCallback, this); } void QWaylandShmWindowSurface::resize(const QSize &size) { - QWaylandWindow *ww = (QWaylandWindow *) window()->platformWindow(); + QWaylandShmWindow *waylandWindow = static_cast<QWaylandShmWindow *>(window()->platformWindow()); + Q_ASSERT(waylandWindow->windowType() == QWaylandWindow::Shm); + QWindowSurface::resize(size); - QImage::Format format = QApplicationPrivate::platformIntegration()->screens().first()->format(); + QImage::Format format = QPlatformScreen::platformScreenForWidget(window())->format(); if (mBuffer != NULL && mBuffer->size() == size) return; @@ -137,7 +152,7 @@ void QWaylandShmWindowSurface::resize(const QSize &size) mBuffer = new QWaylandShmBuffer(mDisplay, size, format); - ww->attach(mBuffer); + waylandWindow->attach(mBuffer); } QT_END_NAMESPACE |