From cfd6c9bfc66036e2ec24804d7ceef051992fef47 Mon Sep 17 00:00:00 2001 From: Giulio Camuffo Date: Tue, 17 Feb 2015 16:33:43 +0200 Subject: 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 Reviewed-by: Mikko Levonmaa --- .../wayland/qml-compositor/WindowContainer.qml | 2 +- examples/wayland/qml-compositor/main.cpp | 5 +- .../qwindow-compositor/qwindowcompositor.cpp | 17 +-- src/client/client.pro | 1 - .../compositor_api/qwaylandquickcompositor.cpp | 2 +- src/compositor/compositor_api/qwaylandsurface.cpp | 19 --- src/compositor/compositor_api/qwaylandsurface.h | 5 +- .../compositor_api/qwaylandsurfaceitem.cpp | 5 + .../compositor_api/qwaylandsurfaceitem.h | 2 + .../compositor_api/qwaylandsurfaceview.cpp | 2 + .../compositor_api/qwaylandsurfaceview.h | 2 + src/compositor/wayland_wrapper/qwlcompositor.cpp | 36 ++++- src/compositor/wayland_wrapper/qwlcompositor_p.h | 10 +- src/compositor/wayland_wrapper/qwlsubsurface.cpp | 153 ++++++++------------- src/compositor/wayland_wrapper/qwlsubsurface_p.h | 83 +++-------- src/compositor/wayland_wrapper/qwlsurface.cpp | 18 +++ src/compositor/wayland_wrapper/qwlsurface_p.h | 3 + src/compositor/wayland_wrapper/wayland_wrapper.pri | 1 - src/extensions/sub-surface-extension.xml | 69 ---------- 19 files changed, 152 insertions(+), 283 deletions(-) delete mode 100644 src/extensions/sub-surface-extension.xml 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() << 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(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(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::subSurfaces() const -{ - Q_D(const QWaylandSurface); - if (d->subSurface()) { - return d->subSurface()->subSurfaces(); - } - return QLinkedList(); -} - 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 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(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 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 + #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::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 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(sub_surface_parent_resource->data); - SubSurface *child_sub_surface = static_cast(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(sub_surface_parent_resource->data); - SubSurface *child_sub_surface = static_cast(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 -#include +#include +#include #include QT_BEGIN_NAMESPACE @@ -54,78 +55,36 @@ class QWaylandSurface; namespace QtWayland { -class SubSurfaceExtensionGlobal +class SubSurface : public QObject, public QtWaylandServer::wl_subsurface, public SurfaceRoleHandler { 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 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 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 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::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 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 @@ - - - - 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$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- cgit v1.2.3