summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/wayland/qwaylandnativeinterface.cpp41
-rw-r--r--src/plugins/platforms/wayland/qwaylandnativeinterface_p.h6
-rw-r--r--src/plugins/platforms/wayland/qwaylandsubsurface.cpp25
-rw-r--r--src/plugins/platforms/wayland/qwaylandsubsurface_p.h11
4 files changed, 82 insertions, 1 deletions
diff --git a/src/plugins/platforms/wayland/qwaylandnativeinterface.cpp b/src/plugins/platforms/wayland/qwaylandnativeinterface.cpp
index 0d20075f05d..050099f8b64 100644
--- a/src/plugins/platforms/wayland/qwaylandnativeinterface.cpp
+++ b/src/plugins/platforms/wayland/qwaylandnativeinterface.cpp
@@ -34,6 +34,7 @@
#include "qwaylandnativeinterface_p.h"
#include "qwaylanddisplay_p.h"
#include "qwaylandwindow_p.h"
+#include "qwaylandsubsurface_p.h"
#include "qwaylandextendedsurface_p.h"
#include "qwaylandintegration_p.h"
#include "qwaylanddisplay_p.h"
@@ -43,6 +44,8 @@
#include <QtGui/QScreen>
#include <QtWaylandClient/private/qwaylandclientbufferintegration_p.h>
+#include <QtPlatformHeaders/qwaylandwindowfunctions.h>
+
QT_BEGIN_NAMESPACE
namespace QtWaylandClient {
@@ -141,6 +144,44 @@ void QWaylandNativeInterface::emitWindowPropertyChanged(QPlatformWindow *window,
emit windowPropertyChanged(window,name);
}
+QFunctionPointer QWaylandNativeInterface::platformFunction(const QByteArray &resource) const
+{
+ if (resource == QWaylandWindowFunctions::setSyncIdentifier()) {
+ return QFunctionPointer(setSync);
+ } else if (resource == QWaylandWindowFunctions::setDeSyncIdentifier()) {
+ return QFunctionPointer(setDeSync);
+ } else if (resource == QWaylandWindowFunctions::isSyncIdentifier()) {
+ return QFunctionPointer(isSync);
+ }
+ return 0;
+}
+
+
+void QWaylandNativeInterface::setSync(QWindow *window)
+{
+ QWaylandWindow *ww = static_cast<QWaylandWindow*>(window->handle());
+ if (ww->subSurfaceWindow()) {
+ ww->subSurfaceWindow()->setSync();
+ }
+}
+
+void QWaylandNativeInterface::setDeSync(QWindow *window)
+{
+ QWaylandWindow *ww = static_cast<QWaylandWindow*>(window->handle());
+ if (ww->subSurfaceWindow()) {
+ ww->subSurfaceWindow()->setDeSync();
+ }
+}
+
+bool QWaylandNativeInterface::isSync(QWindow *window)
+{
+ QWaylandWindow *ww = static_cast<QWaylandWindow*>(window->handle());
+ if (ww->subSurfaceWindow()) {
+ return ww->subSurfaceWindow()->isSync();
+ }
+ return false;
+}
+
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/qwaylandnativeinterface_p.h b/src/plugins/platforms/wayland/qwaylandnativeinterface_p.h
index 7050f975885..9ea62a90cbf 100644
--- a/src/plugins/platforms/wayland/qwaylandnativeinterface_p.h
+++ b/src/plugins/platforms/wayland/qwaylandnativeinterface_p.h
@@ -75,9 +75,15 @@ public:
void emitWindowPropertyChanged(QPlatformWindow *window, const QString &name);
+ QFunctionPointer platformFunction(const QByteArray &resource) const Q_DECL_OVERRIDE;
+
private:
QWaylandIntegration *m_integration;
QHash<QPlatformWindow*, QVariantMap> m_windowProperties;
+
+ static void setSync(QWindow *window);
+ static void setDeSync(QWindow *window);
+ static bool isSync(QWindow *window);
};
}
diff --git a/src/plugins/platforms/wayland/qwaylandsubsurface.cpp b/src/plugins/platforms/wayland/qwaylandsubsurface.cpp
index ec813609fd2..72b80c18f0e 100644
--- a/src/plugins/platforms/wayland/qwaylandsubsurface.cpp
+++ b/src/plugins/platforms/wayland/qwaylandsubsurface.cpp
@@ -45,9 +45,10 @@ QWaylandSubSurface::QWaylandSubSurface(QWaylandWindow *window, QWaylandWindow *p
: QtWayland::wl_subsurface(sub_surface)
, m_window(window)
, m_parent(parent)
+ , m_synchronized(false)
{
m_parent->mChildren << this;
- set_desync();
+ setDeSync();
}
QWaylandSubSurface::~QWaylandSubSurface()
@@ -55,6 +56,28 @@ QWaylandSubSurface::~QWaylandSubSurface()
m_parent->mChildren.removeOne(this);
}
+void QWaylandSubSurface::setSync()
+{
+ QWaylandSubSurface::set_sync();
+}
+
+void QWaylandSubSurface::setDeSync()
+{
+ QWaylandSubSurface::set_desync();
+}
+
+void QWaylandSubSurface::set_sync()
+{
+ m_synchronized = true;
+ QtWayland::wl_subsurface::set_sync();
+}
+
+void QWaylandSubSurface::set_desync()
+{
+ m_synchronized = false;
+ QtWayland::wl_subsurface::set_desync();
+}
+
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/wayland/qwaylandsubsurface_p.h b/src/plugins/platforms/wayland/qwaylandsubsurface_p.h
index 4cbb99251ba..5255df5c920 100644
--- a/src/plugins/platforms/wayland/qwaylandsubsurface_p.h
+++ b/src/plugins/platforms/wayland/qwaylandsubsurface_p.h
@@ -68,9 +68,20 @@ public:
QWaylandWindow *window() const { return m_window; }
QWaylandWindow *parent() const { return m_parent; }
+ void setSync();
+ void setDeSync();
+ bool isSync() const { return m_synchronized; }
+
private:
+
+ // Intentionally hide public methods from ::wl_subsurface
+ // to keep track of the sync state
+ void set_sync();
+ void set_desync();
QWaylandWindow *m_window;
QWaylandWindow *m_parent;
+ bool m_synchronized;
+
};
QT_END_NAMESPACE