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 }