diff options
Diffstat (limited to 'examples/wayland/custom-shell/compositor/exampleshell.cpp')
-rw-r--r-- | examples/wayland/custom-shell/compositor/exampleshell.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/examples/wayland/custom-shell/compositor/exampleshell.cpp b/examples/wayland/custom-shell/compositor/exampleshell.cpp new file mode 100644 index 000000000..f134a8ba6 --- /dev/null +++ b/examples/wayland/custom-shell/compositor/exampleshell.cpp @@ -0,0 +1,119 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "exampleshell.h" +#include "exampleshellintegration.h" + +#include <QtWaylandCompositor/QWaylandCompositor> +#include <QtWaylandCompositor/QWaylandSurface> +#include <QtWaylandCompositor/QWaylandResource> + +ExampleShell::ExampleShell() +{ +} + +ExampleShell::ExampleShell(QWaylandCompositor *compositor) + : QWaylandCompositorExtensionTemplate<ExampleShell>(compositor) +{ + this->compositor = compositor; +} + +//! [initialize] +void ExampleShell::initialize() +{ + QWaylandCompositorExtensionTemplate::initialize(); + + QWaylandCompositor *compositor = static_cast<QWaylandCompositor *>(extensionContainer()); + if (!compositor) { + qWarning() << "Failed to find QWaylandCompositor when initializing ExampleShell"; + return; + } + + init(compositor->display(), 1); +} +//! [initialize] + +//! [surface_create] +void ExampleShell::example_shell_surface_create(Resource *resource, wl_resource *surfaceResource, uint32_t id) +{ + QWaylandSurface *surface = QWaylandSurface::fromResource(surfaceResource); + + if (!surface->setRole(ExampleShellSurface::role(), resource->handle, QT_EXAMPLE_SHELL_ERROR_ROLE)) + return; + + QWaylandResource shellSurfaceResource(wl_resource_create(resource->client(), &::qt_example_shell_surface_interface, + wl_resource_get_version(resource->handle), id)); + + auto *shellSurface = new ExampleShellSurface(this, surface, shellSurfaceResource); + emit shellSurfaceCreated(shellSurface); +} +//! [surface_create] + +ExampleShellSurface::ExampleShellSurface(ExampleShell *shell, QWaylandSurface *surface, const QWaylandResource &resource) +{ + m_shell = shell; + m_surface = surface; + init(resource.resource()); + setExtensionContainer(surface); + QWaylandCompositorExtension::initialize(); +} + +QWaylandSurfaceRole ExampleShellSurface::s_role("qt_example_shell_surface"); + +/*! + * Returns the surface role for the ExampleShellSurface. + */ +QWaylandSurfaceRole *ExampleShellSurface::role() +{ + return &s_role; +} + +/*! + * Returns the ExampleShellSurface corresponding to the \a resource. + */ +ExampleShellSurface *ExampleShellSurface::fromResource(wl_resource *resource) +{ + auto *res = Resource::fromResource(resource); + return static_cast<ExampleShellSurface *>(res->object()); +} + +QWaylandQuickShellIntegration *ExampleShellSurface::createIntegration(QWaylandQuickShellSurfaceItem *item) +{ + return new ExampleShellIntegration(item); +} + +void ExampleShellSurface::example_shell_surface_destroy_resource(Resource *resource) +{ + Q_UNUSED(resource); + delete this; +} + +void ExampleShellSurface::example_shell_surface_destroy(Resource *resource) +{ + wl_resource_destroy(resource->handle); +} + +void ExampleShellSurface::example_shell_surface_set_window_title(Resource *resource, const QString &window_title) +{ + Q_UNUSED(resource); + m_windowTitle = window_title; + emit windowTitleChanged(); +} + +void ExampleShellSurface::example_shell_surface_set_minimized(Resource *resource, uint32_t minimized) +{ + Q_UNUSED(resource); + if (m_minimized != minimized) { + m_minimized = minimized; + emit minimizedChanged(); + } +} + +void ExampleShellSurface::setMinimized(bool newMinimized) +{ + if (m_minimized == newMinimized) + return; + m_minimized = newMinimized; + send_minimize(newMinimized); + emit minimizedChanged(); +} |