/**************************************************************************/
/*                                                                        */
/* 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 NXvars_H
#define NXvars_H

/*
 * This can be included by the proxy or another
 * layer that doesn't use Xlib.
 */

#if !defined(_XLIB_H_) && !defined(_XKBSRV_H_)

#define NeedFunctionPrototypes  1

#define Display  void

#endif

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Display flush policies.
 */

#define NXPolicyImmediate    1
#define NXPolicyDeferred     2

/*
 * Type of flush.
 */

#define NXFlushBuffer        0
#define NXFlushLink          1

/*
 * Type of statistics.
 */

#define NXStatisticsPartial  0
#define NXStatisticsTotal    1

/*
 * Reason why the display is blocking.
 */

#define NXBlockRead          1
#define NXBlockWrite         2

/*
 * Set if the client is interested in ignoring
 * the display error and continue with the exe-
 * cution of the program. By default the usual
 * Xlib behaviour is gotten, and the library
 * will call an exit().
 */

extern int _NXHandleDisplayError;

/*
 * The function below is called whenever Xlib is
 * going to perform an I/O operation. The funct-
 * ion can be redefined to include additional
 * checks aimed at detecting if the display needs
 * to be closed, for example because of an event
 * or a signal mandating the end of the session.
 * In this way the client program can regain the
 * control before Xlib blocks waiting for input
 * from the network.
 */

typedef int (*NXDisplayErrorPredicate)(
#if NeedFunctionPrototypes
    Display*            /* display */,
    int                 /* reason */
#endif
);

extern NXDisplayErrorPredicate _NXDisplayErrorFunction;

/*
 * This is called when Xlib is going to block
 * waiting for the display to become readable or
 * writable. The client can use the hook to run
 * any arbitrary operation that may require some
 * time to complete. The user should not try to
 * read or write to the display inside the call-
 * back routine.
 */

typedef void (*NXDisplayBlockHandler)(
#if NeedFunctionPrototypes
    Display*            /* display */,
    int                 /* reason */
#endif
);

extern NXDisplayBlockHandler _NXDisplayBlockFunction;

/*
 * Used to notify the program when more data
 * is written to the socket.
 */

typedef void (*NXDisplayWriteHandler)(
#if NeedFunctionPrototypes
    Display*            /* display */,
    int                 /* length */
#endif
);

extern NXDisplayWriteHandler _NXDisplayWriteFunction;

/*
 * This callback is used to notify the agent
 * that the proxy link has been flushed.
 */

typedef void (*NXDisplayFlushHandler)(
#if NeedFunctionPrototypes
    Display*            /* display */,
    int                 /* length */
#endif
);

extern NXDisplayFlushHandler _NXDisplayFlushFunction;

/*
 * Used by the NX transport to get an arbitrary
 * string to add to its protocol statistics.
 */

typedef void (*NXDisplayStatisticsHandler)(
#if NeedFunctionPrototypes
    Display*            /* display */,
    char*               /* buffer */,
    int                 /* size */
#endif
);

extern NXDisplayStatisticsHandler _NXDisplayStatisticsFunction;

/*
 * Let users redefine the function printing an
 * error message in the case of a out-of-order
 * sequence number.
 */

typedef void (*NXLostSequenceHandler)(
#if NeedFunctionPrototypes
    Display*            /* display */,
    unsigned long       /* newseq */,
    unsigned long       /* lastseq */,
    unsigned int        /* type */
#endif
);

extern NXLostSequenceHandler _NXLostSequenceFunction;

/*
 * Let the X server run the children processes
 * (as for example the keyboard initialization
 * utilities) by using the native system libra-
 * ries, instead of the libraries shipped with
 * the NX environment. If set, the Popen() in
 * the X server will remove the LD_LIBRARY_PATH
 * setting from the environment before calling
 * the execl() function in the child process.
 */

extern int _NXUnsetLibraryPath;

#ifdef __cplusplus
}
#endif

#endif /* NXvars_H */
