#pragma once #include #include #include #include "../WaylandProtocol.hpp" #include "wayland.hpp" #include "../../helpers/signal/Signal.hpp" class CMonitor; class CWLOutputProtocol; class CWLOutputResource { public: CWLOutputResource(SP resource_, SP pMonitor); static SP fromResource(wl_resource*); bool good(); wl_client* client(); SP getResource(); void updateState(); WP monitor; WP owner; WP self; private: SP resource; wl_client* pClient = nullptr; friend class CWLOutputProtocol; }; class CWLOutputProtocol : public IWaylandProtocol { public: CWLOutputProtocol(const wl_interface* iface, const int& ver, const std::string& name, SP pMonitor); virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); SP outputResourceFrom(wl_client* client); void sendDone(); WP monitor; WP self; // will mark the protocol for removal, will be removed when no. of bound outputs is 0 (or when overwritten by a new global) void remove(); bool isDefunct(); // true if above was called private: void destroyResource(CWLOutputResource* resource); // std::vector> m_vOutputs; bool defunct = false; std::string szName = ""; struct { CHyprSignalListener modeChanged; } listeners; friend class CWLOutputResource; }; namespace PROTO { inline std::unordered_map> outputs; };