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 }