]> Pileus Git - ~andy/gtk/blob - gdk/win32/pktdef.h
GdkFrameTimings: add documentation
[~andy/gtk] / gdk / win32 / pktdef.h
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 */