summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/wayland/qwaylandshmsurface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/platforms/wayland/qwaylandshmsurface.cpp')
-rw-r--r--src/plugins/platforms/wayland/qwaylandshmsurface.cpp43
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 &region, 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