/*
 *  (c) Copyright 1990 Sun Microsystems, Inc. Sun design patents
 *  pending in the U.S. and foreign countries. See LEGAL NOTICE
 *  file for terms of the license.
 */

#ifndef xview_selection_DEFINED
#define xview_selection_DEFINED

/*
 ***********************************************************************
 *      Include Files
 ***********************************************************************
 */

#include <sys/time.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
#include <xview/generic.h>
#include <errno.h>

/*
 ***********************************************************************
 *      Definitions and Macros
 ***********************************************************************
 */

/*
 * Package definitions
 */
#define SELECTION   &xv_sel_pkg
#define SELECTION_OWNER &xv_sel_owner_pkg
#define SELECTION_REQUESTOR &xv_sel_requestor_pkg
#define SELECTION_ITEM  &xv_sel_item_pkg

/*
 * Various utility macros
 */

/*
 * Public constants
 */

/*
 * PRIVATE #defines
 */

#define SEL_ATTR(type, ordinal) ATTR(ATTR_PKG_SELECTION, type, ordinal)
#define SEL_ATTR_LIST(ltype, type, ordinal) \
    SEL_ATTR(ATTR_LIST_INLINE((ltype), (type)), (ordinal))

/* Errors */
#define SEL_ERROR              -1

#define SEL_BEGIN_MULTIPLE      2
#define SEL_END_MULTIPLE        4
#define SEL_MULTIPLE            8

#define SEL_BAD_TIME            0
#define SEL_BAD_WIN_ID          1
#define SEL_BAD_PROPERTY        2
#define SEL_BAD_CONVERSION      3
#define SEL_TIMEDOUT            4
#define SEL_PROPERTY_DELETED    5
#define SEL_BAD_PROPERTY_EVENT  6

#define SEL_INCREMENT        2
#define SEL_EMPTY            1
#define SEL_PROPERTY_DATA    1

#define SEL_BUSY             1
#define SEL_LOSE             2
#define SEL_LOCAL_PROCESS    4
#define SEL_ADD_PROP_NOTIFY  8
#define SEL_INTERNAL_ERROR   16

#define OLD_SEL_CLIENT       2
#define NEW_SEL_CLIENT       4

#define MAX_NUM_INCR         20

#define MAX_SEL_BUFF_SIZE(dpy) ( XMaxRequestSize(dpy) )
#define BYTE_SIZE( len, format ) ( ( len * format ) >> 3 )

/*
 ***********************************************************************
 *      Typedefs, enumerations, and structs
 ***********************************************************************
 */

/*
 * Typedefs
 */
typedef Xv_opaque       Selection;
typedef Selection       Selection_owner;
typedef Selection       Selection_requestor;
typedef Xv_opaque       Selection_item;

/*
 * Enumerations
 */
typedef enum
{

    /*
     * Public Attributes
     */
    /* Common Selection package attributes */
    SEL_DATA        = SEL_ATTR(ATTR_OPAQUE,            5),
    SEL_TYPE        = SEL_ATTR(ATTR_LONG,             10),
    SEL_TYPE_NAME       = SEL_ATTR(ATTR_STRING,           15),

    /* Selection object attributes */
    SEL_RANK        = SEL_ATTR(ATTR_LONG,             20),
    SEL_RANK_NAME       = SEL_ATTR(ATTR_STRING,           25),
    SEL_TIME        = SEL_ATTR(ATTR_OPAQUE,           30),
    SEL_TIMEOUT_VALUE   = SEL_ATTR(ATTR_INT,              35),

    /* Selection_owner object attributes */
    SEL_CONVERT_PROC    = SEL_ATTR(ATTR_FUNCTION_PTR,         40),
    SEL_DONE_PROC       = SEL_ATTR(ATTR_FUNCTION_PTR,         45),
    SEL_FIRST_ITEM      = SEL_ATTR(ATTR_OPAQUE,           50),
    SEL_LOSE_PROC       = SEL_ATTR(ATTR_FUNCTION_PTR,         55),
    SEL_NEXT_ITEM       = SEL_ATTR(ATTR_OPAQUE,           60),
    SEL_OWN         = SEL_ATTR(ATTR_BOOLEAN,          65),
    SEL_PROP_INFO       = SEL_ATTR(ATTR_OPAQUE,           70),
    SEL_PROPERTY        = SEL_ATTR(ATTR_LONG,             75),

    /* Selection_requestor object attributes */
    SEL_REPLY_PROC      = SEL_ATTR(ATTR_FUNCTION_PTR,         80),
    SEL_TYPES       = SEL_ATTR_LIST(ATTR_NULL, ATTR_LONG,     85),
    SEL_TYPE_NAMES      = SEL_ATTR_LIST(ATTR_NULL, ATTR_STRING,   90),
    SEL_PROP_DATA       = SEL_ATTR(ATTR_OPAQUE,           95),
    SEL_PROP_FORMAT     = SEL_ATTR(ATTR_INT,              100),
    SEL_PROP_LENGTH     = SEL_ATTR(ATTR_LONG,             105),
    SEL_PROP_TYPE       = SEL_ATTR(ATTR_LONG,             110),
    SEL_PROP_TYPE_NAME  = SEL_ATTR(ATTR_STRING,           115),
    SEL_TYPE_INDEX      = SEL_ATTR(ATTR_INT,              120),
    SEL_APPEND_TYPES    = SEL_ATTR_LIST(ATTR_NULL, ATTR_LONG,     125),
    SEL_APPEND_TYPE_NAMES   = SEL_ATTR_LIST(ATTR_NULL, ATTR_STRING,   130),
    /* Selection_item object attributes */
    SEL_COPY        = SEL_ATTR(ATTR_BOOLEAN,          135),
    SEL_FORMAT      = SEL_ATTR(ATTR_INT,              140),
    SEL_LENGTH      = SEL_ATTR(ATTR_LONG,             145)

                      /*
                       * Private Attributes
                       */
} Selection_attr;

/*
 * Structures
 */

typedef struct
{
    Xv_generic_struct   parent_data;
    Xv_opaque       private_data;
} Xv_sel;

typedef struct
{
    Xv_sel      parent_data;
    Xv_opaque       private_data;
} Xv_sel_owner;

typedef struct
{
    Xv_sel      parent_data;
    Xv_opaque       private_data;
} Xv_sel_requestor;

typedef struct
{
    Xv_sel_owner    parent_data;
    Xv_opaque       private_data;
} Xv_sel_item;

/*
 ***********************************************************************
 *      Globals
 ***********************************************************************
 */

/*
 *  Package Structures
 */
extern Xv_pkg       xv_sel_pkg;
extern Xv_pkg       xv_sel_owner_pkg;
extern Xv_pkg       xv_sel_requestor_pkg;
extern Xv_pkg       xv_sel_item_pkg;

/*
 *  Public Functions
 */

EXTERN_FUNCTION(Bool sel_convert_proc, (Selection_owner sel_owner, Atom *type,
                                        Xv_opaque *data, unsigned long *length, int *format));
EXTERN_FUNCTION(void sel_post_request, (Selection_requestor sel_req));

typedef struct sel_prop_info
{
    Xv_opaque       data;
    int         format; /* data element size: 8, 16 or 32 bits */
    unsigned long   length; /* nbr of elements in data */
    Atom            type;
    char        *typeName;
} Sel_prop_info;

typedef  struct sel_compat_info
{
    Window   owner;
    Atom     selection;
    int      clientType;
    struct sel_compat_info *next;
} Sel_cmpat_info;

extern XContext  cmpatCtx;

#endif  /* ~xview_selection_DEFINED */
