summaryrefslogtreecommitdiffstats
path: root/examples/wayland/custom-shell/compositor/exampleshell.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/wayland/custom-shell/compositor/exampleshell.cpp')
-rw-r--r--examples/wayland/custom-shell/compositor/exampleshell.cpp119
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();
+}