1 /* -------------------------------- pktdef.h -------------------------------- */ 2 /* Combined 16 & 32-bit version. */ 3 4 /*------------------------------------------------------------------------------ 5 The text and information contained in this file may be freely used, 6 copied, or distributed without compensation or licensing restrictions. 7 8 This file is copyright 1991-1998 by LCS/Telegraphics. 9 ------------------------------------------------------------------------------*/ 10 /*------------------------------------------------------------------------------ 11 12 How to use pktdef.h: 13 14 1. Include wintab.h 15 2. if using just one packet format: 16 a. Define PACKETDATA and PACKETMODE as or'ed combinations of WTPKT bits 17 (use the PK_* identifiers). 18 b. Include pktdef.h. 19 c. The generated structure typedef will be called PACKET. Use PACKETDATA 20 and PACKETMODE to fill in the LOGCONTEXT structure. 21 3. If using multiple packet formats, for each one: 22 a. Define PACKETNAME. Its text value will be a prefix for this packet's 23 parameters and names. 24 b. Define <PACKETNAME>PACKETDATA and <PACKETNAME>PACKETMODE similar to 25 2.a. above. 26 c. Include pktdef.h. 27 d. The generated structure typedef will be called 28 <PACKETNAME>PACKET. Compare with 2.c. above and example #2 below. 29 4. If using extension packet data, do the following additional steps 30 for each extension: 31 a. Before including pktdef.h, define <PACKETNAME>PACKET<EXTENSION> 32 as either PKEXT_ABSOLUTE or PKEXT_RELATIVE. 33 b. The generated structure typedef will contain a field for the 34 extension data. 35 c. Scan the WTI_EXTENSION categories to find the extension's 36 packet mask bit. 37 d. OR the packet mask bit with <PACKETNAME>PACKETDATA and use the 38 result in the lcPktData field of the LOGCONTEXT structure. 39 e. If <PACKETNAME>PACKET<EXTENSION> was PKEXT_RELATIVE, OR the 40 packet mask bit with <PACKETNAME>PACKETMODE and use the result 41 in the lcPktMode field of the LOGCONTEXT structure. 42 43 44 Example #1. -- single packet format 45 46 #include <wintab.h> 47 #define PACKETDATA PK_X | PK_Y | PK_BUTTONS /@ x, y, buttons @/ 48 #define PACKETMODE PK_BUTTONS /@ buttons relative mode @/ 49 #include <pktdef.h> 50 ... 51 lc.lcPktData = PACKETDATA; 52 lc.lcPktMode = PACKETMODE; 53 54 Example #2. -- multiple formats 55 56 #include <wintab.h> 57 #define PACKETNAME MOE 58 #define MOEPACKETDATA PK_X | PK_Y | PK_BUTTONS /@ x, y, buttons @/ 59 #define MOEPACKETMODE PK_BUTTONS /@ buttons relative mode @/ 60 #include <pktdef.h> 61 #define PACKETNAME LARRY 62 #define LARRYPACKETDATA PK_Y | PK_Z | PK_BUTTONS /@ y, z, buttons @/ 63 #define LARRYPACKETMODE PK_BUTTONS /@ buttons relative mode @/ 64 #include <pktdef.h> 65 #define PACKETNAME CURLY 66 #define CURLYPACKETDATA PK_X | PK_Z | PK_BUTTONS /@ x, z, buttons @/ 67 #define CURLYPACKETMODE PK_BUTTONS /@ buttons relative mode @/ 68 #include <pktdef.h> 69 ... 70 lcMOE.lcPktData = MOEPACKETDATA; 71 lcMOE.lcPktMode = MOEPACKETMODE; 72 ... 73 lcLARRY.lcPktData = LARRYPACKETDATA; 74 lcLARRY.lcPktMode = LARRYPACKETMODE; 75 ... 76 lcCURLY.lcPktData = CURLYPACKETDATA; 77 lcCURLY.lcPktMode = CURLYPACKETMODE; 78 79 Example #3. -- extension packet data "XFOO". 80 81 #include <wintab.h> 82 #define PACKETDATA PK_X | PK_Y | PK_BUTTONS /@ x, y, buttons @/ 83 #define PACKETMODE PK_BUTTONS /@ buttons relative mode @/ 84 #define PACKETXFOO PKEXT_ABSOLUTE /@ XFOO absolute mode @/ 85 #include <pktdef.h> 86 ... 87 UINT ScanExts(UINT wTag) 88 { 89 UINT i; 90 UINT wScanTag; 91 92 /@ scan for wTag's info category. @/ 93 for (i = 0; WTInfo(WTI_EXTENSIONS + i, EXT_TAG, &wScanTag); i++) { 94 if (wTag == wScanTag) { 95 /@ return category offset from WTI_EXTENSIONS. @/ 96 return i; 97 } 98 } 99 /@ return error code. @/ 100 return 0xFFFF; 101 } 102 ... 103 lc.lcPktData = PACKETDATA; 104 lc.lcPktMode = PACKETMODE; 105 #ifdef PACKETXFOO 106 categoryXFOO = ScanExts(WTX_XFOO); 107 WTInfo(WTI_EXTENSIONS + categoryXFOO, EXT_MASK, &maskXFOO); 108 lc.lcPktData |= maskXFOO; 109 #if PACKETXFOO == PKEXT_RELATIVE 110 lc.lcPktMode |= maskXFOO; 111 #endif 112 #endif 113 WTOpen(hWnd, &lc, TRUE); 114 115 116 ------------------------------------------------------------------------------*/ 117 #ifdef __cplusplus 118 extern "C" { 119 #endif /* __cplusplus */ 120 121 #ifndef PACKETNAME 122 /* if no packet name prefix */ 123 #define __PFX(x) x 124 #define __IFX(x,y) x ## y 125 #else 126 /* add prefixes and infixes to packet format names */ 127 #define __PFX(x) __PFX2(PACKETNAME,x) 128 #define __PFX2(p,x) __PFX3(p,x) 129 #define __PFX3(p,x) p ## x 130 #define __IFX(x,y) __IFX2(x,PACKETNAME,y) 131 #define __IFX2(x,i,y) __IFX3(x,i,y) 132 #define __IFX3(x,i,y) x ## i ## y 133 #endif 134 135 #define __SFX2(x,s) __SFX3(x,s) 136 #define __SFX3(x,s) x ## s 137 138 #define __TAG __IFX(tag,PACKET) 139 #define __TYPES __PFX(PACKET), * __IFX(P,PACKET), NEAR * __IFX(NP,PACKET), \ 140 FAR * __IFX(LP,PACKET) 141 142 #define __DATA (__PFX(PACKETDATA)) 143 #define __MODE (__PFX(PACKETMODE)) 144 #define __EXT(x) __SFX2(__PFX(PACKET),x) 145 146 147 typedef struct __TAG { 148 #if (__DATA & PK_CONTEXT) 149 HCTX pkContext; 150 #endif 151 #if (__DATA & PK_STATUS) 152 UINT pkStatus; 153 #endif 154 #if (__DATA & PK_TIME) 155 DWORD pkTime; 156 #endif 157 #if (__DATA & PK_CHANGED) 158 WTPKT pkChanged; 159 #endif 160 #if (__DATA & PK_SERIAL_NUMBER) 161 UINT pkSerialNumber; 162 #endif 163 #if (__DATA & PK_CURSOR) 164 UINT pkCursor; 165 #endif 166 #if (__DATA & PK_BUTTONS) 167 DWORD pkButtons; 168 #endif 169 #if (__DATA & PK_X) 170 LONG pkX; 171 #endif 172 #if (__DATA & PK_Y) 173 LONG pkY; 174 #endif 175 #if (__DATA & PK_Z) 176 LONG pkZ; 177 #endif 178 #if (__DATA & PK_NORMAL_PRESSURE) 179 #if (__MODE & PK_NORMAL_PRESSURE) 180 /* relative */ 181 int pkNormalPressure; 182 #else 183 /* absolute */ 184 UINT pkNormalPressure; 185 #endif 186 #endif 187 #if (__DATA & PK_TANGENT_PRESSURE) 188 #if (__MODE & PK_TANGENT_PRESSURE) 189 /* relative */ 190 int pkTangentPressure; 191 #else 192 /* absolute */ 193 UINT pkTangentPressure; 194 #endif 195 #endif 196 #if (__DATA & PK_ORIENTATION) 197 ORIENTATION pkOrientation; 198 #endif 199 #if (__DATA & PK_ROTATION) 200 ROTATION pkRotation; /* 1.1 */ 201 #endif 202 203 #ifndef NOWTEXTENSIONS 204 /* extensions begin here. */ 205 #if (__EXT(FKEYS) == PKEXT_RELATIVE) || (__EXT(FKEYS) == PKEXT_ABSOLUTE) 206 UINT pkFKeys; 207 #endif 208 #if (__EXT(TILT) == PKEXT_RELATIVE) || (__EXT(TILT) == PKEXT_ABSOLUTE) 209 TILT pkTilt; 210 #endif 211 #endif 212 213 } __TYPES ; 214 215 #undef PACKETNAME 216 #undef __TAG 217 #undef __TAG2 218 #undef __TYPES 219 #undef __TYPES2 220 #undef __DATA 221 #undef __MODE 222 #undef __PFX 223 #undef __PFX2 224 #undef __PFX3 225 #undef __IFX 226 #undef __IFX2 227 #undef __IFX3 228 #undef __SFX2 229 #undef __SFX3 230 231 #ifdef __cplusplus 232 } 233 #endif /* __cplusplus */ 234