Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qvnc_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QVNC_P_H
5#define QVNC_P_H
6
7#include "qvncscreen.h"
8
9#include <QtCore/QLoggingCategory>
10#include <QtCore/qbytearray.h>
11#include <QtCore/qvarlengtharray.h>
12#include <qpa/qplatformcursor.h>
13
15
17
18class QTcpSocket;
19class QTcpServer;
20
21class QVncScreen;
22class QVncServer;
23class QVncClientCursor;
24class QVncClient;
25
26// This fits with the VNC hextile messages
27#define MAP_TILE_SIZE 16
28
30{
31public:
33 virtual ~QVncDirtyMap();
34
35 void reset();
36 bool dirty(int x, int y) const;
37 virtual void setDirty(int x, int y, bool force = false) = 0;
38 void setClean(int x, int y);
39
45
46protected:
53};
54
55template <class T>
57{
58public:
61
62 void setDirty(int x, int y, bool force = false) override;
63};
64
65
67{
68public:
71 x = _x; y = _y; w = _w; h = _h;
72 }
73
74 void read(QTcpSocket *s);
75 void write(QTcpSocket *s) const;
76
81};
82
84{
85public:
86 static int size() { return 16; }
87
88 void read(QTcpSocket *s);
89 void write(QTcpSocket *s);
90
92 int depth;
101};
102
104{
105public:
106 QRfbServerInit() { name = nullptr; }
107 ~QRfbServerInit() { delete[] name; }
108
109 int size() const { return QRfbPixelFormat::size() + 8 + strlen(name); }
110 void setName(const char *n);
111
112 void read(QTcpSocket *s);
113 void write(QTcpSocket *s);
114
118 char *name;
119};
120
122{
123public:
124 bool read(QTcpSocket *s);
125
127};
128
130{
131public:
132 bool read(QTcpSocket *s);
133
136};
137
139{
140public:
141 bool read(QTcpSocket *s);
142
143 char down;
146};
147
149{
150public:
151 bool read(QTcpSocket *s);
152
153 Qt::MouseButtons buttons;
156};
157
159{
160public:
161 bool read(QTcpSocket *s);
162
164};
165
167{
168public:
170 virtual ~QRfbEncoder() {}
171
172 virtual void write() = 0;
173
174protected:
176};
177
179{
180public:
182
183 void write() override;
184
185private:
187};
188
189template <class SRC> class QRfbHextileEncoder;
190
191template <class SRC>
193{
194public:
195 QRfbSingleColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
196 bool read(const uchar *data, int width, int height, int stride);
197 void write(QTcpSocket *socket) const;
198
199private:
200 QRfbHextileEncoder<SRC> *encoder;
201};
202
203template <class SRC>
205{
206public:
207 QRfbDualColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
208 bool read(const uchar *data, int width, int height, int stride);
209 void write(QTcpSocket *socket) const;
210
211private:
212 struct Rect {
213 quint8 xy;
214 quint8 wh;
215 } Q_PACKED rects[8 * 16];
216
217 quint8 numRects;
218 QRfbHextileEncoder<SRC> *encoder;
219
220private:
221 inline int lastx() const { return rectx(numRects); }
222 inline int lasty() const { return recty(numRects); }
223 inline int rectx(int r) const { return rects[r].xy >> 4; }
224 inline int recty(int r) const { return rects[r].xy & 0x0f; }
225 inline int width(int r) const { return (rects[r].wh >> 4) + 1; }
226 inline int height(int r) const { return (rects[r].wh & 0x0f) + 1; }
227
228 inline void setX(int r, int x) {
229 rects[r].xy = (x << 4) | (rects[r].xy & 0x0f);
230 }
231 inline void setY(int r, int y) {
232 rects[r].xy = (rects[r].xy & 0xf0) | y;
233 }
234 inline void setWidth(int r, int width) {
235 rects[r].wh = ((width - 1) << 4) | (rects[r].wh & 0x0f);
236 }
237 inline void setHeight(int r, int height) {
238 rects[r].wh = (rects[r].wh & 0xf0) | (height - 1);
239 }
240
241 inline void setWidth(int width) { setWidth(numRects, width); }
242 inline void setHeight(int height) { setHeight(numRects, height); }
243 inline void setX(int x) { setX(numRects, x); }
244 inline void setY(int y) { setY(numRects, y); }
245 void next();
246};
247
248template <class SRC>
250{
251public:
252 QRfbMultiColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}
253 bool read(const uchar *data, int width, int height, int stride);
254 void write(QTcpSocket *socket) const;
255
256private:
257 inline quint8* rect(int r) {
258 return rects.data() + r * (bpp + 2);
259 }
260 inline const quint8* rect(int r) const {
261 return rects.constData() + r * (bpp + 2);
262 }
263 inline void setX(int r, int x) {
264 quint8 *ptr = rect(r) + bpp;
265 *ptr = (x << 4) | (*ptr & 0x0f);
266 }
267 inline void setY(int r, int y) {
268 quint8 *ptr = rect(r) + bpp;
269 *ptr = (*ptr & 0xf0) | y;
270 }
271 void setColor(SRC color);
272 inline int rectx(int r) const {
273 const quint8 *ptr = rect(r) + bpp;
274 return *ptr >> 4;
275 }
276 inline int recty(int r) const {
277 const quint8 *ptr = rect(r) + bpp;
278 return *ptr & 0x0f;
279 }
280 inline void setWidth(int r, int width) {
281 quint8 *ptr = rect(r) + bpp + 1;
282 *ptr = ((width - 1) << 4) | (*ptr & 0x0f);
283 }
284 inline void setHeight(int r, int height) {
285 quint8 *ptr = rect(r) + bpp + 1;
286 *ptr = (*ptr & 0xf0) | (height - 1);
287 }
288
289 bool beginRect();
290 void endRect();
291
292 static const int maxRectsSize = 16 * 16;
293 QVarLengthArray<quint8, maxRectsSize> rects;
294
295 quint8 bpp;
296 quint8 numRects;
297 QRfbHextileEncoder<SRC> *encoder;
298};
299
300template <class SRC>
302{
303public:
305 void write();
306
307private:
308 enum SubEncoding {
309 Raw = 1,
310 BackgroundSpecified = 2,
311 ForegroundSpecified = 4,
312 AnySubrects = 8,
313 SubrectsColoured = 16
314 };
315
317 QRfbSingleColorHextile<SRC> singleColorHextile;
318 QRfbDualColorHextile<SRC> dualColorHextile;
319 QRfbMultiColorHextile<SRC> multiColorHextile;
320
321 SRC bg;
322 SRC fg;
323 bool newBg;
324 bool newFg;
325
326 friend class QRfbSingleColorHextile<SRC>;
327 friend class QRfbDualColorHextile<SRC>;
328 friend class QRfbMultiColorHextile<SRC>;
329};
330
331#if QT_CONFIG(cursor)
332class QVncClientCursor : public QPlatformCursor
333{
334public:
335 QVncClientCursor();
336 ~QVncClientCursor();
337
338 void write(QVncClient *client) const;
339
340 void changeCursor(QCursor *widgetCursor, QWindow *window) override;
341
342 void addClient(QVncClient *client);
343 uint removeClient(QVncClient *client);
344
346 QPoint hotspot;
347 QList<QVncClient *> clients;
348};
349#endif // QT_CONFIG(cursor)
350
351class QVncServer : public QObject
352{
354public:
356 ~QVncServer();
357
360
361 void setDirty();
362
363
364 inline QVncScreen* screen() const { return qvnc_screen; }
365 inline QVncDirtyMap* dirtyMap() const { return qvnc_screen->dirty; }
366 QImage screenImage() const;
367 void discardClient(QVncClient *client);
368
369private slots:
370 void newConnection();
371 void init();
372
373private:
374 QTcpServer *serverSocket;
375 QList<QVncClient*> clients;
376 QVncScreen *qvnc_screen;
377 quint16 m_port;
378};
379
381
382#endif
\inmodule QtCore
Definition qbytearray.h:57
The QCursor class provides a mouse cursor with an arbitrary shape.
Definition qcursor.h:45
\inmodule QtGui
Definition qimage.h:37
\inmodule QtCore
Definition qobject.h:103
The QPlatformCursor class provides information about pointer device events (movement,...
\inmodule QtCore\reentrant
Definition qpoint.h:25
bool read(QTcpSocket *s)
Definition qvnc.cpp:405
quint32 length
Definition qvnc_p.h:163
void write(QTcpSocket *socket) const
bool read(const uchar *data, int width, int height, int stride)
QRfbDualColorHextile(QRfbHextileEncoder< SRC > *e)
Definition qvnc_p.h:207
virtual void write()=0
virtual ~QRfbEncoder()
Definition qvnc_p.h:170
QVncClient * client
Definition qvnc_p.h:175
QRfbEncoder(QVncClient *s)
Definition qvnc_p.h:169
bool read(QTcpSocket *s)
Definition qvnc.cpp:332
QRfbHextileEncoder(QVncServer *s)
int keycode
Definition qvnc_p.h:144
bool read(QTcpSocket *s)
Definition qvnc.cpp:343
char down
Definition qvnc_p.h:143
int unicode
Definition qvnc_p.h:145
QRfbMultiColorHextile(QRfbHextileEncoder< SRC > *e)
Definition qvnc_p.h:252
void write(QTcpSocket *socket) const
bool read(const uchar *data, int width, int height, int stride)
static int size()
Definition qvnc_p.h:86
bool trueColor
Definition qvnc_p.h:94
bool bigEndian
Definition qvnc_p.h:93
void read(QTcpSocket *s)
Definition qvnc.cpp:229
int bitsPerPixel
Definition qvnc_p.h:91
void write(QTcpSocket *s)
Definition qvnc.cpp:255
bool read(QTcpSocket *s)
Definition qvnc.cpp:381
Qt::MouseButtons buttons
Definition qvnc_p.h:153
void write() override
Definition qvnc.cpp:418
QRfbRawEncoder(QVncClient *s)
Definition qvnc_p.h:181
quint16 x
Definition qvnc_p.h:77
QRfbRect()
Definition qvnc_p.h:69
void read(QTcpSocket *s)
Definition qvnc.cpp:209
QRfbRect(quint16 _x, quint16 _y, quint16 _w, quint16 _h)
Definition qvnc_p.h:70
quint16 w
Definition qvnc_p.h:79
quint16 h
Definition qvnc_p.h:80
void write(QTcpSocket *s) const
Definition qvnc.cpp:219
quint16 y
Definition qvnc_p.h:78
void read(QTcpSocket *s)
Definition qvnc.cpp:289
int size() const
Definition qvnc_p.h:109
quint16 width
Definition qvnc_p.h:115
QRfbPixelFormat format
Definition qvnc_p.h:117
void setName(const char *n)
Definition qvnc.cpp:282
char * name
Definition qvnc_p.h:118
quint16 height
Definition qvnc_p.h:116
void write(QTcpSocket *s)
Definition qvnc.cpp:306
quint16 count
Definition qvnc_p.h:126
bool read(QTcpSocket *s)
Definition qvnc.cpp:319
void write(QTcpSocket *socket) const
QRfbSingleColorHextile(QRfbHextileEncoder< SRC > *e)
Definition qvnc_p.h:195
bool read(const uchar *data, int width, int height, int stride)
The QTcpServer class provides a TCP-based server.
Definition qtcpserver.h:22
The QTcpSocket class provides a TCP socket.
Definition qtcpsocket.h:18
QVncDirtyMapOptimized(QVncScreen *screen)
Definition qvnc_p.h:59
void setDirty(int x, int y, bool force=false) override
Definition qvnc.cpp:66
int bufferStride
Definition qvnc_p.h:51
int mapWidth
Definition qvnc_p.h:43
uchar * buffer
Definition qvnc_p.h:48
int bytesPerPixel
Definition qvnc_p.h:41
int numTiles
Definition qvnc_p.h:52
int mapHeight
Definition qvnc_p.h:44
int bufferHeight
Definition qvnc_p.h:50
QVncDirtyMap(QVncScreen *screen)
Definition qvnc.cpp:26
QVncScreen * screen
Definition qvnc_p.h:40
int numDirty
Definition qvnc_p.h:42
void reset()
Definition qvnc.cpp:47
uchar * map
Definition qvnc_p.h:47
virtual ~QVncDirtyMap()
Definition qvnc.cpp:41
int bufferWidth
Definition qvnc_p.h:49
bool dirty(int x, int y) const
Definition qvnc.cpp:54
virtual void setDirty(int x, int y, bool force=false)=0
void setClean(int x, int y)
Definition qvnc.cpp:59
QVncDirtyMap * dirty
Definition qvncscreen.h:49
QVncScreen * screen() const
Definition qvnc_p.h:364
~QVncServer()
Definition qvnc.cpp:609
QImage screenImage() const
Definition qvnc.cpp:644
void discardClient(QVncClient *client)
Definition qvnc.cpp:635
void setDirty()
Definition qvnc.cpp:614
@ SetColourMapEntries
Definition qvnc_p.h:359
@ FramebufferUpdate
Definition qvnc_p.h:358
QVncDirtyMap * dirtyMap() const
Definition qvnc_p.h:365
QVncServer(QVncScreen *screen, quint16 port=5900)
Definition qvnc.cpp:590
\inmodule QtGui
Definition qwindow.h:63
QCursor cursor
rect
[4]
Combined button and popup list for selecting options.
EGLOutputPortEXT port
#define Q_DECLARE_LOGGING_CATEGORY(name)
static ControlElement< T > * ptr(QWidget *widget)
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLboolean r
[2]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
const void GLsizei GLsizei stride
GLenum GLuint buffer
GLint GLsizei width
GLuint color
[2]
GLuint name
GLfloat n
GLint y
GLfloat GLfloat GLfloat GLfloat h
GLdouble s
[6]
Definition qopenglext.h:235
#define Q_OBJECT
#define slots
unsigned int quint32
Definition qtypes.h:50
unsigned char uchar
Definition qtypes.h:32
unsigned short quint16
Definition qtypes.h:48
unsigned int uint
Definition qtypes.h:34
unsigned char quint8
Definition qtypes.h:46
gzip write("uncompressed data")
QTcpSocket * socket
[1]
aWidget window() -> setWindowTitle("New Window Title")
[2]