/*	@(#)cursor.h 20.36 93/06/28 SMI	*/

/*
 *	(c) Copyright 1989 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_cursor_DEFINED
#define  xview_cursor_DEFINED

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

#include <stdio.h>
#include <xview/generic.h>
#include <xview/pkg.h>
#include <sys/types.h>
#include <pixrect/pixrect.h>

#ifdef __STDC__ 
#ifndef CAT
#define CAT(a,b)        a ## b 
#endif
#endif
#include <pixrect/memvar.h>

#include <xview/rect.h>

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

#define CURSOR				&xv_cursor_pkg

#define	CURSOR_ATTR(type, ordinal)	ATTR(ATTR_PKG_CURSOR, type, ordinal)

/*
 * For Sunview 1 compatibility
 */
#define CURSOR_MAX_IMAGE_BYTES		32	/* max. # of image bytes */
#define CURSOR_MAX_IMAGE_WORDS		16

#define CUR_MAXIMAGEBYTES		CURSOR_MAX_IMAGE_BYTES
#define CUR_MAXIMAGEWORDS		CURSOR_MAX_IMAGE_WORDS

#define NOFONTCURSOR			-1

/*
 * OPEN LOOK Cursor character definitions
 *
 *	Those marked with "--" are not official OPEN LOOK cursors and should
 *	not be used if possible.
 */
#define OLC_BASIC_PTR           	0	/* pointer */
#define OLC_BASIC_MASK_PTR      	1
#define OLC_MOVE_PTR            	2	/* move */
#define OLC_MOVE_MASK_PTR       	3
#define OLC_COPY_PTR            	4	/* copy */
#define OLC_COPY_MASK_PTR       	5
#define OLC_BUSY_PTR            	6	/* busy */
#define OLC_BUSY_MASK_PTR       	7
#define OLC_STOP_PTR            	8 	/* -- stop */
#define OLC_STOP_MASK_PTR       	9
#define OLC_PANNING_PTR         	10	/* pan */
#define OLC_PANNING_MASK_PTR    	11
#define OLC_NAVIGATION_LEVEL_PTR        12	/* navigation */
#define OLC_NAVIGATION_LEVEL_MASK_PTR	13
/*
 * WARNING:  The following glyphs are not in the MIT X11 R4 distribution.
 */
