1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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;
};
|