#pragma once #include #include #include #include "WaylandProtocol.hpp" #include "primary-selection-unstable-v1.hpp" #include "types/DataDevice.hpp" class CPrimarySelectionOffer; class CPrimarySelectionSource; class CPrimarySelectionDevice; class CPrimarySelectionManager; class CPrimarySelectionOffer { public: CPrimarySelectionOffer(SP resource_, SP source_); bool good(); void sendData(); bool dead = false; WP source; private: SP resource; friend class CPrimarySelectionDevice; }; class CPrimarySelectionSource : public IDataSource { public: CPrimarySelectionSource(SP resource_, SP device_); ~CPrimarySelectionSource(); static SP fromResource(wl_resource*); bool good(); virtual std::vector mimes(); virtual void send(const std::string& mime, uint32_t fd); virtual void accepted(const std::string& mime); virtual void cancelled(); virtual void error(uint32_t code, const std::string& msg); std::vector mimeTypes; WP self; WP device; private: SP resource; }; class CPrimarySelectionDevice { public: CPrimarySelectionDevice(SP resource_); bool good(); wl_client* client(); void sendDataOffer(SP offer); void sendSelection(SP selection); WP self; private: SP resource; wl_client* pClient = nullptr; friend class CPrimarySelectionProtocol; }; class CPrimarySelectionManager { public: CPrimarySelectionManager(SP resource_); bool good(); WP device; std::vector> sources; private: SP resource; }; class CPrimarySelectionProtocol : public IWaylandProtocol { public: CPrimarySelectionProtocol(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(CPrimarySelectionManager* resource); void destroyResource(CPrimarySelectionDevice* resource); void destroyResource(CPrimarySelectionSource* resource); void destroyResource(CPrimarySelectionOffer* resource); // std::vector> m_vManagers; std::vector> m_vDevices; std::vector> m_vSources; std::vector> m_vOffers; // void setSelection(SP source); void sendSelectionToDevice(SP dev, SP sel); void updateSelection(); void onPointerFocus(); // SP dataDeviceForClient(wl_client*); friend class CPrimarySelectionManager; friend class CPrimarySelectionDevice; friend class CPrimarySelectionSource; friend class CPrimarySelectionOffer; friend class CSeatManager; struct { CHyprSignalListener onPointerFocusChange; } listeners; }; namespace PROTO { inline UP primarySelection; };