⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qscreenvnc_p.h

📁 奇趣公司比较新的qt/emd版本
💻 H
字号:
/******************************************************************************** Copyright (C) 1992-2007 Trolltech ASA. All rights reserved.**** This file is part of the QtGui module of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file.  Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#ifndef QSCREENVNC_P_H#define QSCREENVNC_P_H////  W A R N I N G//  -------------//// This file is not part of the Qt API.  It exists for the convenience// of the QLibrary class.  This header file may change from version to version// without notice, or even be removed.//// We mean it.//#include "qscreenvnc_qws.h"#ifndef QT_NO_QWS_VNC#include <QtCore/qvarlengtharray.h>#include <QtNetwork/qtcpsocket.h>#include <QtNetwork/qtcpserver.h>#include <private/qsharedmemory_p.h>#ifndef QT_NO_QWS_CURSORclass QVNCCursor : public QScreenCursor{public:    QVNCCursor(QVNCScreen *s) : screen(s) { hwaccel = true; }    ~QVNCCursor() {}    void hide();    void show();    void set(const QImage &image, int hotx, int hoty);    void move(int x, int y);private:    void setDirty(const QRect &r) const;    QVNCScreen *screen;};#endif // QT_NO_QWS_CURSOR#define MAP_TILE_SIZE 16#define MAP_WIDTH 1280 / MAP_TILE_SIZE#define MAP_HEIGHT 1024 / MAP_TILE_SIZEclass QVNCDirtyMap{public:    QVNCDirtyMap(QScreen *screen);    virtual ~QVNCDirtyMap();    void reset();    bool dirty(int x, int y) const;    virtual void setDirty(int x, int y, bool force = false) = 0;    void setClean(int x, int y);    int bytesPerPixel;    int numDirty;    int mapWidth;    int mapHeight;protected:    uchar *map;    QScreen *screen;    uchar *buffer;    int bufferWidth;    int bufferHeight;    int bufferStride;    int numTiles;};template <class T>class QVNCDirtyMapOptimized : public QVNCDirtyMap{public:    QVNCDirtyMapOptimized(QScreen *screen) : QVNCDirtyMap(screen) {}    ~QVNCDirtyMapOptimized() {}    void setDirty(int x, int y, bool force = false);};class QRfbRect{public:    QRfbRect() {}    QRfbRect(quint16 _x, quint16 _y, quint16 _w, quint16 _h) {        x = _x; y = _y; w = _w; h = _h;    }    void read(QTcpSocket *s);    void write(QTcpSocket *s) const;    quint16 x;    quint16 y;    quint16 w;    quint16 h;};class QRfbPixelFormat{public:    static int size() { return 16; }    void read(QTcpSocket *s);    void write(QTcpSocket *s);    int bitsPerPixel;    int depth;    bool bigEndian;    bool trueColor;    int redBits;    int greenBits;    int blueBits;    int redShift;    int greenShift;    int blueShift;};class QRfbServerInit{public:    QRfbServerInit() { name = 0; }    ~QRfbServerInit() { delete[] name; }    int size() const { return QRfbPixelFormat::size() + 8 + strlen(name); }    void setName(const char *n);    void read(QTcpSocket *s);    void write(QTcpSocket *s);    quint16 width;    quint16 height;    QRfbPixelFormat format;    char *name;};class QRfbSetEncodings{public:    bool read(QTcpSocket *s);    quint16 count;};class QRfbFrameBufferUpdateRequest{public:    bool read(QTcpSocket *s);    char incremental;    QRfbRect rect;};class QRfbKeyEvent{public:    bool read(QTcpSocket *s);    char down;    int  keycode;    int  unicode;};class QRfbPointerEvent{public:    bool read(QTcpSocket *s);    uint buttons;    quint16 x;    quint16 y;};class QRfbClientCutText{public:    bool read(QTcpSocket *s);    quint32 length;};class QVNCServer;class QVNCScreenPrivate : public QObject{public:    QVNCScreenPrivate(QVNCScreen *parent);    ~QVNCScreenPrivate();    void setDirty(const QRect &rect, bool force = false);    void configure();    qreal dpiX;    qreal dpiY;    bool doOnScreenSurface;    QVNCDirtyMap *dirty;    int refreshRate;    QVNCServer *vncServer;    QScreen *subscreen;#ifndef QT_NO_QWS_MULTIPROCESS    QSharedMemory *shm;#endif    QVNCScreen *q_ptr;};class QRfbEncoder{public:    QRfbEncoder(QVNCServer *s) : server(s) {}    virtual ~QRfbEncoder() {}    virtual void write() = 0;protected:    QVNCServer *server;};class QRfbRawEncoder : public QRfbEncoder{public:    QRfbRawEncoder(QVNCServer *s) : QRfbEncoder(s) {}    void write();private:    QByteArray buffer;};template <class SRC> class QRfbHextileEncoder;template <class SRC>class QRfbSingleColorHextile{public:    QRfbSingleColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}    bool read(const uchar *data, int width, int height, int stride);    void write(QTcpSocket *socket) const;private:    QRfbHextileEncoder<SRC> *encoder;};template <class SRC>class QRfbDualColorHextile{public:    QRfbDualColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}    bool read(const uchar *data, int width, int height, int stride);    void write(QTcpSocket *socket) const;private:    struct Rect {        quint8 xy;        quint8 wh;    } Q_PACKED rects[8 * 16];    quint8 numRects;    QRfbHextileEncoder<SRC> *encoder;private:    inline int lastx() const { return rectx(numRects); }    inline int lasty() const { return recty(numRects); }    inline int rectx(int r) const { return rects[r].xy >> 4; }    inline int recty(int r) const { return rects[r].xy & 0x0f; }    inline int width(int r) const { return (rects[r].wh >> 4) + 1; }    inline int height(int r) const { return (rects[r].wh & 0x0f) + 1; }    inline void setX(int r, int x) {        rects[r].xy = (x << 4) | (rects[r].xy & 0x0f);    }    inline void setY(int r, int y) {        rects[r].xy = (rects[r].xy & 0xf0) | y;    }    inline void setWidth(int r, int width) {        rects[r].wh = ((width - 1) << 4) | (rects[r].wh & 0x0f);    }    inline void setHeight(int r, int height) {        rects[r].wh = (rects[r].wh & 0xf0) | (height - 1);    }    inline void setWidth(int width) { setWidth(numRects, width); }    inline void setHeight(int height) { setHeight(numRects, height); }    inline void setX(int x) { setX(numRects, x); }    inline void setY(int y) { setY(numRects, y); }    void next();};template <class SRC>class QRfbMultiColorHextile{public:    QRfbMultiColorHextile(QRfbHextileEncoder<SRC> *e) : encoder(e) {}    bool read(const uchar *data, int width, int height, int stride);    void write(QTcpSocket *socket) const;private:    inline quint8* rect(int r) {        return rects.data() + r * (bpp + 2);    }    inline const quint8* rect(int r) const {        return rects.constData() + r * (bpp + 2);    }    inline void setX(int r, int x) {        quint8 *ptr = rect(r) + bpp;        *ptr = (x << 4) | (*ptr & 0x0f);    }    inline void setY(int r, int y) {        quint8 *ptr = rect(r) + bpp;        *ptr = (*ptr & 0xf0) | y;    }    void setColor(SRC color);    inline int rectx(int r) const {        const quint8 *ptr = rect(r) + bpp;        return *ptr >> 4;    }    inline int recty(int r) const {        const quint8 *ptr = rect(r) + bpp;        return *ptr & 0x0f;    }    inline void setWidth(int r, int width) {        quint8 *ptr = rect(r) + bpp + 1;        *ptr = ((width - 1) << 4) | (*ptr & 0x0f);    }    inline void setHeight(int r, int height) {        quint8 *ptr = rect(r) + bpp + 1;        *ptr = (*ptr & 0xf0) | (height - 1);    }    bool beginRect();    void endRect();    static const int maxRectsSize = 16 * 16;    QVarLengthArray<quint8, maxRectsSize> rects;    quint8 bpp;    quint8 numRects;    QRfbHextileEncoder<SRC> *encoder;};template <class SRC>class QRfbHextileEncoder : public QRfbEncoder{public:    QRfbHextileEncoder(QVNCServer *s);    void write();private:    enum SubEncoding {        Raw = 1,        BackgroundSpecified = 2,        ForegroundSpecified = 4,        AnySubrects = 8,        SubrectsColoured = 16    };    QByteArray buffer;    QRfbSingleColorHextile<SRC> singleColorHextile;    QRfbDualColorHextile<SRC> dualColorHextile;    QRfbMultiColorHextile<SRC> multiColorHextile;    SRC bg;    SRC fg;    bool newBg;    bool newFg;    friend class QRfbSingleColorHextile<SRC>;    friend class QRfbDualColorHextile<SRC>;    friend class QRfbMultiColorHextile<SRC>;};class QVNCServer : public QObject{    Q_OBJECTpublic:    QVNCServer(QVNCScreen *screen);    QVNCServer(QVNCScreen *screen, int id);    ~QVNCServer();    void setDirty();    inline bool isConnected() const { return state == Connected; }    inline void setRefreshRate(int rate) { refreshRate = rate; }    enum ClientMsg { SetPixelFormat = 0,                     FixColourMapEntries = 1,                     SetEncodings = 2,                     FramebufferUpdateRequest = 3,                     KeyEvent = 4,                     PointerEvent = 5,                     ClientCutText = 6 };    enum ServerMsg { FramebufferUpdate = 0,                     SetColourMapEntries = 1 };    void convertPixels(char *dst, const char *src, int count) const;    inline int clientBytesPerPixel() const {        return pixelFormat.bitsPerPixel / 8;    }    inline QVNCScreen* screen() const { return qvnc_screen; }    inline QVNCDirtyMap* dirtyMap() const { return qvnc_screen->d_ptr->dirty; }    inline QTcpSocket* clientSocket() const { return client; }    QImage screenImage() const;    inline bool doPixelConversion() const { return needConversion; }private:    void setPixelFormat();    void setEncodings();    void frameBufferUpdateRequest();    void pointerEvent();    void keyEvent();    void clientCutText();    bool pixelConversionNeeded() const;private slots:    void newConnection();    void readClient();    void checkUpdate();    void discardClient();private:    void init(uint port);    enum ClientState { Unconnected, Protocol, Init, Connected };    QTimer *timer;    QTcpServer *serverSocket;    QTcpSocket *client;    ClientState state;    quint8 msgType;    bool handleMsg;    QRfbPixelFormat pixelFormat;    Qt::KeyboardModifiers keymod;    int encodingsPending;    int cutTextPending;    uint supportCopyRect : 1;    uint supportRRE : 1;    uint supportCoRRE : 1;    uint supportHextile : 1;    uint supportZRLE : 1;    uint supportCursor : 1;    uint supportDesktopSize : 1;    bool wantUpdate;    bool sameEndian;    bool needConversion;#if Q_BYTE_ORDER == Q_BIG_ENDIAN    bool swapBytes;#endif    int refreshRate;    QVNCScreen *qvnc_screen;    QRfbEncoder *encoder;};#endif // QT_NO_QWS_VNC#endif // QSCREENVNC_P_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -