File indexing completed on 2024-05-19 16:35:33

0001 /*
0002     SPDX-FileCopyrightText: 2017 Marco Martin <notmart@gmail.com>
0003     SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 #pragma once
0008 
0009 #include "surface_interface_p.h"
0010 #include "xdgforeign_v2_interface.h"
0011 
0012 #include <qwayland-server-xdg-foreign-unstable-v2.h>
0013 
0014 namespace KWaylandServer
0015 {
0016 class XdgExportedV2Interface;
0017 class XdgImportedV2Interface;
0018 class XdgImporterV2Interface;
0019 class XdgExporterV2Interface;
0020 
0021 class XdgForeignV2InterfacePrivate
0022 {
0023 public:
0024     XdgForeignV2InterfacePrivate(Display *display, XdgForeignV2Interface *q);
0025 
0026     XdgForeignV2Interface *q;
0027     std::unique_ptr<XdgExporterV2Interface> exporter;
0028     std::unique_ptr<XdgImporterV2Interface> importer;
0029 };
0030 
0031 class XdgExporterV2Interface : public QObject, public QtWaylandServer::zxdg_exporter_v2
0032 {
0033     Q_OBJECT
0034 
0035 public:
0036     XdgExporterV2Interface(Display *display, XdgForeignV2Interface *foreign);
0037 
0038     XdgExportedV2Interface *exportedSurface(const QString &handle);
0039 
0040 protected:
0041     void zxdg_exporter_v2_destroy(Resource *resource) override;
0042     void zxdg_exporter_v2_export_toplevel(Resource *resource, uint32_t id, wl_resource *surface) override;
0043 
0044 private:
0045     XdgForeignV2Interface *m_foreign;
0046     QHash<QString, XdgExportedV2Interface *> m_exportedSurfaces;
0047 };
0048 
0049 class XdgImporterV2Interface : public QObject, public QtWaylandServer::zxdg_importer_v2
0050 {
0051     Q_OBJECT
0052 
0053 public:
0054     XdgImporterV2Interface(Display *display, XdgForeignV2Interface *foreign);
0055 
0056     void link(XdgImportedV2Interface *parent, SurfaceInterface *child);
0057     void unlink(XdgImportedV2Interface *parent, SurfaceInterface *child);
0058 
0059     SurfaceInterface *transientFor(SurfaceInterface *surface);
0060 
0061 protected:
0062     void zxdg_importer_v2_destroy(Resource *resource) override;
0063     void zxdg_importer_v2_import_toplevel(Resource *resource, uint32_t id, const QString &handle) override;
0064 
0065 private:
0066     XdgForeignV2Interface *m_foreign;
0067     QHash<SurfaceInterface *, XdgImportedV2Interface *> m_parents; // child->parent hash
0068     QHash<XdgImportedV2Interface *, SurfaceInterface *> m_children; // parent->child hash
0069 };
0070 
0071 class XdgExportedV2Interface : public QObject, public QtWaylandServer::zxdg_exported_v2
0072 {
0073     Q_OBJECT
0074 
0075 public:
0076     explicit XdgExportedV2Interface(SurfaceInterface *surface, wl_resource *resource);
0077 
0078     SurfaceInterface *surface();
0079 
0080 protected:
0081     void zxdg_exported_v2_destroy(Resource *resource) override;
0082     void zxdg_exported_v2_destroy_resource(Resource *resource) override;
0083 
0084 private Q_SLOTS:
0085     void handleSurfaceDestroyed();
0086 
0087 private:
0088     SurfaceInterface *m_surface;
0089 };
0090 
0091 class XdgDummyImportedV2Interface : public QtWaylandServer::zxdg_imported_v2
0092 {
0093 public:
0094     explicit XdgDummyImportedV2Interface(wl_resource *resource);
0095 
0096 protected:
0097     void zxdg_imported_v2_destroy(Resource *resource) override;
0098     void zxdg_imported_v2_destroy_resource(Resource *resource) override;
0099 };
0100 
0101 class XdgImportedV2Interface : public QObject, QtWaylandServer::zxdg_imported_v2
0102 {
0103     Q_OBJECT
0104 public:
0105     explicit XdgImportedV2Interface(XdgExportedV2Interface *exported, wl_resource *resource);
0106 
0107     SurfaceInterface *child() const;
0108     SurfaceInterface *surface() const;
0109 
0110 Q_SIGNALS:
0111     void childChanged(KWaylandServer::SurfaceInterface *child);
0112 
0113 private Q_SLOTS:
0114     void handleExportedDestroyed();
0115 
0116 private:
0117     XdgExportedV2Interface *m_exported;
0118     QPointer<SurfaceInterface> m_child;
0119 
0120 protected:
0121     void zxdg_imported_v2_set_parent_of(Resource *resource, wl_resource *surface) override;
0122     void zxdg_imported_v2_destroy(Resource *resource) override;
0123     void zxdg_imported_v2_destroy_resource(Resource *resource) override;
0124 };
0125 }