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