/* -------------------------------- pktdef.h -------------------------------- */
/* Combined 16 & 32-bit version. */

/*------------------------------------------------------------------------------
The text and information contained in this file may be freely used,
copied, or distributed without compensation or licensing restrictions.

This file is copyright 1991-1998 by LCS/Telegraphics.
------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------

How to use pktdef.h:

1. Include wintab.h
2. if using just one packet format:
	a. Define PACKETDATA and PACKETMODE as or'ed combinations of WTPKT bits
	   (use the PK_* identifiers).
	b. Include pktdef.h.
	c. The generated structure typedef will be called PACKET.  Use PACKETDATA
	   and PACKETMODE to fill in the LOGCONTEXT structure.
3. If using multiple packet formats, for each one:
	a. Define PACKETNAME. Its text value will be a prefix for this packet's
	   parameters and names.
	b. Define <PACKETNAME>PACKETDATA and <PACKETNAME>PACKETMODE similar to
	   2.a. above.
	c. Include pktdef.h.
	d. The generated structure typedef will be called
	   <PACKETNAME>PACKET. Compare with 2.c. above and example #2 below.
4. If using extension packet data, do the following additional steps
   for each extension:
	a. Before including pktdef.h, define <PACKETNAME>PACKET<EXTENSION>
	   as either PKEXT_ABSOLUTE or PKEXT_RELATIVE.
	b. The generated structure typedef will contain a field for the
	   extension data.
	c. Scan the WTI_EXTENSION categories to find the extension's
	   packet mask bit.
	d. OR the packet mask bit with <PACKETNAME>PACKETDATA and use the
	   result in the lcPktData field of the LOGCONTEXT structure.
	e. If <PACKETNAME>PACKET<EXTENSION> was PKEXT_RELATIVE, OR the
	   packet mask bit with <PACKETNAME>PACKETMODE and use the result
	   in the lcPktMode field of the LOGCONTEXT structure.


Example #1.	-- single packet format

#include <wintab.h>
#define PACKETDATA	PK_X | PK_Y | PK_BUTTONS	/@ x, y, buttons @/
#define PACKETMODE	PK_BUTTONS					/@ buttons relative mode @/
#include <pktdef.h>
...
	lc.lcPktData = PACKETDATA;
	lc.lcPktMode = PACKETMODE;

Example #2. -- multiple formats

#include <wintab.h>
#define PACKETNAME		MOE
#define MOEPACKETDATA	PK_X | PK_Y | PK_BUTTONS	/@ x, y, buttons @/
#define MOEPACKETMODE	PK_BUTTONS					/@ buttons relative mode @/
#include <pktdef.h>
#define PACKETNAME		LARRY
#define LARRYPACKETDATA	PK_Y | PK_Z | PK_BUTTONS	/@ y, z, buttons @/
#define LARRYPACKETMODE	PK_BUTTONS					/@ buttons relative mode @/
#include <pktdef.h>
#define PACKETNAME		CURLY
#define CURLYPACKETDATA	PK_X | PK_Z | PK_BUTTONS	/@ x, z, buttons @/
#define CURLYPACKETMODE	PK_BUTTONS					/@ buttons relative mode @/
#include <pktdef.h>
...
	lcMOE.lcPktData = MOEPACKETDATA;
	lcMOE.lcPktMode = MOEPACKETMODE;
...
	lcLARRY.lcPktData = LARRYPACKETDATA;
	lcLARRY.lcPktMode = LARRYPACKETMODE;
...
	lcCURLY.lcPktData = CURLYPACKETDATA;
	lcCURLY.lcPktMode = CURLYPACKETMODE;

Example #3. -- extension packet data "XFOO".
	
#include <wintab.h>
#define PACKETDATA	PK_X | PK_Y | PK_BUTTONS	/@ x, y, buttons @/
#define PACKETMODE	PK_BUTTONS					/@ buttons relative mode @/
#define PACKETXFOO	PKEXT_ABSOLUTE				/@ XFOO absolute mode @/
#include <pktdef.h>
...
UINT ScanExts(UINT wTag)
{
	UINT i;
	UINT wScanTag;

	/@ scan for wTag's info category. @/
	for (i = 0; WTInfo(WTI_EXTENSIONS + i, EXT_TAG, &wScanTag); i++) {
		 if (wTag == wScanTag) {
			/@ return category offset from WTI_EXTENSIONS. @/
			return i;
		}
	}
	/@ return error code. @/
	return 0xFFFF;
}
...
	lc.lcPktData = PACKETDATA;
	lc.lcPktMode = PACKETMODE;
#ifdef PACKETXFOO
	categoryXFOO = ScanExts(WTX_XFOO);
	WTInfo(WTI_EXTENSIONS + categoryXFOO, EXT_MASK, &maskXFOO);
	lc.lcPktData |= maskXFOO;
#if PACKETXFOO == PKEXT_RELATIVE
	lc.lcPktMode |= maskXFOO;
#endif
#endif
	WTOpen(hWnd, &lc, TRUE);


------------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif	/* __cplusplus */

