#pragma once #include #include "../defines.hpp" #include "../helpers/signal/Signal.hpp" #include "../helpers/Format.hpp" #include "WaylandProtocol.hpp" #include "ImageCaptureSource.hpp" #include "ext-image-copy-capture-v1.hpp" class IHLBuffer; class CWLPointerResource; namespace Screenshare { class CCursorshareSession; class CScreenshareSession; class CScreenshareFrame; }; class CImageCopyCaptureFrame { public: CImageCopyCaptureFrame(SP resource, WP session); ~CImageCopyCaptureFrame(); bool good(); private: SP m_resource; WP m_session; UP m_frame; bool m_captured = false; SP m_buffer; CRegion m_clientDamage; friend class CImageCopyCaptureSession; }; class CImageCopyCaptureSession { public: CImageCopyCaptureSession(SP resource, SP source, extImageCopyCaptureManagerV1Options options); ~CImageCopyCaptureSession(); bool good(); private: SP m_resource; SP m_source; UP m_session; WP m_frame; Vector2D m_bufferSize = Vector2D(0, 0); bool m_paintCursor = true; struct { CHyprSignalListener constraintsChanged; CHyprSignalListener stopped; } m_listeners; WP m_self; // void sendConstraints(); friend class CImageCopyCaptureProtocol; friend class CImageCopyCaptureFrame; }; class CImageCopyCaptureCursorSession { public: CImageCopyCaptureCursorSession(SP resource, SP source, SP pointer); ~CImageCopyCaptureCursorSession(); bool good(); private: SP m_resource; SP m_source; SP m_pointer; // cursor session stuff bool m_entered = false; Vector2D m_pos = Vector2D(0, 0); Vector2D m_hotspot = Vector2D(0, 0); // capture session stuff SP m_sessionResource; UP m_session; Vector2D m_bufferSize = Vector2D(0, 0); // frame stuff SP m_frameResource; bool m_captured = false; SP m_buffer; struct { CHyprSignalListener constraintsChanged; CHyprSignalListener stopped; CHyprSignalListener commit; } m_listeners; void sendCursorEvents(); void createFrame(SP resource); void destroyCaptureSession(); void sendConstraints(); }; class CImageCopyCaptureProtocol : public IWaylandProtocol { public: CImageCopyCaptureProtocol(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); void destroyResource(CExtImageCopyCaptureManagerV1* resource); void destroyResource(CImageCopyCaptureSession* resource); void destroyResource(CImageCopyCaptureCursorSession* resource); void destroyResource(CImageCopyCaptureFrame* resource); private: std::vector> m_managers; std::vector> m_sessions; std::vector> m_cursorSessions; std::vector> m_frames; friend class CImageCopyCaptureSession; }; namespace PROTO { inline UP imageCopyCapture; };