File indexing completed on 2024-05-19 05:32:47

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