summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2015-12-11 23:19:55 +0200
committerGiulio Camuffo <giulio.camuffo@kdab.com>2016-04-04 07:05:32 +0000
commitac670666395882c60b512ff493b66d58a1ad6541 (patch)
tree3bc858a1aa8c9a3cf5a8cb8b399563cf484dc62f
parent01daa660d04e8960961988da6191e80c05a84d58 (diff)
Implement the QPlatformWindow::requestUpdate() virtual method.
The implementation will wait for the frame callback before firing the update event. Change-Id: Ieea748fda7c2aeb62cc40f35dbd122864c09f7cd Reviewed-by: Johan Helsing <johan.helsing@theqtcompany.com> Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
-rw-r--r--src/client/qwaylandwindow.cpp43
-rw-r--r--src/client/qwaylandwindow_p.h4
2 files changed, 33 insertions, 14 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 80783060a..a3016646b 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -61,6 +61,7 @@
#include <QGuiApplication>
#include <qpa/qwindowsysteminterface.h>
+#include <QtGui/private/qwindow_p.h>
#include <QtCore/QDebug>
@@ -91,6 +92,7 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
, mState(Qt::WindowNoState)
, mMask()
, mBackingStore(Q_NULLPTR)
+ , mUpdateRequested(false)
{
static WId id = 1;
mWindowId = id++;
@@ -431,10 +433,20 @@ void QWaylandWindow::requestResize()
void QWaylandWindow::attach(QWaylandBuffer *buffer, int x, int y)
{
- if (buffer)
+ if (mFrameCallback) {
+ wl_callback_destroy(mFrameCallback);
+ mFrameCallback = 0;
+ }
+
+ if (buffer) {
+ mFrameCallback = frame();
+ wl_callback_add_listener(mFrameCallback, &QWaylandWindow::callbackListener, this);
+ mWaitingForFrameSync = true;
+
attach(buffer->buffer(), x, y);
- else
+ } else {
QtWayland::wl_surface::attach(0, 0, 0);
+ }
}
void QWaylandWindow::attachOffset(QWaylandBuffer *buffer)
@@ -445,13 +457,6 @@ void QWaylandWindow::attachOffset(QWaylandBuffer *buffer)
void QWaylandWindow::damage(const QRect &rect)
{
- //We have to do sync stuff before calling damage, or we might
- //get a frame callback before we get the timestamp
- if (!mWaitingForFrameSync) {
- mFrameCallback = frame();
- wl_callback_add_listener(mFrameCallback,&QWaylandWindow::callbackListener,this);
- mWaitingForFrameSync = true;
- }
damage(rect.x(), rect.y(), rect.width(), rect.height());
}
@@ -463,12 +468,14 @@ void QWaylandWindow::frameCallback(void *data, struct wl_callback *callback, uin
{
Q_UNUSED(time);
QWaylandWindow *self = static_cast<QWaylandWindow*>(data);
- if (callback != self->mFrameCallback) // might be a callback caused by the shm backingstore
- return;
+
self->mWaitingForFrameSync = false;
- if (self->mFrameCallback) {
- wl_callback_destroy(self->mFrameCallback);
- self->mFrameCallback = 0;
+ wl_callback_destroy(callback);
+ self->mFrameCallback = 0;
+ if (self->mUpdateRequested) {
+ QWindowPrivate *w = QWindowPrivate::get(self->window());
+ w->deliverUpdateRequest();
+ self->mUpdateRequested = false;
}
}
@@ -871,6 +878,14 @@ QVariant QWaylandWindow::property(const QString &name, const QVariant &defaultVa
return m_properties.value(name, defaultValue);
}
+void QWaylandWindow::requestUpdate()
+{
+ if (!mFrameCallback)
+ QPlatformWindow::requestUpdate();
+ else
+ mUpdateRequested = true;
+}
+
}
QT_END_NAMESPACE
diff --git a/src/client/qwaylandwindow_p.h b/src/client/qwaylandwindow_p.h
index 02671a933..678fc3ae9 100644
--- a/src/client/qwaylandwindow_p.h
+++ b/src/client/qwaylandwindow_p.h
@@ -199,6 +199,8 @@ public:
bool setKeyboardGrabEnabled(bool) Q_DECL_OVERRIDE { return false; }
void propagateSizeHints() Q_DECL_OVERRIDE { }
+ void requestUpdate() Q_DECL_OVERRIDE;
+
public slots:
void requestResize();
@@ -245,6 +247,8 @@ private:
void handleMouseEventWithDecoration(QWaylandInputDevice *inputDevice, const QWaylandPointerEvent &e);
+ bool mUpdateRequested;
+
static const wl_callback_listener callbackListener;
static void frameCallback(void *data, struct wl_callback *wl_callback, uint32_t time);