1 /***********************************************************
2 
3 Copyright 1987, 1998  The Open Group
4 
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
9 documentation.
10 
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13 
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 
21 Except as contained in this notice, the name of The Open Group shall not be
22 used in advertising or otherwise to promote the sale, use or other dealings
23 in this Software without prior written authorization from The Open Group.
24 
25 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
26 
27                         All Rights Reserved
28 
29 Permission to use, copy, modify, and distribute this software and its
30 documentation for any purpose and without fee is hereby granted,
31 provided that the above copyright notice appear in all copies and that
32 both that copyright notice and this permission notice appear in
33 supporting documentation, and that the name of Digital not be
34 used in advertising or publicity pertaining to distribution of the
35 software without specific, written prior permission.
36 
37 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43 SOFTWARE.
44 
45 ******************************************************************/
46 
47 #ifndef DIX_H
48 #define DIX_H
49 
50 #include "callback.h"
51 #include "gc.h"
52 #include "window.h"
53 #include "input.h"
54 #include "cursor.h"
55 #include "geext.h"
56 #include "events.h"
57 #include <X11/extensions/XI.h>
58 
59 #define EARLIER -1
60 #define SAMETIME 0
61 #define LATER 1
62 
63 #define NullClient ((ClientPtr) 0)
64 
65 #define REQUEST(type)                                                   \
66     type * stuff = (type *)client->requestBuffer;
67 
68 #define ARRAY_SIZE(a)  (sizeof((a)) / sizeof((a)[0]))
69 
70 #define REQUEST_SIZE_MATCH(req)                                         \
71     do {                                                                \
72         if ((sizeof(req) >> 2) != client->req_len)                      \
73             return(BadLength);                                          \
74     } while (0)
75 
76 #define REQUEST_AT_LEAST_SIZE(req)                                      \
77     do {                                                                \
78         if ((sizeof(req) >> 2) > client->req_len)                       \
79             return(BadLength);                                          \
80     } while (0)
81 
82 #define REQUEST_AT_LEAST_EXTRA_SIZE(req, extra)                         \
83     do {                                                                \
84         if (((sizeof(req) + ((uint64_t) (extra))) >> 2) > client->req_len) \
85             return(BadLength);                                          \
86     } while (0)
87 
88 #define REQUEST_FIXED_SIZE(req, n)                                      \
89     do {                                                                \
90         if ((((sizeof(req)) >> 2) > client->req_len) ||            \
91             (((n) >> 2) >= client->req_len) ||                         \
92             ((((uint64_t) sizeof(req) + (n) + 3) >> 2) != (uint64_t) client->req_len)) \
93             return(BadLength);                                          \
94     } while (0)
95 
96 #define LEGAL_NEW_RESOURCE(id,client)           \
97     do {                                        \
98         if (!LegalNewID((id), (client))) {      \
99             (client)->errorValue = (id);        \
100             return BadIDChoice;                 \
101         }                                       \
102     } while (0)
103 
104 #define VALIDATE_DRAWABLE_AND_GC(drawID, pDraw, mode)                   \
105     do {                                                                \
106         int tmprc = dixLookupDrawable(&(pDraw), drawID, client, M_ANY, mode); \
107         if (tmprc != Success)                                           \
108             return tmprc;                                               \
109         tmprc = dixLookupGC(&(pGC), stuff->gc, client, DixUseAccess);   \
110         if (tmprc != Success)                                           \
111             return tmprc;                                               \
112         if ((pGC->depth != pDraw->depth) || (pGC->pScreen != pDraw->pScreen)) \
113             return BadMatch;                                            \
114         if (pGC->serialNumber != pDraw->serialNumber)                   \
115             ValidateGC(pDraw, pGC);                                     \
116     } while (0)
117 
118 #define WriteReplyToClient(pClient, size, pReply)                       \
119     do {                                                                \
120         if ((pClient)->swapped)                                         \
121             (*ReplySwapVector[((xReq *)(pClient)->requestBuffer)->reqType]) \
122                 (pClient, (int)(size), pReply);                         \
123         else                                                            \
124             WriteToClient(pClient, (int)(size), (pReply));              \
125     } while (0)
126 
127 #define WriteSwappedDataToClient(pClient, size, pbuf)                   \
128     do {                                                                \
129         if ((pClient)->swapped)                                         \
130             (*(pClient)->pSwapReplyFunc)(pClient, (int)(size), pbuf);   \
131         else                                                            \
132             WriteToClient(pClient, (int)(size), (pbuf));                \
133     } while (0)
134 
135 typedef struct _TimeStamp *TimeStampPtr;
136 
137 #ifndef _XTYPEDEF_CLIENTPTR
138 typedef struct _Client *ClientPtr;      /* also in misc.h */
139 
140 #define _XTYPEDEF_CLIENTPTR
141 #endif
142 
143 typedef struct _WorkQueue *WorkQueuePtr;
144 
145 extern _X_EXPORT ClientPtr clients[MAXCLIENTS];
146 extern _X_EXPORT ClientPtr serverClient;
147 extern _X_EXPORT int currentMaxClients;
148 extern _X_EXPORT char dispatchExceptionAtReset;
149 extern _X_EXPORT int terminateDelay;
150 extern _X_EXPORT Bool touchEmulatePointer;
151 
152 typedef int HWEventQueueType;
153 typedef HWEventQueueType *HWEventQueuePtr;
154 
155 extern _X_EXPORT HWEventQueuePtr checkForInput[2];
156 
157 static inline _X_NOTSAN Bool
InputCheckPending(void)158 InputCheckPending(void)
159 {
160     return (*checkForInput[0] != *checkForInput[1]);
161 }
162 
163 typedef struct _TimeStamp {
164     CARD32 months;              /* really ~49.7 days */
165     CARD32 milliseconds;
166 } TimeStamp;
167 
168 /* dispatch.c */
169 extern _X_EXPORT ClientPtr GetCurrentClient(void);
170 
171 extern _X_EXPORT void SetInputCheck(HWEventQueuePtr /*c0 */ ,
172                                     HWEventQueuePtr /*c1 */ );
173 
174 extern _X_EXPORT void CloseDownClient(ClientPtr /*client */ );
175 
176 extern _X_EXPORT void UpdateCurrentTime(void);
177 
178 extern _X_EXPORT void UpdateCurrentTimeIf(void);
179 
180 extern _X_EXPORT int dixDestroyPixmap(void *value,
181                                       XID pid);
182 
183 extern _X_EXPORT void InitClient(ClientPtr client,
184                                  int i,
185                                  void *ospriv);
186 
187 extern _X_EXPORT ClientPtr NextAvailableClient(void *ospriv);
188 
189 extern _X_EXPORT void SendErrorToClient(ClientPtr /*client */ ,
190                                         unsigned int /*majorCode */ ,
191                                         unsigned int /*minorCode */ ,
192                                         XID /*resId */ ,
193                                         int /*errorCode */ );
194 
195 extern _X_EXPORT void MarkClientException(ClientPtr /*client */ );
196 
197 extern _X_HIDDEN Bool CreateConnectionBlock(void);
198 
199 /* dixutils.c */
200 
201 extern _X_EXPORT int CompareISOLatin1Lowered(const unsigned char * /*a */ ,
202                                              int alen,
203                                              const unsigned char * /*b */ ,
204                                              int blen);
205 
206 extern _X_EXPORT int dixLookupWindow(WindowPtr *result,
207                                      XID id,
208                                      ClientPtr client, Mask access_mode);
209 
210 extern _X_EXPORT int dixLookupDrawable(DrawablePtr *result,
211                                        XID id,
212                                        ClientPtr client,
213                                        Mask type_mask, Mask access_mode);
214 
215 extern _X_EXPORT int dixLookupGC(GCPtr *result,
216                                  XID id, ClientPtr client, Mask access_mode);
217 
218 extern _X_EXPORT int dixLookupFontable(FontPtr *result,
219                                        XID id,
220                                        ClientPtr client, Mask access_mode);
221 
222 extern _X_EXPORT int dixLookupClient(ClientPtr *result,
223                                      XID id,
224                                      ClientPtr client, Mask access_mode);
225 
226 extern _X_EXPORT void NoopDDA(void);
227 
228 extern _X_EXPORT int AlterSaveSetForClient(ClientPtr /*client */ ,
229                                            WindowPtr /*pWin */ ,
230                                            unsigned /*mode */ ,
231                                            Bool /*toRoot */ ,
232                                            Bool /*map */ );
233 
234 extern _X_EXPORT void DeleteWindowFromAnySaveSet(WindowPtr /*pWin */ );
235 
236 extern _X_EXPORT void BlockHandler(void *timeout);
237 
238 extern _X_EXPORT void WakeupHandler(int result);
239 
240 void
241 EnableLimitedSchedulingLatency(void);
242 
243 void
244 DisableLimitedSchedulingLatency(void);
245 
246 typedef void (*ServerBlockHandlerProcPtr) (void *blockData,
247                                            void *timeout);
248 
249 typedef void (*ServerWakeupHandlerProcPtr) (void *blockData,
250                                             int result);
251 
252 extern _X_EXPORT Bool RegisterBlockAndWakeupHandlers(ServerBlockHandlerProcPtr blockHandler,
253                                                      ServerWakeupHandlerProcPtr wakeupHandler,
254                                                      void *blockData);
255 
256 extern _X_EXPORT void RemoveBlockAndWakeupHandlers(ServerBlockHandlerProcPtr blockHandler,
257                                                    ServerWakeupHandlerProcPtr wakeupHandler,
258                                                    void *blockData);
259 
260 extern _X_EXPORT void InitBlockAndWakeupHandlers(void);
261 
262 extern _X_EXPORT void ClearWorkQueue(void);
263 
264 extern _X_EXPORT void ProcessWorkQueue(void);
265 
266 extern _X_EXPORT void ProcessWorkQueueZombies(void);
267 
268 extern _X_EXPORT Bool QueueWorkProc(Bool (*function)(ClientPtr clientUnused,
269                                                      void *closure),
270                                     ClientPtr client,
271                                     void *closure);
272 
273 typedef Bool (*ClientSleepProcPtr) (ClientPtr client,
274                                     void *closure);
275 
276 extern _X_EXPORT Bool ClientSleep(ClientPtr client,
277                                   ClientSleepProcPtr function,
278                                   void *closure);
279 
280 #ifndef ___CLIENTSIGNAL_DEFINED___
281 #define ___CLIENTSIGNAL_DEFINED___
282 extern _X_EXPORT Bool ClientSignal(ClientPtr /*client */ );
283 #endif                          /* ___CLIENTSIGNAL_DEFINED___ */
284 
285 #define CLIENT_SIGNAL_ANY ((void *)-1)
286 extern _X_EXPORT int ClientSignalAll(ClientPtr /*client*/,
287                                      ClientSleepProcPtr /*function*/,
288                                      void * /*closure*/);
289 
290 extern _X_EXPORT void ClientWakeup(ClientPtr /*client */ );
291 
292 extern _X_EXPORT Bool ClientIsAsleep(ClientPtr /*client */ );
293 
294 extern _X_EXPORT void SendGraphicsExpose(ClientPtr /*client */ ,
295                                          RegionPtr /*pRgn */ ,
296                                          XID /*drawable */ ,
297                                          int /*major */ ,
298                                          int  /*minor */);
299 
300 /* atom.c */
301 
302 extern _X_EXPORT Atom MakeAtom(const char * /*string */ ,
303                                unsigned /*len */ ,
304                                Bool /*makeit */ );
305 
306 extern _X_EXPORT Bool ValidAtom(Atom /*atom */ );
307 
308 extern _X_EXPORT const char *NameForAtom(Atom /*atom */ );
309 
310 extern _X_EXPORT void
311 AtomError(void)
312     _X_NORETURN;
313 
314 extern _X_EXPORT void
315 FreeAllAtoms(void);
316 
317 extern _X_EXPORT void
318 InitAtoms(void);
319 
320 /* main.c */
321 
322 extern _X_EXPORT void
323 SetVendorRelease(int release);
324 
325 int
326 dix_main(int argc, char *argv[], char *envp[]);
327 
328 /* events.c */
329 
330 extern void
331 SetMaskForEvent(int /* deviceid */ ,
332                 Mask /* mask */ ,
333                 int /* event */ );
334 
335 extern _X_EXPORT void
336 ConfineToShape(DeviceIntPtr /* pDev */ ,
337                RegionPtr /* shape */ ,
338                int * /* px */ ,
339                int * /* py */ );
340 
341 extern _X_EXPORT Bool
342 IsParent(WindowPtr /* maybeparent */ ,
343          WindowPtr /* child */ );
344 
345 extern _X_EXPORT WindowPtr
346 GetCurrentRootWindow(DeviceIntPtr pDev);
347 
348 extern _X_EXPORT WindowPtr
349 GetSpriteWindow(DeviceIntPtr pDev);
350 
351 extern _X_EXPORT void
352 NoticeTime(const DeviceIntPtr dev,
353            TimeStamp time);
354 extern _X_EXPORT void
355 NoticeEventTime(InternalEvent *ev,
356                 DeviceIntPtr dev);
357 extern _X_EXPORT TimeStamp
358 LastEventTime(int deviceid);
359 extern _X_EXPORT Bool
360 LastEventTimeWasReset(int deviceid);
361 extern _X_EXPORT void
362 LastEventTimeToggleResetFlag(int deviceid, Bool state);
363 extern _X_EXPORT void
364 LastEventTimeToggleResetAll(Bool state);
365 
366 extern void
367 EnqueueEvent(InternalEvent * /* ev */ ,
368              DeviceIntPtr /* device */ );
369 extern void
370 PlayReleasedEvents(void);
371 
372 extern void
373 ActivatePointerGrab(DeviceIntPtr /* mouse */ ,
374                     GrabPtr /* grab */ ,
375                     TimeStamp /* time */ ,
376                     Bool /* autoGrab */ );
377 
378 extern void
379 DeactivatePointerGrab(DeviceIntPtr /* mouse */ );
380 
381 extern void
382 ActivateKeyboardGrab(DeviceIntPtr /* keybd */ ,
383                      GrabPtr /* grab */ ,
384                      TimeStamp /* time */ ,
385                      Bool /* passive */ );
386 
387 extern void
388 DeactivateKeyboardGrab(DeviceIntPtr /* keybd */ );
389 
390 extern BOOL
391 ActivateFocusInGrab(DeviceIntPtr /* dev */ ,
392                     WindowPtr /* old */ ,
393                     WindowPtr /* win */ );
394 
395 extern void
396 AllowSome(ClientPtr /* client */ ,
397           TimeStamp /* time */ ,
398           DeviceIntPtr /* thisDev */ ,
399           int /* newState */ );
400 
401 extern void
402 ReleaseActiveGrabs(ClientPtr client);
403 
404 extern GrabPtr
405 CheckPassiveGrabsOnWindow(WindowPtr /* pWin */ ,
406                           DeviceIntPtr /* device */ ,
407                           InternalEvent * /* event */ ,
408                           BOOL /* checkCore */ ,
409                           BOOL /* activate */ );
410 
411 extern _X_EXPORT int
412 DeliverEventsToWindow(DeviceIntPtr /* pWin */ ,
413                       WindowPtr /* pWin */ ,
414                       xEventPtr /* pEvents */ ,
415                       int /* count */ ,
416                       Mask /* filter */ ,
417                       GrabPtr /* grab */ );
418 
419 extern _X_EXPORT void
420 DeliverRawEvent(RawDeviceEvent * /* ev */ ,
421                 DeviceIntPtr    /* dev */
422     );
423 
424 extern int
425 DeliverDeviceEvents(WindowPtr /* pWin */ ,
426                     InternalEvent * /* event */ ,
427                     GrabPtr /* grab */ ,
428                     WindowPtr /* stopAt */ ,
429                     DeviceIntPtr /* dev */ );
430 
431 extern int
432 DeliverOneGrabbedEvent(InternalEvent * /* event */ ,
433                        DeviceIntPtr /* dev */ ,
434                        enum InputLevel /* level */ );
435 
436 extern void
437 DeliverTouchEvents(DeviceIntPtr /* dev */ ,
438                    TouchPointInfoPtr /* ti */ ,
439                    InternalEvent * /* ev */ ,
440                    XID /* resource */ );
441 
442 extern Bool
443 DeliverGestureEventToOwner(DeviceIntPtr dev, GestureInfoPtr gi,
444                            InternalEvent *ev);
445 
446 extern void
447 InitializeSprite(DeviceIntPtr /* pDev */ ,
448                  WindowPtr /* pWin */ );
449 extern void
450 FreeSprite(DeviceIntPtr pDev);
451 
452 extern void
453 UpdateSpriteForScreen(DeviceIntPtr /* pDev */ ,
454                       ScreenPtr /* pScreen */ );
455 
456 extern _X_EXPORT void
457 WindowHasNewCursor(WindowPtr /* pWin */ );
458 
459 extern Bool
460 CheckDeviceGrabs(DeviceIntPtr /* device */ ,
461                  InternalEvent * /* event */ ,
462                  WindowPtr /* ancestor */ );
463 
464 extern void
465 DeliverFocusedEvent(DeviceIntPtr /* keybd */ ,
466                     InternalEvent * /* event */ ,
467                     WindowPtr /* window */ );
468 
469 extern int
470 DeliverGrabbedEvent(InternalEvent * /* event */ ,
471                     DeviceIntPtr /* thisDev */ ,
472                     Bool /* deactivateGrab */ );
473 
474 extern void
475 FreezeThisEventIfNeededForSyncGrab(DeviceIntPtr thisDev,
476                                    InternalEvent *event);
477 
478 extern void
479 FixKeyState(DeviceEvent * /* event */ ,
480             DeviceIntPtr /* keybd */ );
481 
482 extern void
483 RecalculateDeliverableEvents(WindowPtr /* pWin */ );
484 
485 extern _X_EXPORT int
486 OtherClientGone(void *value,
487                 XID id);
488 
489 extern void
490 DoFocusEvents(DeviceIntPtr /* dev */ ,
491               WindowPtr /* fromWin */ ,
492               WindowPtr /* toWin */ ,
493               int /* mode */ );
494 
495 extern int
496 SetInputFocus(ClientPtr /* client */ ,
497               DeviceIntPtr /* dev */ ,
498               Window /* focusID */ ,
499               CARD8 /* revertTo */ ,
500               Time /* ctime */ ,
501               Bool /* followOK */ );
502 
503 extern int
504 GrabDevice(ClientPtr /* client */ ,
505            DeviceIntPtr /* dev */ ,
506            unsigned /* this_mode */ ,
507            unsigned /* other_mode */ ,
508            Window /* grabWindow */ ,
509            unsigned /* ownerEvents */ ,
510            Time /* ctime */ ,
511            GrabMask * /* mask */ ,
512            int /* grabtype */ ,
513            Cursor /* curs */ ,
514            Window /* confineToWin */ ,
515            CARD8 * /* status */ );
516 
517 extern void
518 InitEvents(void);
519 
520 extern void
521 CloseDownEvents(void);
522 
523 extern void
524 DeleteWindowFromAnyEvents(WindowPtr /* pWin */ ,
525                           Bool /* freeResources */ );
526 
527 extern Mask
528 EventMaskForClient(WindowPtr /* pWin */ ,
529                    ClientPtr /* client */ );
530 
531 extern _X_EXPORT int
532 DeliverEvents(WindowPtr /*pWin */ ,
533               xEventPtr /*xE */ ,
534               int /*count */ ,
535               WindowPtr /*otherParent */ );
536 
537 extern Bool
538 CheckMotion(DeviceEvent * /* ev */ ,
539             DeviceIntPtr /* pDev */ );
540 
541 extern _X_EXPORT void
542 WriteEventsToClient(ClientPtr /*pClient */ ,
543                     int /*count */ ,
544                     xEventPtr /*events */ );
545 
546 extern _X_EXPORT int
547 TryClientEvents(ClientPtr /*client */ ,
548                 DeviceIntPtr /* device */ ,
549                 xEventPtr /*pEvents */ ,
550                 int /*count */ ,
551                 Mask /*mask */ ,
552                 Mask /*filter */ ,
553                 GrabPtr /*grab */ );
554 
555 extern _X_EXPORT void
556 WindowsRestructured(void);
557 
558 extern int
559 SetClientPointer(ClientPtr /* client */ ,
560                  DeviceIntPtr /* device */ );
561 
562 extern _X_EXPORT DeviceIntPtr
563 PickPointer(ClientPtr /* client */ );
564 
565 extern _X_EXPORT DeviceIntPtr
566 PickKeyboard(ClientPtr /* client */ );
567 
568 extern Bool
569 IsInterferingGrab(ClientPtr /* client */ ,
570                   DeviceIntPtr /* dev */ ,
571                   xEvent * /* events */ );
572 
573 #ifdef PANORAMIX
574 extern _X_EXPORT void
575 ReinitializeRootWindow(WindowPtr win, int xoff, int yoff);
576 #endif
577 
578 #ifdef RANDR
579 extern _X_EXPORT void
580 ScreenRestructured(ScreenPtr pScreen);
581 #endif
582 
583 /*
584  *  ServerGrabCallback stuff
585  */
586 
587 extern _X_EXPORT CallbackListPtr ServerGrabCallback;
588 
589 typedef enum { SERVER_GRABBED, SERVER_UNGRABBED,
590     CLIENT_PERVIOUS, CLIENT_IMPERVIOUS
591 } ServerGrabState;
592 
593 typedef struct {
594     ClientPtr client;
595     ServerGrabState grabstate;
596 } ServerGrabInfoRec;
597 
598 /*
599  *  EventCallback stuff
600  */
601 
602 extern _X_EXPORT CallbackListPtr EventCallback;
603 
604 typedef struct {
605     ClientPtr client;
606     xEventPtr events;
607     int count;
608 } EventInfoRec;
609 
610 /*
611  *  DeviceEventCallback stuff
612  */
613 
614 extern _X_EXPORT CallbackListPtr DeviceEventCallback;
615 
616 typedef struct {
617     InternalEvent *event;
618     DeviceIntPtr device;
619 } DeviceEventInfoRec;
620 
621 extern _X_EXPORT CallbackListPtr RootWindowFinalizeCallback;
622 
623 extern int
624 XItoCoreType(int xi_type);
625 extern Bool
626 DevHasCursor(DeviceIntPtr pDev);
627 extern _X_EXPORT Bool
628 IsPointerDevice(DeviceIntPtr dev);
629 extern _X_EXPORT Bool
630 IsKeyboardDevice(DeviceIntPtr dev);
631 extern Bool
632 IsPointerEvent(InternalEvent *event);
633 extern Bool
634 IsTouchEvent(InternalEvent *event);
635 Bool
636 IsGestureEvent(InternalEvent *event);
637 Bool
638 IsGestureBeginEvent(InternalEvent *event);
639 Bool
640 IsGestureEndEvent(InternalEvent *event);
641 
642 extern _X_EXPORT Bool
643 IsMaster(DeviceIntPtr dev);
644 extern _X_EXPORT Bool
645 IsFloating(DeviceIntPtr dev);
646 
647 extern _X_HIDDEN void
648 CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
649 extern _X_HIDDEN int
650 CorePointerProc(DeviceIntPtr dev, int what);
651 extern _X_HIDDEN int
652 CoreKeyboardProc(DeviceIntPtr dev, int what);
653 
654 extern _X_EXPORT void *lastGLContext;
655 
656 #endif                          /* DIX_H */
657