#define OLC_BLANK_14 			14	/* -- blank at index 14 */
#define OLC_BLANK_15 			15	/* -- blank at index 15 */
#define OLC_OTHER_PTR 			16	/* -- another basic pointer */
#define OLC_OTHER_MASK_PTR 		17	
#define OLC_RESIZE 			18	/* resize bullseye */
#define OLC_RESIZE_MASK			19	
#define OLC_RIGHT_ARROW 		20	/* -- right arrow */
#define OLC_RIGHT_ARROW_MASK		21	
#define OLC_PLUS 			22	/* -- plus sign */
#define OLC_PLUS_MASK			23	
#define OLC_MULTIPLY 			24	/* -- multiply sign */
#define OLC_MULTIPLY_MASK		25	
#define OLC_HOURGLASS 			26	/* -- hourglass */
#define OLC_HOURGLASS_MASK		27	
#define OLC_DOC 			28	/* doc = document */
#define OLC_DOC_MASK			29	
#define OLC_DOCS			30	/* docs = document stack */
#define OLC_DOCS_MASK			31	
#define OLC_DROP			32	/* drop = drop target */
#define OLC_DROP_MASK			33	
#define OLC_DROP_STEM			34	/* drop with stem */
#define OLC_DROP_STEM_MASK		35	
#define OLC_COPY			36	/* pointer + copy */
#define OLC_COPY_MASK			37	
#define OLC_COPY_EDGE			38	/* copy = copy edge */
#define OLC_COPY_EDGE_MASK		39	
#define OLC_DOC_COPY			40	/* doc + copy */
#define OLC_DOC_COPY_MASK		41	
#define OLC_DOC_COPY_DRAG 		42	/* doc + copy + pointer */
#define OLC_DOC_COPY_DRAG_MASK 		43
#define OLC_DOC_COPY_DROP		44	/* doc + copy + drop */
#define OLC_DOC_COPY_DROP_MASK		45
#define OLC_DOC_COPY_NODROP		46	/* doc + copy + nodrop */
#define OLC_DOC_COPY_NODROP_MASK	47
#define OLC_DOCS_COPY			48	/* docs + copy */
#define OLC_DOCS_COPY_MASK		49	
#define OLC_DOCS_COPY_DRAG 		50	/* docs + copy + pointer */
#define OLC_DOCS_COPY_DRAG_MASK 	51
#define OLC_DOCS_COPY_DROP		52	/* docs + copy + drop */
#define OLC_DOCS_COPY_DROP_MASK		53
#define OLC_DOCS_COPY_NODROP		54	/* docs + copy + nodrop */
#define OLC_DOCS_COPY_NODROP_MASK	55
#define OLC_MOVE			56	/* pointer + move */
#define OLC_MOVE_MASK			57	
#define OLC_MOVE_EDGE			58	/* move = move edge */
#define OLC_MOVE_EDGE_MASK		59	
#define OLC_DOC_MOVE			60	/* doc + move */
#define OLC_DOC_MOVE_MASK		61	
#define OLC_DOC_MOVE_DRAG 		62	/* doc + move + pointer */
#define OLC_DOC_MOVE_DRAG_MASK 		63
#define OLC_DOC_MOVE_DROP		64	/* doc + move + drop */
#define OLC_DOC_MOVE_DROP_MASK		65
#define OLC_DOC_MOVE_NODROP		66	/* doc + move + nodrop */
#define OLC_DOC_MOVE_NODROP_MASK	67
#define OLC_DOCS_MOVE			68	/* docs + move */
#define OLC_DOCS_MOVE_MASK		69	
#define OLC_DOCS_MOVE_DRAG 		70	/* docs + move + pointer */
#define OLC_DOCS_MOVE_DRAG_MASK 	71
#define OLC_DOCS_MOVE_DROP		72	/* docs + move + drop */
#define OLC_DOCS_MOVE_DROP_MASK		73
#define OLC_DOCS_MOVE_NODROP		74	/* docs + move + nodrop */
#define OLC_DOCS_MOVE_NODROP_MASK	75
#define OLC_NODROP			76	/* nodrop */
#define OLC_NODROP_MASK			77
#define OLC_NODROP_STEM			78	/* nodrop with stem */
#define OLC_NODROP_STEM_MASK		79
#define OLC_TEXT_COPY			80	/* text copy */
#define OLC_TEXT_COPY_MASK		81
#define OLC_TEXT_COPY_DRAG		82	/* text copy + pointer */
#define OLC_TEXT_COPY_MOVE_MASK		83
#define OLC_TEXT_COPY_DROP		84	/* text copy + drop */
#define OLC_TEXT_COPY_DROP_MASK		85
#define OLC_TEXT_COPY_NODROP		86	/* text copy + nodrop */
#define OLC_TEXT_COPY_NODROP_MASK	87
#define OLC_TEXT_MOVE			88	/* text move */
#define OLC_TEXT_MOVE_MASK		89
#define OLC_TEXT_MOVE_DRAG		90	/* text move + pointer */
#define OLC_TEXT_MOVE_MOVE_MASK		91
#define OLC_TEXT_MOVE_DROP		92	/* text move + drop */
#define OLC_TEXT_MOVE_DROP_MASK		93
#define OLC_TEXT_MOVE_NODROP		94	/* text move + nodrop */
#define OLC_TEXT_MOVE_NODROP_MASK	95
#define OLC_TEXT_COPY_INSERT		96	/* text copy + insert */
#define OLC_TEXT_COPY_INSERT_MASK	97
#define OLC_TEXT_MOVE_INSERT		98	/* text move + insert */
#define OLC_TEXT_MOVE_INSERT_MASK	99
#define OLC_DATA_COPY_DROP		100	/* data copy + drop */
#define OLC_DATA_COPY_DROP_MASK		101
#define OLC_DATA_COPY_INSERT		102	/* data copy + insert */
#define OLC_DATA_COPY_INSERT_MASK	103
#define OLC_DATA_COPY_NODROP		104	/* data copy + nodrop */
#define OLC_DATA_COPY_NODROP_MASK	105
#define OLC_DATA_MOVE_DROP		106	/* data move + drop */
#define OLC_DATA_MOVE_DROP_MASK		107
#define OLC_DATA_MOVE_INSERT		108	/* data move + insert */
#define OLC_DATA_MOVE_INSERT_MASK	109
#define OLC_DATA_MOVE_NODROP		110	/* data move + nodrop */
#define OLC_DATA_MOVE_NODROP_MASK	111
#define OLC_INSERT			112	/* insert = insert target */
#define OLC_INSERT_MASK			113	
#define OLC_INSERT_STEM			114	/* insert with stem */
#define OLC_INSERT_STEM_MASK		115	
#define OLC_DATA_MOVE 			116	/* data move */
#define OLC_DATA_MOVE_MASK		117	
#define OLC_DATA_COPY			118	/* data copy */
#define OLC_DATA_COPY_MASK		119	
#define OLC_TEXT_POINTER		120	/* text/data pointer */
#define OLC_TEXT_POINTER_MASK		121
#define OLC_FOLDER 			122	/* folder */
#define OLC_FOLDER_MASK			123	
#define OLC_FOLDERS			124	/* folders= folder stack */
#define OLC_FOLDERS_MASK		125	
#define OLC_BLANK_126 			126	/* -- blank at index 126 */
#define OLC_BLANK_127 			127	/* -- blank at index 127 */

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

