/**************************************************************************/
/*                                                                        */
/* Copyright (c) 2001, 2011 NoMachine (http://www.nomachine.com)          */
/* Copyright (c) 2008-2014 Oleksandr Shneyder <o.shneyder@phoca-gmbh.de>  */
/* Copyright (c) 2014-2016 Ulrich Sibiller <uli42@gmx.de>                 */
/* Copyright (c) 2014-2016 Mihai Moldovan <ionic@ionic.de>                */
/* Copyright (c) 2011-2016 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>*/
/* Copyright (c) 2015-2016 Qindel Group (http://www.qindel.com)           */
/*                                                                        */
/* NXCOMP, NX protocol compression and NX extensions to this software     */
/* are copyright of the aforementioned persons and companies.             */
/*                                                                        */
/* Redistribution and use of the present software is allowed according    */
/* to terms specified in the file LICENSE.nxcomp which comes in the       */
/* source distribution.                                                   */
/*                                                                        */
/* All rights reserved.                                                   */
/*                                                                        */
/* NOTE: This software has received contributions from various other      */
/* contributors, only the core maintainers and supporters are listed as   */
/* copyright holders. Please contact us, if you feel you should be listed */
/* as copyright holder, as well.                                          */
/*                                                                        */
/**************************************************************************/

#ifndef NXproto_H
#define NXproto_H

