#pragma once #include #include #include "WaylandProtocol.hpp" #include "ext-data-control-v1.hpp" #include "types/DataDevice.hpp" #include class CExtDataControlManagerResource; class CExtDataSource; class CExtDataDevice; class CExtDataOffer; class CExtDataOffer { public: CExtDataOffer(SP resource_, SP source); bool good(); void sendData(); bool m_dead = false; bool m_primary = false; WP m_source; private: SP m_resource; friend class CExtDataDevice; }; class CExtDataSource : public IDataSource { public: CExtDataSource(SP resource_, SP device_); ~CExtDataSource(); static SP fromResource(wl_resource*); bool good(); virtual std::vector mimes(); virtual void send(const std::string& mime, Hyprutils::OS::CFileDescriptor fd); virtual void accepted(const std::string& mime); virtual void cancelled(); virtual void error(uint32_t code, const std::string& msg); std::vector m_mimeTypes; WP m_self; WP m_device; private: SP m_resource; }; class CExtDataDevice { public: CExtDataDevice(SP resource_); bool good(); wl_client* client(); void sendInitialSelections(); void sendDataOffer(SP offer); void sendSelection(SP selection); void sendPrimarySelection(SP selection); WP self; private: SP m_resource; wl_client* m_client = nullptr; friend class CExtDataDeviceProtocol; }; class CExtDataControlManagerResource { public: CExtDataControlManagerResource(SP resource_); bool good(); WP m_device; std::vector> m_sources; private: SP m_resource; }; class CExtDataDeviceProtocol : public IWaylandProtocol { public: CExtDataDeviceProtocol(const wl_interface* iface, const int& ver, const std::string& name); virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); private: void destroyResource(CExtDataControlManagerResource* resource); void destroyResource(CExtDataSource* resource); void destroyResource(CExtDataDevice* resource); void destroyResource(CExtDataOffer* resource); // std::vector> m_managers; std::vector> m_sources; std::vector> m_devices; std::vector> m_offers; // void setSelection(SP source, bool primary); void sendSelectionToDevice(SP dev, SP sel, bool primary); // SP dataDeviceForClient(wl_client*); friend class CSeatManager; friend class CExtDataControlManagerResource; friend class CExtDataSource; friend class CExtDataDevice; friend class CExtDataOffer; }; namespace PROTO { inline UP extDataDevice; };