#ifndef PACKETNAME
	/* if no packet name prefix */
	#define __PFX(x)	x
	#define __IFX(x,y)	x ## y
#else
	/* add prefixes and infixes to packet format names */
	#define __PFX(x)		__PFX2(PACKETNAME,x)
	#define __PFX2(p,x)		__PFX3(p,x)
	#define __PFX3(p,x)		p ## x
	#define __IFX(x,y)		__IFX2(x,PACKETNAME,y)
	#define __IFX2(x,i,y)	__IFX3(x,i,y)
	#define __IFX3(x,i,y)	x ## i ## y
#endif

#define __SFX2(x,s)		__SFX3(x,s)
#define __SFX3(x,s)		x ## s

#define __TAG  	__IFX(tag,PACKET)
#define __TYPES	__PFX(PACKET), * __IFX(P,PACKET), NEAR * __IFX(NP,PACKET), \
					FAR * __IFX(LP,PACKET)

#define __DATA		(__PFX(PACKETDATA))
#define __MODE		(__PFX(PACKETMODE))
#define __EXT(x)	__SFX2(__PFX(PACKET),x)

	
typedef struct __TAG {
	#if (__DATA & PK_CONTEXT)
		HCTX			pkContext;
	#endif
	#if (__DATA & PK_STATUS)
		UINT			pkStatus;
	#endif
	#if (__DATA & PK_TIME)
		DWORD			pkTime;
	#endif
	#if (__DATA & PK_CHANGED)
		WTPKT			pkChanged;
	#endif
	#if (__DATA & PK_SERIAL_NUMBER)
		UINT			pkSerialNumber;
	#endif
	#if (__DATA & PK_CURSOR)
		UINT			pkCursor;
	#endif
	#if (__DATA & PK_BUTTONS)
		DWORD			pkButtons;
	#endif
	#if (__DATA & PK_X)
		LONG			pkX;
	#endif
	#if (__DATA & PK_Y)
		LONG			pkY;
	#endif
	#if (__DATA & PK_Z)
		LONG			pkZ;
	#endif
	#if (__DATA & PK_NORMAL_PRESSURE)
		#if (__MODE & PK_NORMAL_PRESSURE)
			/* relative */
			int			pkNormalPressure;
		#else
			/* absolute */
			UINT		pkNormalPressure;
		#endif
	#endif
	#if (__DATA & PK_TANGENT_PRESSURE)
		#if (__MODE & PK_TANGENT_PRESSURE)
			/* relative */
			int			pkTangentPressure;
		#else
			/* absolute */
			UINT		pkTangentPressure;
		#endif
	#endif
	#if (__DATA & PK_ORIENTATION)
		ORIENTATION		pkOrientation;
	#endif
	#if (__DATA & PK_ROTATION)
		ROTATION		pkRotation; /* 1.1 */
	#endif

#ifndef NOWTEXTENSIONS
	/* extensions begin here. */
	#if (__EXT(FKEYS) == PKEXT_RELATIVE) || (__EXT(FKEYS) == PKEXT_ABSOLUTE)
		UINT			pkFKeys;
	#endif
	#if (__EXT(TILT) == PKEXT_RELATIVE) || (__EXT(TILT) == PKEXT_ABSOLUTE)
		TILT			pkTilt;
	#endif
#endif

} __TYPES ;

#undef PACKETNAME
#undef __TAG
#undef __TAG2
#undef __TYPES
#undef __TYPES2
#undef __DATA
#undef __MODE
#undef __PFX
#undef __PFX2
#undef __PFX3
#undef __IFX
#undef __IFX2
#undef __IFX3
#undef __SFX2
#undef __SFX3

#ifdef __cplusplus
}
#endif	/* __cplusplus */
