#pragma once #include #include #include #include "WaylandProtocol.hpp" #include "../helpers/Monitor.hpp" #include "core/Compositor.hpp" #include "color-management-v1.hpp" #include "types/ColorManagement.hpp" class CColorManager; class CColorManagementOutput; class CColorManagementImageDescription; class CColorManagementProtocol; class CColorManager { public: CColorManager(SP resource); bool good(); wl_client* client(); private: SP m_resource; }; class CColorManagementOutput { public: CColorManagementOutput(SP resource, WP monitor); bool good(); wl_client* client(); WP m_self; WP m_imageDescription; private: SP m_resource; wl_client* m_client = nullptr; WP m_monitor; friend class CColorManagementProtocol; friend class CColorManagementImageDescription; }; class CColorManagementSurface { public: CColorManagementSurface(SP surface_); // temporary interface for frog CM CColorManagementSurface(SP resource, SP surface_); bool good(); wl_client* client(); WP m_self; WP m_surface; const NColorManagement::SImageDescription& imageDescription(); bool hasImageDescription(); void setHasImageDescription(bool has); const hdr_output_metadata& hdrMetadata(); void setHDRMetadata(const hdr_output_metadata& metadata); bool needsHdrMetadataUpdate(); bool isHDR(); bool isWindowsScRGB(); private: SP m_resource; wl_client* m_client = nullptr; NColorManagement::SImageDescription m_imageDescription; NColorManagement::SImageDescription m_lastImageDescription; bool m_hasImageDescription = false; bool m_needsNewMetadata = false; hdr_output_metadata m_hdrMetadata; friend class CXXColorManagementSurface; friend class CFrogColorManagementSurface; }; class CColorManagementFeedbackSurface { public: CColorManagementFeedbackSurface(SP resource, SP surface_); bool good(); wl_client* client(); WP m_self; WP m_surface; private: SP m_resource; wl_client* m_client = nullptr; uint32_t m_currentPreferredId = 0; struct { CHyprSignalListener enter; CHyprSignalListener leave; } m_listeners; void onPreferredChanged(); friend class CColorManagementProtocol; }; class CColorManagementIccCreator { public: CColorManagementIccCreator(SP resource); bool good(); wl_client* client(); WP m_self; NColorManagement::SImageDescription m_settings; private: SP m_resource; wl_client* m_client = nullptr; }; class CColorManagementParametricCreator { public: CColorManagementParametricCreator(SP resource); bool good(); wl_client* client(); WP m_self; NColorManagement::SImageDescription m_settings; private: enum eValuesSet : uint32_t { // NOLINT PC_TF = (1 << 0), PC_TF_POWER = (1 << 1), PC_PRIMARIES = (1 << 2), PC_LUMINANCES = (1 << 3), PC_MASTERING_PRIMARIES = (1 << 4), PC_MASTERING_LUMINANCES = (1 << 5), PC_CLL = (1 << 6), PC_FALL = (1 << 7), }; SP m_resource; wl_client* m_client = nullptr; uint32_t m_valuesSet = 0; // enum eValuesSet }; class CColorManagementImageDescription { public: CColorManagementImageDescription(SP resource, bool allowGetInformation); bool good(); wl_client* client(); SP resource(); WP m_self; NColorManagement::SImageDescription m_settings; private: SP m_resource; wl_client* m_client = nullptr; bool m_allowGetInformation = false; friend class CColorManagementOutput; }; class CColorManagementImageDescriptionInfo { public: CColorManagementImageDescriptionInfo(SP resource, const NColorManagement::SImageDescription& settings_); bool good(); wl_client* client(); private: SP m_resource; wl_client* m_client = nullptr; NColorManagement::SImageDescription m_settings; }; class CColorManagementProtocol : public IWaylandProtocol { public: CColorManagementProtocol(const wl_interface* iface, const int& ver, const std::string& name, bool debug = false); virtual void bindManager(wl_client* client, void* data, uint32_t ver, uint32_t id); void onImagePreferredChanged(uint32_t preferredId); void onMonitorImageDescriptionChanged(WP monitor); bool isClientCMAware(wl_client* client); private: void destroyResource(CColorManager* resource); void destroyResource(CColorManagementOutput* resource); void destroyResource(CColorManagementSurface* resource); void destroyResource(CColorManagementFeedbackSurface* resource); void destroyResource(CColorManagementIccCreator* resource); void destroyResource(CColorManagementParametricCreator* resource); void destroyResource(CColorManagementImageDescription* resource); std::vector> m_managers; std::vector> m_outputs; std::vector> m_surfaces; std::vector> m_feedbackSurfaces; std::vector> m_iccCreators; std::vector> m_parametricCreators; std::vector> m_imageDescriptions; bool m_debug = false; friend class CColorManager; friend class CColorManagementOutput; friend class CColorManagementSurface; friend class CColorManagementFeedbackSurface; friend class CColorManagementIccCreator; friend class CColorManagementParametricCreator; friend class CColorManagementImageDescription; friend class CXXColorManagementSurface; friend class CFrogColorManagementSurface; }; namespace PROTO { inline UP colorManagement; };