#ifdef __cplusplus
extern "C" {
#endif

#include <X11/X.h>
#include <X11/Xmd.h>
#include <X11/Xproto.h>

/*
 * Force the size to match the wire protocol.
 */
 
#define Drawable CARD32
#define GContext CARD32

#define sz_xNXGetControlParametersReq           4
#define sz_xNXGetCleanupParametersReq           4
#define sz_xNXGetImageParametersReq             4
#define sz_xNXGetUnpackParametersReq            8
#define sz_xNXGetShmemParametersReq             16
#define sz_xNXGetFontParametersReq              4
#define sz_xNXSetExposeParametersReq            8
#define sz_xNXSetCacheParametersReq             8
#define sz_xNXStartSplitReq                     8
#define sz_xNXEndSplitReq                       4
#define sz_xNXCommitSplitReq                    12
#define sz_xNXSetUnpackGeometryReq              24
#define sz_xNXSetUnpackColormapReq              16
#define sz_xNXSetUnpackAlphaReq                 16
#define sz_xNXPutPackedImageReq                 40
#define sz_xNXFreeUnpackReq                     4
#define sz_xNXFinishSplitReq                    4
#define sz_xNXAbortSplitReq                     4
#define sz_xNXFreeSplitReq                      4

#define sz_xGetControlParametersReply           32
#define sz_xGetCleanupParametersReply           32
#define sz_xGetImageParametersReply             32
#define sz_xGetUnpackParametersReply            32
#define sz_xGetShmemParametersReply             32

#define LINK_TYPE_LIMIT                         5

#define LINK_TYPE_NONE                          0
#define LINK_TYPE_MODEM                         1
#define LINK_TYPE_ISDN                          2
#define LINK_TYPE_ADSL                          3
#define LINK_TYPE_WAN                           4
#define LINK_TYPE_LAN                           5

/*
 * NX Replies.
 */

/*
 * The following reply has 4 new boolean
 * fields in the last protocol version.
 */

typedef struct _NXGetControlParametersReply {
    BYTE   type; /* Is X_Reply. */
    CARD8  linkType;
    CARD16 sequenceNumber B16;
    CARD32 length B32; /* Is 0. */
    CARD8  localMajor;
    CARD8  localMinor;
    CARD8  localPatch;
    CARD8  remoteMajor;
    CARD8  remoteMinor;
    CARD8  remotePatch;
    CARD16 splitTimeout B16;
    CARD16 motionTimeout B16;
    CARD8  splitMode;
    CARD8  pad1;
    CARD32 splitSize B32;
    CARD8  packMethod;
    CARD8  packQuality;
    CARD8  dataLevel;
    CARD8  streamLevel;
    CARD8  deltaLevel;
    CARD8  loadCache;
    CARD8  saveCache;
    CARD8  startupCache;
} xNXGetControlParametersReply;

typedef struct _NXGetCleanupParametersReply {
    BYTE   type; /* Is X_Reply. */
    BYTE   pad;
    CARD16 sequenceNumber B16;
    CARD32 length B32; /* Is 0. */
    BOOL   cleanGet;
    BOOL   cleanAlloc;
    BOOL   cleanFlush;
    BOOL   cleanSend;
    BOOL   cleanImages;
    BYTE   pad1, pad2, pad3;
    CARD32 pad4 B32;
    CARD32 pad5 B32;
    CARD32 pad6 B32;
    CARD32 pad7 B32;
} xNXGetCleanupParametersReply;

typedef struct _NXGetImageParametersReply {
    BYTE   type; /* Is X_Reply. */
    BYTE   pad;
    CARD16 sequenceNumber B16;
    CARD32 length B32; /* Is 0. */
    BOOL   imageSplit;
    BOOL   imageMask;
    BOOL   imageFrame;
    CARD8  imageMaskMethod;
    CARD8  imageSplitMethod;
    BYTE   pad1, pad2, pad3;
    CARD32 pad4 B32;
    CARD32 pad5 B32;
    CARD32 pad6 B32;
    CARD32 pad7 B32;
} xNXGetImageParametersReply;

/*
 * Data is made of PACK_METHOD_LIMIT values of
 * type BOOL telling which unpack capabilities
 * are implemented in proxy.
 */

typedef struct _NXGetUnpackParametersReply {
    BYTE   type; /* Is X_Reply. */
    BYTE   pad;
    CARD16 sequenceNumber B16;
    CARD32 length B32; /* Is PACK_METHOD_LIMIT / 4 from NXpack.h. */
    CARD8  entries;    /* Is PACK_METHOD_LIMIT. */
    BYTE   pad1, pad2, pad3;
    CARD32 pad4 B32;
    CARD32 pad5 B32;
    CARD32 pad6 B32;
    CARD32 pad7 B32;
    CARD32 pad8 B32;
} xNXGetUnpackParametersReply;

typedef struct _NXGetShmemParametersReply {
    BYTE   type;             /* Is X_Reply. */
    CARD8  stage;            /* As in the corresponding request. */
    CARD16 sequenceNumber B16;
    CARD32 length B32;       /* Is 0. */
    BOOL   clientEnabled;    /* SHM on path agent to proxy.      */
    BOOL   serverEnabled;    /* SHM on path proxy to X server.   */
    BYTE   pad1, pad2;       /* Previous values can be checked   */
    CARD32 clientSize B32;   /* at end of stage 2.               */
    CARD32 serverSize B32;
    CARD32 pad3 B32;
    CARD32 pad4 B32;
    CARD32 pad5 B32;
} xNXGetShmemParametersReply;

typedef struct _NXGetFontParametersReply {
    BYTE   type; /* Is X_Reply. */
    BYTE   pad1;
    CARD16 sequenceNumber B16;
    CARD32 length B32; /* Is length of path string + 1 / 4. */
    CARD32 pad2 B32;
    CARD32 pad3 B32;
    CARD32 pad4 B32;
    CARD32 pad5 B32;
    CARD32 pad6 B32;
    CARD32 pad7 B32;
} xNXGetFontParametersReply;

/*
 * NX Requests.
 */

typedef struct _NXGetControlParametersReq {
    CARD8  reqType;
    BYTE   pad;
    CARD16 length B16;
} xNXGetControlParametersReq;

typedef struct _NXGetCleanupParametersReq {
    CARD8  reqType;
    BYTE   pad;
    CARD16 length B16;
} xNXGetCleanupParametersReq;

typedef struct _NXGetImageParametersReq {
    CARD8  reqType;
    BYTE   pad;
    CARD16 length B16;
} xNXGetImageParametersReq;

typedef struct _NXGetUnpackParametersReq {
    CARD8  reqType;
    BYTE   pad;
    CARD16 length B16;
    CARD8  entries;
    BYTE   pad1, pad2, pad3;
} xNXGetUnpackParametersReq;

typedef struct _NXGetShmemParametersReq {
    CARD8    reqType;
    CARD8    stage;         /* It is between 0 and 2.     */
    CARD16   length B16;
    BOOL     enableClient;  /* X client side support is   */
    BOOL     enableServer;  /* not implemented yet.       */
    BYTE     pad1, pad2;
    CARD32   clientSegment; /* XID identifying the shared */
    CARD32   serverSegment; /* memory segments.           */
} xNXGetShmemParametersReq;

typedef struct _NXGetFontParametersReq {
    CARD8    reqType;
    CARD8    pad;
    CARD16   length B16;
} xNXGetFontParametersReq;

/*
 * The available split modes.
 */

#define NXSplitModeDefault              0
#define NXSplitModeAsync                1
#define NXSplitModeSync                 2

typedef struct _NXStartSplitReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
    CARD8  mode;
    BYTE   pad1, pad2, pad3;
} xNXStartSplitReq;

typedef struct _NXEndSplitReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
} xNXEndSplitReq;

typedef struct _NXCommitSplitReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
    CARD8  propagate;
    CARD8  request;
    BYTE   pad1, pad2;
    CARD32 position B32;
} xNXCommitSplitReq;

typedef struct _NXFinishSplitReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
} xNXFinishSplitReq;

