diff options
| author | Ikalco <73481042+ikalco@users.noreply.github.com> | 2026-02-22 06:30:11 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-22 12:30:11 +0000 |
| commit | b4ee4674f9a74e3d602c7fb17bc09f79d221583c (patch) | |
| tree | 294bbb207c44e778dd78afda65cbd79181f04124 /src/protocols/ImageCopyCapture.hpp | |
| parent | 93dbf884261efcb387e920b1cd0e4ed5b288bc3a (diff) | |
protocols: implement image-capture-source-v1 and image-copy-capture-v1 (#11709)
Implements the new screencopy protocols
Diffstat (limited to 'src/protocols/ImageCopyCapture.hpp')
| -rw-r--r-- | src/protocols/ImageCopyCapture.hpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/protocols/ImageCopyCapture.hpp b/src/protocols/ImageCopyCapture.hpp new file mode 100644 index 00000000..b8cfa1e8 --- /dev/null +++ b/src/protocols/ImageCopyCapture.hpp @@ -0,0 +1,133 @@ +#pragma once + +#include <vector> + +#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<CExtImageCopyCaptureFrameV1> resource, WP<CImageCopyCaptureSession> session); + ~CImageCopyCaptureFrame(); + + bool good(); + + private: + SP<CExtImageCopyCaptureFrameV1> m_resource; + WP<CImageCopyCaptureSession> m_session; + UP<Screenshare::CScreenshareFrame> m_frame; + + bool m_captured = false; + SP<IHLBuffer> m_buffer; + CRegion m_clientDamage; + + friend class CImageCopyCaptureSession; +}; + +class CImageCopyCaptureSession { + public: + CImageCopyCaptureSession(SP<CExtImageCopyCaptureSessionV1> resource, SP<CImageCaptureSource> source, extImageCopyCaptureManagerV1Options options); + ~CImageCopyCaptureSession(); + + bool good(); + + private: + SP<CExtImageCopyCaptureSessionV1> m_resource; + + SP<CImageCaptureSource> m_source; + UP<Screenshare::CScreenshareSession> m_session; + WP<CImageCopyCaptureFrame> m_frame; + + Vector2D m_bufferSize = Vector2D(0, 0); + bool m_paintCursor = true; + + struct { + CHyprSignalListener constraintsChanged; + CHyprSignalListener stopped; + } m_listeners; + + WP<CImageCopyCaptureSession> m_self; + + // + void sendConstraints(); + + friend class CImageCopyCaptureProtocol; + friend class CImageCopyCaptureFrame; +}; + +class CImageCopyCaptureCursorSession { + public: + CImageCopyCaptureCursorSession(SP<CExtImageCopyCaptureCursorSessionV1> resource, SP<CImageCaptureSource> source, SP<CWLPointerResource> pointer); + ~CImageCopyCaptureCursorSession(); + + bool good(); + + private: + SP<CExtImageCopyCaptureCursorSessionV1> m_resource; + SP<CImageCaptureSource> m_source; + SP<CWLPointerResource> 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<CExtImageCopyCaptureSessionV1> m_sessionResource; + UP<Screenshare::CCursorshareSession> m_session; + Vector2D m_bufferSize = Vector2D(0, 0); + + // frame stuff + SP<CExtImageCopyCaptureFrameV1> m_frameResource; + bool m_captured = false; + SP<IHLBuffer> m_buffer; + + struct { + CHyprSignalListener constraintsChanged; + CHyprSignalListener stopped; + CHyprSignalListener commit; + } m_listeners; + + void sendCursorEvents(); + + void createFrame(SP<CExtImageCopyCaptureFrameV1> 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<SP<CExtImageCopyCaptureManagerV1>> m_managers; + std::vector<SP<CImageCopyCaptureSession>> m_sessions; + std::vector<SP<CImageCopyCaptureCursorSession>> m_cursorSessions; + + std::vector<SP<CImageCopyCaptureFrame>> m_frames; + + friend class CImageCopyCaptureSession; +}; + +namespace PROTO { + inline UP<CImageCopyCaptureProtocol> imageCopyCapture; +}; |