typedef Xv_opaque	Xv_Cursor;
typedef Xv_opaque	Xv_cursor;

typedef enum {
    CURSOR_NEUTRAL = 0,
    CURSOR_ACCEPT = 1,
    CURSOR_REJECT = 2
} Cursor_drag_state;

typedef enum {
    CURSOR_MOVE = 0,
    CURSOR_DUPLICATE = 1
} Cursor_drag_type;

typedef enum {
	/*
 	 * Public Attributes 
 	 */
    CURSOR_BACKGROUND_COLOR	= CURSOR_ATTR(ATTR_SINGLE_COLOR_PTR,    27),
    CURSOR_DRAG_STATE		= CURSOR_ATTR(ATTR_ENUM,		2),
    CURSOR_DRAG_TYPE		= CURSOR_ATTR(ATTR_ENUM,		3),
    CURSOR_FOREGROUND_COLOR	= CURSOR_ATTR(ATTR_SINGLE_COLOR_PTR,    26),
    CURSOR_IMAGE		= CURSOR_ATTR(ATTR_PIXRECT_PTR,	  	1),
    CURSOR_MASK_CHAR		= CURSOR_ATTR(ATTR_INT,		  	5),
    CURSOR_OP			= CURSOR_ATTR(ATTR_INT,		 	10),
    CURSOR_SRC_CHAR		= CURSOR_ATTR(ATTR_INT,		 	15),
    CURSOR_STRING		= CURSOR_ATTR(ATTR_STRING,		16),
#ifdef OW_I18N
    CURSOR_STRING_WCS		= CURSOR_ATTR(ATTR_WSTRING,	 	17),
#endif
    CURSOR_XHOT			= CURSOR_ATTR(ATTR_INT,		 	20),
    CURSOR_YHOT			= CURSOR_ATTR(ATTR_INT,		 	25),
	/*
	 * OPEN LOOK cursors.  Used as index to XV_KEY_DATA on server.
	 */
    CURSOR_BASIC_PTR		= CURSOR_ATTR(ATTR_OPAQUE,		30),
    CURSOR_MOVE_PTR		= CURSOR_ATTR(ATTR_OPAQUE,		35),
    CURSOR_COPY_PTR		= CURSOR_ATTR(ATTR_OPAQUE,	 	40),
    CURSOR_BUSY_PTR		= CURSOR_ATTR(ATTR_OPAQUE,		45),
    CURSOR_PANNING_PTR		= CURSOR_ATTR(ATTR_OPAQUE,		50),
    CURSOR_NAVIGATION_LEVEL_PTR	= CURSOR_ATTR(ATTR_OPAQUE,		55),
    CURSOR_STOP_PTR		= CURSOR_ATTR(ATTR_OPAQUE,		60),
    CURSOR_QUESTION_MARK_PTR	= CURSOR_ATTR(ATTR_OPAQUE,		65)
} Cursor_attribute;
#define CURSOR_SHOW_CURSOR		XV_SHOW

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


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

extern Xv_pkg		xv_cursor_pkg;

/*
 * Public Functions 
 */

EXTERN_FUNCTION (void		cursor_set_cursor, (Xv_object window, Xv_Cursor cursor));

/*
 * For Sunview 1 compatibility 
 */
EXTERN_FUNCTION (Xv_Cursor cursor_create, (Attr_attribute attr1, DOTDOTDOT));
EXTERN_FUNCTION (void		cursor_destroy, (Xv_Cursor cursor));
EXTERN_FUNCTION (Xv_Cursor	cursor_copy, (Xv_Cursor cursor));
EXTERN_FUNCTION (Xv_opaque	cursor_get, (Xv_Cursor cursor, Cursor_attribute  attr));
EXTERN_FUNCTION (int		cursor_set, (Xv_Cursor cursor, DOTDOTDOT));

#endif
