summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGiulio Camuffo <giulio.camuffo@jollamobile.com>2015-02-17 16:33:43 +0200
committerGiulio Camuffo <giulio.camuffo@jollamobile.com>2015-10-01 09:44:34 +0000
commitcfd6c9bfc66036e2ec24804d7ceef051992fef47 (patch)
tree3b9027960d82bba85803bf44937be8a5ac6c25e2
parent07c7898c8902b28988a66aa79cdd0cc141d35a34 (diff)
Implement the wl_subcompositor interface server-side
This change removes the qt_sub_surface extension and replaces it with the standard wl_subsurface. Only the bare minimum functionality is implemented, the wl_subsurface requests are left as dummy handlers currently. Change-Id: I025304072cf157f732e90c4b5649a07b295fdea5 Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com> Reviewed-by: Mikko Levonmaa <mikko.levonmaa@bitfactor.fi>
-rw-r--r--examples/wayland/qml-compositor/WindowContainer.qml2
-rw-r--r--examples/wayland/qml-compositor/main.cpp5
-rw-r--r--examples/wayland/qwindow-compositor/qwindowcompositor.cpp17
-rw-r--r--src/client/client.pro1
-rw-r--r--src/compositor/compositor_api/qwaylandquickcompositor.cpp2
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.cpp19
-rw-r--r--src/compositor/compositor_api/qwaylandsurface.h5
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.cpp5
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceitem.h2
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceview.cpp2
-rw-r--r--src/compositor/compositor_api/qwaylandsurfaceview.h2
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor.cpp36
-rw-r--r--src/compositor/wayland_wrapper/qwlcompositor_p.h10
-rw-r--r--src/compositor/wayland_wrapper/qwlsubsurface.cpp153
-rw-r--r--src/compositor/wayland_wrapper/qwlsubsurface_p.h83
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface.cpp18
-rw-r--r--src/compositor/wayland_wrapper/qwlsurface_p.h3
-rw-r--r--src/compositor/wayland_wrapper/wayland_wrapper.pri1
-rw-r--r--src/extensions/sub-surface-extension.xml69
19 files changed, 152 insertions, 283 deletions
diff --git a/examples/wayland/qml-compositor/WindowContainer.qml b/examples/wayland/qml-compositor/WindowContainer.qml
index 253daf7a9..017e2699b 100644
--- a/examples/wayland/qml-compositor/WindowContainer.qml
+++ b/examples/wayland/qml-compositor/WindowContainer.qml
@@ -108,7 +108,7 @@ Item {
anchors.fill: parent
blend: { if (child && chrome && (chrome.selected || child.focus)) 0.0; else 0.6 }
opacity: 1.0
- z: 1
+ z: -1
Behavior on blend {
enabled: true;
diff --git a/examples/wayland/qml-compositor/main.cpp b/examples/wayland/qml-compositor/main.cpp
index ab8589986..6e634563a 100644
--- a/examples/wayland/qml-compositor/main.cpp
+++ b/examples/wayland/qml-compositor/main.cpp
@@ -120,10 +120,7 @@ private slots:
}
void sendCallbacks() {
- if (m_fullscreenSurface)
- sendFrameCallbacks(QList<QWaylandSurface *>() << m_fullscreenSurface);
- else
- sendFrameCallbacks(surfaces());
+ sendFrameCallbacks(surfaces());
}
protected:
diff --git a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
index 5d338692f..6663a04d0 100644
--- a/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
+++ b/examples/wayland/qwindow-compositor/qwindowcompositor.cpp
@@ -118,7 +118,7 @@ public:
};
QWindowCompositor::QWindowCompositor(CompositorWindow *window)
- : QWaylandCompositor(0, DefaultExtensions | SubSurfaceExtension)
+ : QWaylandCompositor(0, DefaultExtensions)
, m_window(window)
, m_backgroundTexture(0)
, m_textureBlitter(0)
@@ -340,9 +340,6 @@ void QWindowCompositor::render()
foreach (QWaylandSurfaceView *view, surface->views()) {
QRect geo(view->pos().toPoint(),surface->size());
m_textureBlitter->drawTexture(texture,geo,m_window->size(),0,false,surface->isYInverted());
- foreach (QWaylandSurface *child, surface->subSurfaces()) {
- drawSubSurface(view->pos().toPoint(), child);
- }
}
}
@@ -353,18 +350,6 @@ void QWindowCompositor::render()
m_window->swapBuffers();
}
-void QWindowCompositor::drawSubSurface(const QPoint &offset, QWaylandSurface *surface)
-{
- GLuint texture = static_cast<BufferAttacher *>(surface->bufferAttacher())->texture;
- QWaylandSurfaceView *view = surface->views().first();
- QPoint pos = view->pos().toPoint() + offset;
- QRect geo(pos, surface->size());
- m_textureBlitter->drawTexture(texture, geo, m_window->size(), 0, false, surface->isYInverted());
- foreach (QWaylandSurface *child, surface->subSurfaces()) {
- drawSubSurface(pos, child);
- }
-}
-
bool QWindowCompositor::eventFilter(QObject *obj, QEvent *event)
{
if (obj != m_window)
diff --git a/src/client/client.pro b/src/client/client.pro
index 212ce0d59..ca0e0a7d0 100644
--- a/src/client/client.pro
+++ b/src/client/client.pro
@@ -45,7 +45,6 @@ INCLUDEPATH += $$PWD/../shared
WAYLANDCLIENTSOURCES += \
../3rdparty/protocol/wayland.xml \
../extensions/surface-extension.xml \
- ../extensions/sub-surface-extension.xml \
../extensions/touch-extension.xml \
../extensions/qtkey-extension.xml \
../extensions/windowmanager.xml \
diff --git a/src/compositor/compositor_api/qwaylandquickcompositor.cpp b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
index 3a3c0ecea..db84ea5f8 100644
--- a/src/compositor/compositor_api/qwaylandquickcompositor.cpp
+++ b/src/compositor/compositor_api/qwaylandquickcompositor.cpp
@@ -51,7 +51,7 @@ public:
{
}
- void compositor_create_surface(Resource *resource, uint32_t id) Q_DECL_OVERRIDE
+ void compositor_create_surface(wl_compositor::Resource *resource, uint32_t id) Q_DECL_OVERRIDE
{
QWaylandQuickSurface *surface = new QWaylandQuickSurface(resource->client(), id, wl_resource_get_version(resource->handle), static_cast<QWaylandQuickCompositor *>(m_qt_compositor));
surface->handle()->addToOutput(primaryOutput()->handle());
diff --git a/src/compositor/compositor_api/qwaylandsurface.cpp b/src/compositor/compositor_api/qwaylandsurface.cpp
index a8dc41fd5..21e2d7b77 100644
--- a/src/compositor/compositor_api/qwaylandsurface.cpp
+++ b/src/compositor/compositor_api/qwaylandsurface.cpp
@@ -45,7 +45,6 @@
#include "wayland_wrapper/qwlsurface_p.h"
#include "wayland_wrapper/qwlextendedsurface_p.h"
-#include "wayland_wrapper/qwlsubsurface_p.h"
#include "wayland_wrapper/qwlcompositor_p.h"
#include "wayland_wrapper/qwlshellsurface_p.h"
#include "wayland_wrapper/qwlinputdevice_p.h"
@@ -160,24 +159,6 @@ QWaylandClient *QWaylandSurface::client() const
return d->client;
}
-QWaylandSurface *QWaylandSurface::parentSurface() const
-{
- Q_D(const QWaylandSurface);
- if (d->subSurface() && d->subSurface()->parent()) {
- return d->subSurface()->parent()->waylandSurface();
- }
- return 0;
-}
-
-QLinkedList<QWaylandSurface *> QWaylandSurface::subSurfaces() const
-{
- Q_D(const QWaylandSurface);
- if (d->subSurface()) {
- return d->subSurface()->subSurfaces();
- }
- return QLinkedList<QWaylandSurface *>();
-}
-
void QWaylandSurface::addInterface(QWaylandSurfaceInterface *iface)
{
Q_D(QWaylandSurface);
diff --git a/src/compositor/compositor_api/qwaylandsurface.h b/src/compositor/compositor_api/qwaylandsurface.h
index db1e1fb44..acff69092 100644
--- a/src/compositor/compositor_api/qwaylandsurface.h
+++ b/src/compositor/compositor_api/qwaylandsurface.h
@@ -159,8 +159,6 @@ public:
QWaylandClient *client() const;
- QWaylandSurface *parentSurface() const;
- QLinkedList<QWaylandSurface *> subSurfaces() const;
void addInterface(QWaylandSurfaceInterface *interface);
void removeInterface(QWaylandSurfaceInterface *interface);
@@ -254,6 +252,9 @@ Q_SIGNALS:
void pong();
void surfaceDestroyed();
+ void viewAdded(QWaylandSurfaceView *view);
+ void viewRemoved(QWaylandSurfaceView *view);
+
void configure(bool hasBuffer);
void redraw();
diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
index 0c48df382..e1d9d8fdd 100644
--- a/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
+++ b/src/compositor/compositor_api/qwaylandsurfaceitem.cpp
@@ -323,6 +323,11 @@ QPointF QWaylandSurfaceItem::pos() const
return position();
}
+void QWaylandSurfaceItem::setParentView(QWaylandSurfaceView *view)
+{
+ setParentItem(static_cast<QWaylandSurfaceItem *>(view));
+}
+
/*!
\qmlproperty bool QtWayland::QWaylandSurfaceItem::paintEnabled
diff --git a/src/compositor/compositor_api/qwaylandsurfaceitem.h b/src/compositor/compositor_api/qwaylandsurfaceitem.h
index cb51b6bfb..529b839c6 100644
--- a/src/compositor/compositor_api/qwaylandsurfaceitem.h
+++ b/src/compositor/compositor_api/qwaylandsurfaceitem.h
@@ -88,6 +88,8 @@ public:
void setPos(const QPointF &pos) Q_DECL_OVERRIDE;
QPointF pos() const Q_DECL_OVERRIDE;
+ void setParentView(QWaylandSurfaceView *view) Q_DECL_OVERRIDE;
+
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
diff --git a/src/compositor/compositor_api/qwaylandsurfaceview.cpp b/src/compositor/compositor_api/qwaylandsurfaceview.cpp
index 1d4ba304c..98ac81d5f 100644
--- a/src/compositor/compositor_api/qwaylandsurfaceview.cpp
+++ b/src/compositor/compositor_api/qwaylandsurfaceview.cpp
@@ -53,6 +53,7 @@ QWaylandSurfaceView::QWaylandSurfaceView(QWaylandSurface *surf)
if (surf) {
surf->d_func()->views << this;
surf->ref();
+ emit surf->viewAdded(this);
}
}
@@ -65,6 +66,7 @@ QWaylandSurfaceView::~QWaylandSurfaceView()
d->surface->destroy();
d->surface->d_func()->views.removeOne(this);
+ emit d->surface->viewRemoved(this);
}
delete d;
}
diff --git a/src/compositor/compositor_api/qwaylandsurfaceview.h b/src/compositor/compositor_api/qwaylandsurfaceview.h
index 2da19c264..dc0d93d91 100644
--- a/src/compositor/compositor_api/qwaylandsurfaceview.h
+++ b/src/compositor/compositor_api/qwaylandsurfaceview.h
@@ -55,6 +55,8 @@ public:
virtual void setPos(const QPointF &pos);
virtual QPointF pos() const;
+ virtual void setParentView(QWaylandSurfaceView *view) { Q_UNUSED(view) }
+
private:
class QWaylandSurfaceViewPrivate *const d;
friend class QWaylandSurfaceViewPrivate;
diff --git a/src/compositor/wayland_wrapper/qwlcompositor.cpp b/src/compositor/wayland_wrapper/qwlcompositor.cpp
index f8c8bdc1f..b1dd49dcd 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor.cpp
+++ b/src/compositor/wayland_wrapper/qwlcompositor.cpp
@@ -173,7 +173,6 @@ Compositor::Compositor(QWaylandCompositor *qt_compositor, QWaylandCompositor::Ex
#endif
, m_windowManagerIntegration(0)
, m_surfaceExtension(0)
- , m_subSurfaceExtension(0)
, m_touchExtension(0)
, m_qtkeyExtension(0)
, m_textInputManager()
@@ -196,6 +195,7 @@ void Compositor::init()
m_socket_name = arguments.at(socketArg + 1).toLocal8Bit();
wl_compositor::init(m_display->handle(), 3);
+ wl_subcompositor::init(m_display->handle(), 1);
m_data_device_manager = new DataDeviceManager(this);
@@ -239,7 +239,6 @@ Compositor::~Compositor()
qDeleteAll(m_outputs);
delete m_surfaceExtension;
- delete m_subSurfaceExtension;
delete m_touchExtension;
delete m_qtkeyExtension;
@@ -348,7 +347,7 @@ void Compositor::cleanupGraphicsResources()
m_destroyed_surfaces.clear();
}
-void Compositor::compositor_create_surface(Resource *resource, uint32_t id)
+void Compositor::compositor_create_surface(wl_compositor::Resource *resource, uint32_t id)
{
QWaylandSurface *surface = new QWaylandSurface(resource->client(), id, resource->version(), m_qt_compositor);
m_surfaces << surface->handle();
@@ -357,7 +356,7 @@ void Compositor::compositor_create_surface(Resource *resource, uint32_t id)
m_qt_compositor->surfaceCreated(surface);
}
-void Compositor::compositor_create_region(Resource *resource, uint32_t id)
+void Compositor::compositor_create_region(wl_compositor::Resource *resource, uint32_t id)
{
Q_UNUSED(compositor);
new Region(resource->client(), id);
@@ -374,6 +373,33 @@ void Compositor::destroyClient(QWaylandClient *client)
wl_client_destroy(client->client());
}
+void Compositor::subcompositor_destroy(wl_subcompositor::Resource *resource)
+{
+ wl_resource_destroy(resource->handle);
+}
+
+void Compositor::subcompositor_get_subsurface(wl_subcompositor::Resource *resource, uint32_t id, wl_resource *surface, wl_resource *parent)
+{
+ Surface *s = Surface::fromResource(surface);
+ Surface *p = Surface::fromResource(parent);
+
+ static const char where[] = "get_subsurface: wl_subsurface@";
+ if (s == p) {
+ wl_resource_post_error(resource->handle, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE, "%s%d: wl_surface@%d cannot be its own parent", where, id, wl_resource_get_id(surface));
+ return;
+ }
+ if (SubSurface::get(s)) {
+ wl_resource_post_error(resource->handle, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE, "%s%d: wl_surface@%d is already a sub-surface", where, id, wl_resource_get_id(surface));
+ return;
+ }
+
+ if (!s->setRole(SubSurface::role(), resource->handle, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE))
+ return;
+
+ SubSurface *ss = new SubSurface(s, p, resource->client(), id, resource->version());
+ s->setRoleHandler(ss);
+}
+
ClientBufferIntegration * Compositor::clientBufferIntegration() const
{
#ifdef QT_COMPOSITOR_WAYLAND_GL
@@ -412,8 +438,6 @@ void Compositor::initializeExtensions()
{
if (m_extensions & QWaylandCompositor::SurfaceExtension)
m_surfaceExtension = new SurfaceExtensionGlobal(this);
- if (m_extensions & QWaylandCompositor::SubSurfaceExtension)
- m_subSurfaceExtension = new SubSurfaceExtensionGlobal(this);
if (m_extensions & QWaylandCompositor::TouchExtension)
m_touchExtension = new TouchExtensionGlobal(this);
if (m_extensions & QWaylandCompositor::QtKeyExtension)
diff --git a/src/compositor/wayland_wrapper/qwlcompositor_p.h b/src/compositor/wayland_wrapper/qwlcompositor_p.h
index 7360e7dca..a0005a8e9 100644
--- a/src/compositor/wayland_wrapper/qwlcompositor_p.h
+++ b/src/compositor/wayland_wrapper/qwlcompositor_p.h
@@ -85,7 +85,7 @@ class HardwareIntegration;
class ClientBufferIntegration;
class ServerBufferIntegration;
-class Q_COMPOSITOR_EXPORT Compositor : public QObject, public QtWaylandServer::wl_compositor
+class Q_COMPOSITOR_EXPORT Compositor : public QObject, public QtWaylandServer::wl_compositor, public QtWaylandServer::wl_subcompositor
{
Q_OBJECT
@@ -167,8 +167,11 @@ public slots:
void cleanupGraphicsResources();
protected:
- void compositor_create_surface(Resource *resource, uint32_t id) Q_DECL_OVERRIDE;
- void compositor_create_region(Resource *resource, uint32_t id) Q_DECL_OVERRIDE;
+ void compositor_create_surface(wl_compositor::Resource *resource, uint32_t id) Q_DECL_OVERRIDE;
+ void compositor_create_region(wl_compositor::Resource *resource, uint32_t id) Q_DECL_OVERRIDE;
+ void subcompositor_destroy(wl_subcompositor::Resource *resource) Q_DECL_OVERRIDE;
+ void subcompositor_get_subsurface(wl_subcompositor::Resource *resource, uint32_t id, wl_resource *surface, wl_resource *parent) Q_DECL_OVERRIDE;
+
private slots:
void processWaylandEvents();
@@ -215,7 +218,6 @@ protected:
WindowManagerServerIntegration *m_windowManagerIntegration;
SurfaceExtensionGlobal *m_surfaceExtension;
- SubSurfaceExtensionGlobal *m_subSurfaceExtension;
TouchExtensionGlobal *m_touchExtension;
QtKeyExtensionGlobal *m_qtkeyExtension;
QScopedPointer<TextInputManager> m_textInputManager;
diff --git a/src/compositor/wayland_wrapper/qwlsubsurface.cpp b/src/compositor/wayland_wrapper/qwlsubsurface.cpp
index afc6d1825..5d2dc5306 100644
--- a/src/compositor/wayland_wrapper/qwlsubsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlsubsurface.cpp
@@ -38,154 +38,113 @@
**
****************************************************************************/
+#include <QDebug>
+
#include "qwlsubsurface_p.h"
#include "qwlcompositor_p.h"
#include "qwaylandsurface.h"
#include "qwaylandsurfaceview.h"
+#include "qwaylandsurfaceitem.h"
+
QT_BEGIN_NAMESPACE
namespace QtWayland {
-SubSurfaceExtensionGlobal::SubSurfaceExtensionGlobal(Compositor *compositor)
- : m_compositor(compositor)
+SubSurface::SubSurface(Surface *surface, Surface *parent, wl_client *client, uint32_t id, int version)
+ : QtWaylandServer::wl_subsurface(client, id, version)
+ , m_surface(surface)
+ , m_parent(parent)
+ , m_synchronized(true)
{
- wl_global_create(m_compositor->wl_display(),
- &qt_sub_surface_extension_interface,
- qt_sub_surface_extension_interface.version,
- this,
- SubSurfaceExtensionGlobal::bind_func);
-}
+ parent->addSubSurface(this);
+ QWaylandSurface *p = parent->waylandSurface();
-void SubSurfaceExtensionGlobal::bind_func(wl_client *client, void *data, uint32_t version, uint32_t id)
-{
- Q_UNUSED(version);
- struct wl_resource *resource = wl_resource_create(client, &qt_sub_surface_extension_interface,version,id);
- wl_resource_set_implementation(resource, &sub_surface_extension_interface, data, 0);
+ foreach (QWaylandSurfaceView *v, p->views())
+ createSubView(v);
+ connect(p, &QWaylandSurface::viewAdded, this, &SubSurface::createSubView);
}
-void SubSurfaceExtensionGlobal::get_sub_surface_aware_surface(wl_client *client, wl_resource *sub_surface_extension_resource, uint32_t id, wl_resource *surface_resource)
+SubSurface::~SubSurface()
{
- Q_UNUSED(sub_surface_extension_resource);
- Surface *surface = Surface::fromResource(surface_resource);
- new SubSurface(client,id,surface);
-}
-
-const struct qt_sub_surface_extension_interface SubSurfaceExtensionGlobal::sub_surface_extension_interface = {
- SubSurfaceExtensionGlobal::get_sub_surface_aware_surface
-};
+ qDeleteAll(m_views);
-SubSurface::SubSurface(wl_client *client, uint32_t id, Surface *surface)
- : m_surface(surface)
- , m_parent(0)
-{
- surface->setSubSurface(this);
- m_sub_surface_resource = wl_resource_create(client, &qt_sub_surface_interface, qt_sub_surface_interface.version, id);
- wl_resource_set_implementation(m_sub_surface_resource, &sub_surface_interface, this, 0);
+ m_surface->setSubSurface(Q_NULLPTR);
+ m_parent->removeSubSurface(this);
}
-SubSurface::~SubSurface()
+const SurfaceRole *SubSurface::role()
{
- if (m_parent) {
- m_parent->removeSubSurface(this);
- }
- QLinkedList<QWaylandSurface *>::iterator it;
- for (it = m_sub_surfaces.begin(); it != m_sub_surfaces.end(); ++it) {
- (*it)->handle()->subSurface()->parentDestroyed();
- }
+ static const SurfaceRole role = { "subsurface" };
+ return &role;
}
-void SubSurface::setSubSurface(SubSurface *subSurface, int x, int y)
+void SubSurface::parentCommit()
{
- if (!m_sub_surfaces.contains(subSurface->m_surface->waylandSurface())) {
- m_sub_surfaces.append(subSurface->m_surface->waylandSurface());
- subSurface->setParent(this);
+ foreach (QWaylandSurfaceView *view, m_views) {
+ view->setPos(m_position);
}
- foreach (QWaylandSurfaceView *view, subSurface->m_surface->waylandSurface()->views())
- view->setPos(QPointF(x,y));
}
-void SubSurface::removeSubSurface(SubSurface *subSurfaces)
+void SubSurface::configure(int dx, int dy)
{
- Q_ASSERT(m_sub_surfaces.contains(subSurfaces->m_surface->waylandSurface()));
- m_sub_surfaces.removeOne(subSurfaces->m_surface->waylandSurface());
+ Q_UNUSED(dx)
+ Q_UNUSED(dy)
}
-SubSurface *SubSurface::parent() const
+void SubSurface::createSubView(QWaylandSurfaceView *view)
{
- return m_parent;
+ QWaylandSurfaceView *v = m_surface->compositor()->waylandCompositor()->createView(m_surface->waylandSurface());
+ v->setParentView(view);
+ v->setPos(m_position);
+ m_views << v;
}
-void SubSurface::setParent(SubSurface *parent)
+void SubSurface::subsurface_destroy_resource(Resource *resource)
{
- if (m_parent == parent)
- return;
-
- QWaylandSurface *oldParent = 0;
- QWaylandSurface *newParent = 0;
-
- if (m_parent) {
- oldParent = m_parent->m_surface->waylandSurface();
- m_parent->removeSubSurface(this);
- }
- if (parent) {
- newParent = parent->m_surface->waylandSurface();
- }
- m_parent = parent;
-
- m_surface->waylandSurface()->parentChanged(newParent,oldParent);
+ Q_UNUSED(resource)
+ delete this;
}
-QLinkedList<QWaylandSurface *> SubSurface::subSurfaces() const
+void SubSurface::subsurface_destroy(Resource *resource)
{
- return m_sub_surfaces;
+ wl_resource_destroy(resource->handle);
}
-void SubSurface::parentDestroyed()
+void SubSurface::subsurface_set_position(Resource *resource, int32_t x, int32_t y)
{
- m_parent = 0;
+ Q_UNUSED(resource)
+
+ m_position = QPoint(x, y);
}
-void SubSurface::attach_sub_surface(wl_client *client, wl_resource *sub_surface_parent_resource, wl_resource *sub_surface_child_resource, int32_t x, int32_t y)
+
+void SubSurface::subsurface_place_above(Resource *resource, ::wl_resource *sibling)
{
- Q_UNUSED(client);
- SubSurface *parent_sub_surface = static_cast<SubSurface *>(sub_surface_parent_resource->data);
- SubSurface *child_sub_surface = static_cast<SubSurface *>(sub_surface_child_resource->data);
- parent_sub_surface->setSubSurface(child_sub_surface,x,y);
+ Q_UNUSED(resource)
+ Q_UNUSED(sibling)
+ qWarning("wl_subsurface.place_above not implemented");
}
-void SubSurface::move_sub_surface(wl_client *client, wl_resource *sub_surface_parent_resource, wl_resource *sub_surface_child_resource, int32_t x, int32_t y)
+void SubSurface::subsurface_place_below(Resource *resource, ::wl_resource *sibling)
{
- Q_UNUSED(client);
- Q_UNUSED(x);
- Q_UNUSED(y);
- SubSurface *parent_sub_surface = static_cast<SubSurface *>(sub_surface_parent_resource->data);
- SubSurface *child_sub_surface = static_cast<SubSurface *>(sub_surface_child_resource->data);
- Q_UNUSED(parent_sub_surface);
- Q_UNUSED(child_sub_surface);
+ Q_UNUSED(resource)
+ Q_UNUSED(sibling)
+ qWarning("wl_subsurface.place_below not implemented");
}
-void SubSurface::raise(wl_client *client, wl_resource *sub_surface_parent_resource, wl_resource *sub_surface_child_resource)
+void SubSurface::subsurface_set_sync(Resource *resource)
{
- Q_UNUSED(client);
- Q_UNUSED(sub_surface_parent_resource);
- Q_UNUSED(sub_surface_child_resource);
+ Q_UNUSED(resource)
+ qWarning("wl_subsurface.set_sync not implemented");
}
-void SubSurface::lower(wl_client *client, wl_resource *sub_surface_parent_resource, wl_resource *sub_surface_child_resource)
+void SubSurface::subsurface_set_desync(Resource *resource)
{
- Q_UNUSED(client);
- Q_UNUSED(sub_surface_parent_resource);
- Q_UNUSED(sub_surface_child_resource);
+ Q_UNUSED(resource)
+ qWarning("wl_subsurface.set_desync not implemented");
}
-const struct qt_sub_surface_interface SubSurface::sub_surface_interface = {
- SubSurface::attach_sub_surface,
- SubSurface::move_sub_surface,
- SubSurface::raise,
- SubSurface::lower
-};
-
}
QT_END_NAMESPACE
diff --git a/src/compositor/wayland_wrapper/qwlsubsurface_p.h b/src/compositor/wayland_wrapper/qwlsubsurface_p.h
index 0357b1e0e..7cd46efa0 100644
--- a/src/compositor/wayland_wrapper/qwlsubsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlsubsurface_p.h
@@ -43,8 +43,9 @@
#include <private/qwlsurface_p.h>
-#include <QtCompositor/private/wayland-sub-surface-extension-server-protocol.h>
+#include <QtCompositor/private/qwayland-server-wayland.h>
+#include <QtCore/QObject>
#include <QtCore/QLinkedList>
QT_BEGIN_NAMESPACE
@@ -54,78 +55,36 @@ class QWaylandSurface;
namespace QtWayland {
-class SubSurfaceExtensionGlobal
+class SubSurface : public QObject, public QtWaylandServer::wl_subsurface, public SurfaceRoleHandler<SubSurface>
{
public:
- SubSurfaceExtensionGlobal(Compositor *compositor);
-
-private:
- Compositor *m_compositor;
-
- static void bind_func(struct wl_client *client, void *data,
- uint32_t version, uint32_t id);
- static void get_sub_surface_aware_surface(struct wl_client *client,
- struct wl_resource *sub_surface_extension_resource,
- uint32_t id,
- struct wl_resource *surface_resource);
-
- static const struct qt_sub_surface_extension_interface sub_surface_extension_interface;
-};
-
-class SubSurface
-{
-public:
- SubSurface(struct wl_client *client, uint32_t id, Surface *surface);
+ SubSurface(Surface *surface, Surface *parent, wl_client *client, uint32_t id, int version);
~SubSurface();
- void setSubSurface(SubSurface *subSurface, int x, int y);
- void removeSubSurface(SubSurface *subSurfaces);
-
- SubSurface *parent() const;
- void setParent(SubSurface *parent);
+ static const SurfaceRole *role();
- QLinkedList<QWaylandSurface *> subSurfaces() const;
+ void parentCommit();
- Surface *surface() const;
- QWaylandSurface *waylandSurface() const;
+protected:
+ void configure(int dx, int dy) Q_DECL_OVERRIDE;
+ void subsurface_destroy_resource(Resource *resource) Q_DECL_OVERRIDE;
+ void subsurface_destroy(Resource *resource) Q_DECL_OVERRIDE;
+ void subsurface_set_position(Resource *resource, int32_t x, int32_t y) Q_DECL_OVERRIDE;
+ void subsurface_place_above(Resource *resource, ::wl_resource *sibling) Q_DECL_OVERRIDE;
+ void subsurface_place_below(Resource *resource, ::wl_resource *sibling) Q_DECL_OVERRIDE;
+ void subsurface_set_sync(Resource *resource) Q_DECL_OVERRIDE;
+ void subsurface_set_desync(Resource *resource) Q_DECL_OVERRIDE;
private:
- void parentDestroyed();
- struct wl_resource *m_sub_surface_resource;
- Surface *m_surface;
+ void createSubView(QWaylandSurfaceView *view);
- SubSurface *m_parent;
- QLinkedList<QWaylandSurface *> m_sub_surfaces;
-
- static void attach_sub_surface(struct wl_client *client,
- struct wl_resource *sub_surface_parent_resource,
- struct wl_resource *sub_surface_child_resource,
- int32_t x,
- int32_t y);
- static void move_sub_surface(struct wl_client *client,
- struct wl_resource *sub_surface_parent_resource,
- struct wl_resource *sub_surface_child_resource,
- int32_t x,
- int32_t y);
- static void raise(struct wl_client *client,
- struct wl_resource *sub_surface_parent_resource,
- struct wl_resource *sub_surface_child_resource);
- static void lower(struct wl_client *client,
- struct wl_resource *sub_surface_parent_resource,
- struct wl_resource *sub_surface_child_resource);
- static const struct qt_sub_surface_interface sub_surface_interface;
+ Surface *m_surface;
+ Surface *m_parent;
+ QPoint m_position;
+ bool m_synchronized;
+ QVector<QWaylandSurfaceView *> m_views;
};
-inline Surface *SubSurface::surface() const
-{
- return m_surface;
-}
-
-inline QWaylandSurface *SubSurface::waylandSurface() const
-{
- return m_surface->waylandSurface();
-}
-
}
QT_END_NAMESPACE
diff --git a/src/compositor/wayland_wrapper/qwlsurface.cpp b/src/compositor/wayland_wrapper/qwlsurface.cpp
index 9b3789087..a1c05d1ef 100644
--- a/src/compositor/wayland_wrapper/qwlsurface.cpp
+++ b/src/compositor/wayland_wrapper/qwlsurface.cpp
@@ -276,6 +276,21 @@ SubSurface *Surface::subSurface() const
return m_subSurface;
}
+void Surface::addSubSurface(SubSurface *ss)
+{
+ m_subsurfaces << ss;
+}
+
+void Surface::removeSubSurface(SubSurface *ss)
+{
+ for (QVector<SubSurface *>::iterator i = m_subsurfaces.begin(); i != m_subsurfaces.end(); ++i) {
+ if (*i == ss) {
+ m_subsurfaces.erase(i);
+ return;
+ }
+ }
+}
+
void Surface::setInputPanelSurface(InputPanelSurface *inputPanelSurface)
{
m_inputPanelSurface = inputPanelSurface;
@@ -506,6 +521,9 @@ void Surface::surface_commit(Resource *)
m_pending.newlyAttached = false;
m_pending.damage = QRegion();
+ foreach (SubSurface *ss, m_subsurfaces)
+ ss->parentCommit();
+
if (m_buffer)
m_buffer->setCommitted();
diff --git a/src/compositor/wayland_wrapper/qwlsurface_p.h b/src/compositor/wayland_wrapper/qwlsurface_p.h
index d08fb4cd6..5875da106 100644
--- a/src/compositor/wayland_wrapper/qwlsurface_p.h
+++ b/src/compositor/wayland_wrapper/qwlsurface_p.h
@@ -117,6 +117,8 @@ public:
void setSubSurface(SubSurface *subSurface);
SubSurface *subSurface() const;
+ void addSubSurface(SubSurface *ss);
+ void removeSubSurface(SubSurface *ss);
void setInputPanelSurface(InputPanelSurface *inputPanelSurface);
InputPanelSurface *inputPanelSurface() const;
@@ -225,6 +227,7 @@ protected:
bool m_destroyed;
Qt::ScreenOrientation m_contentOrientation;
QWindow::Visibility m_visibility;
+ QVector<SubSurface *> m_subsurfaces;
const SurfaceRole *m_role;
RoleBase *m_roleHandler;
diff --git a/src/compositor/wayland_wrapper/wayland_wrapper.pri b/src/compositor/wayland_wrapper/wayland_wrapper.pri
index eb66f6949..d65798711 100644
--- a/src/compositor/wayland_wrapper/wayland_wrapper.pri
+++ b/src/compositor/wayland_wrapper/wayland_wrapper.pri
@@ -1,7 +1,6 @@
CONFIG += wayland-scanner
WAYLANDSERVERSOURCES += \
../extensions/surface-extension.xml \
- ../extensions/sub-surface-extension.xml \
../extensions/touch-extension.xml \
../extensions/qtkey-extension.xml \
../extensions/windowmanager.xml \
diff --git a/src/extensions/sub-surface-extension.xml b/src/extensions/sub-surface-extension.xml
deleted file mode 100644
index 4ea87e203..000000000
--- a/src/extensions/sub-surface-extension.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<protocol name="sub_surface_extension">
-
- <copyright>
- Copyright (C) 2015 The Qt Company Ltd.
- Contact: http://www.qt.io/licensing/
-
- This file is part of the plugins of the Qt Toolkit.
-
- $QT_BEGIN_LICENSE:BSD$
- You may use this file under the terms of the BSD license as follows:
-
- "Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of The Qt Company Ltd nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-
- $QT_END_LICENSE$
- </copyright>
-
- <interface name="qt_sub_surface_extension" version="1">
- <request name="get_sub_surface_aware_surface">
- <arg name="id" type="new_id" interface="qt_sub_surface"/>
- <arg name="surface" type="object" interface="wl_surface"/>
- </request>
- </interface>
-
- <interface name="qt_sub_surface" version="1">
- <request name="attach_sub_surface">
- <arg name="sub_surface" type="object" interface="qt_sub_surface"/>
- <arg name="x" type="int"/>
- <arg name="y" type="int"/>
- </request>
-
- <request name="move_sub_surface">
- <arg name="sub_surface" type="object" interface="qt_sub_surface"/>
- <arg name="x" type="int"/>
- <arg name="y" type="int"/>
- </request>
-
- <request name="raise">
- <arg name="sub_surface" type="object" interface="qt_sub_surface"/>
- </request>
-
- <request name="lower">
- <arg name="sub_surface" type="object" interface="qt_sub_surface"/>
- </request>
- </interface>
-</protocol>