typedef struct _NXAbortSplitReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
} xNXAbortSplitReq;

typedef struct _NXFreeSplitReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
} xNXFreeSplitReq;

typedef struct _NXSetExposeParametersReq {
    CARD8  reqType;
    BYTE   pad;
    CARD16 length B16;
    BOOL   expose;
    BOOL   graphicsExpose;
    BOOL   noExpose;
    BYTE   pad1;
} xNXSetExposeParametersReq;

typedef struct _NXSetCacheParametersReq {
    CARD8  reqType;
    BYTE   pad;
    CARD16 length B16;
    BOOL   enableCache;
    BOOL   enableSplit;
    BOOL   enableSave;
    BOOL   enableLoad;
} xNXSetCacheParametersReq;

typedef struct _NXSetUnpackGeometryReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
    CARD8  depth1Bpp;
    CARD8  depth4Bpp;
    CARD8  depth8Bpp;
    CARD8  depth16Bpp;
    CARD8  depth24Bpp;
    CARD8  depth32Bpp;
    BYTE   pad1, pad2;
    CARD32 redMask B32;
    CARD32 greenMask B32;
    CARD32 blueMask B32;
} xNXSetUnpackGeometryReq;

typedef struct _NXSetUnpackColormapReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
    CARD8  method;
    BYTE   pad1, pad2, pad3;
    CARD32 srcLength B32;
    CARD32 dstLength B32;
} xNXSetUnpackColormapReq;

typedef struct _NXSetUnpackAlphaReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
    CARD8  method;
    BYTE   pad1, pad2, pad3;
    CARD32 srcLength B32;
    CARD32 dstLength B32;
} xNXSetUnpackAlphaReq;

typedef struct _NXPutPackedImageReq {
    CARD8    reqType;
    CARD8    resource;
    CARD16   length B16;
    Drawable drawable B32;
    GContext gc B32;
    CARD8    method;
    CARD8    format;
    CARD8    srcDepth;
    CARD8    dstDepth;
    CARD32   srcLength B32;
    CARD32   dstLength B32;
    INT16    srcX B16, srcY B16;
    CARD16   srcWidth B16, srcHeight B16;
    INT16    dstX B16, dstY B16;
    CARD16   dstWidth B16, dstHeight B16;
} xNXPutPackedImageReq;

typedef struct _NXFreeUnpackReq {
    CARD8  reqType;
    CARD8  resource;
    CARD16 length B16;
} xNXFreeUnpackReq;

/*
 * The X_NXSplitData and X_NXSplitEvent opcodes
 * are used internally and are ignored if coming
 * from the agent.
 */

#define X_NXInternalGenericData         0
#define X_NXInternalGenericReply        1
#define X_NXInternalGenericRequest      255

#define X_NXInternalShapeExtension      128
#define X_NXInternalRenderExtension     129

#define X_NXFirstOpcode                 230
#define X_NXLastOpcode                  252

#define X_NXGetControlParameters        230
#define X_NXGetCleanupParameters        231
#define X_NXGetImageParameters          232
#define X_NXGetUnpackParameters         233
#define X_NXStartSplit                  234
#define X_NXEndSplit                    235
#define X_NXSplitData                   236
#define X_NXCommitSplit                 237
#define X_NXSetExposeParameters         240
#define X_NXSetUnpackGeometry           241
#define X_NXSetUnpackColormap           242
#define X_NXPutPackedImage              243
#define X_NXSplitEvent                  244
#define X_NXGetShmemParameters          245
#define X_NXSetUnpackAlpha              246
#define X_NXFreeUnpack                  247
#define X_NXFinishSplit                 248
#define X_NXAbortSplit                  249
#define X_NXFreeSplit                   250
#define X_NXGetFontParameters           251
#define X_NXSetCacheParameters          252

/*
 * The following events are received by the agent
 * in the form of a ClientMessage with the value
 * 0 in fields atom and window. The format is
 * always 32. Event specific data starts at byte
 * offset 12.
 *
 * These events are sent by the NX transport to
 * notify the agent about the result of a split
 * operation.
 */

#define NXNoSplitNotify                 1
#define NXStartSplitNotify              2
#define NXCommitSplitNotify             3
#define NXEndSplitNotify                4
#define NXEmptySplitNotify              5

/*
 * Notifications of collect events. These events
 * don't come from the NX transport but are put
 * back in client's event queue by NXlib.
 */

#define NXCollectImageNotify            8
#define NXCollectPropertyNotify         9
#define NXCollectGrabPointerNotify      10
#define NXCollectInputFocusNotify       11

#undef Drawable
#undef GContext

#ifdef __cplusplus
}
#endif

#endif /* NXproto_H */
