diff options
Diffstat (limited to 'src/compositor/wayland_wrapper/qwlcompositor.cpp')
-rw-r--r-- | src/compositor/wayland_wrapper/qwlcompositor.cpp | 36 |
1 files changed, 30 insertions, 6 deletions
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) |