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 #define REQUEST(type) \
65 type *stuff = (type *)client->requestBuffer
66
67 #define ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0]))
68
69 #define REQUEST_SIZE_MATCH(req)\
70 if ((sizeof(req) >> 2) != client->req_len)\
71 return(BadLength)
72
73 #define REQUEST_AT_LEAST_SIZE(req) \
74 if ((sizeof(req) >> 2) > client->req_len )\
75 return(BadLength)
76
77 #define REQUEST_AT_LEAST_EXTRA_SIZE(req, extra) \
78 if (((sizeof(req) + ((uint64_t) extra)) >> 2) > client->req_len ) \
79 return(BadLength)
80
81 #define REQUEST_FIXED_SIZE(req, n)\
82 if (((sizeof(req) >> 2) > client->req_len) || \
83 (((n) >> 2) >= client->req_len) || \
84 ((((uint64_t) sizeof(req) + (n) + 3) >> 2) != (uint64_t) client->req_len)) \
85 return(BadLength)
86
87 #define LEGAL_NEW_RESOURCE(id,client)\
88 if (!LegalNewID(id,client)) \
89 {\
90 client->errorValue = id;\
91 return BadIDChoice;\
92 }
93
94 #define VALIDATE_DRAWABLE_AND_GC(drawID, pDraw, mode)\
95 {\
96 int tmprc = dixLookupDrawable(&(pDraw), drawID, client, M_ANY, mode);\
97 if (tmprc != Success)\
98 return tmprc;\
99 tmprc = dixLookupGC(&(pGC), stuff->gc, client, DixUseAccess);\
100 if (tmprc != Success)\
101 return tmprc;\
102 if ((pGC->depth != pDraw->depth) || (pGC->pScreen != pDraw->pScreen))\
103 return BadMatch;\
104 }\
105 if (pGC->serialNumber != pDraw->serialNumber)\
106 ValidateGC(pDraw, pGC);
107
108 #define WriteReplyToClient(pClient, size, pReply) { \
109 if ((pClient)->swapped) \
110 (*ReplySwapVector[((xReq *)(pClient)->requestBuffer)->reqType]) \
111 (pClient, (int)(size), pReply); \
112 else WriteToClient(pClient, (int)(size), (pReply)); }
113
114 #define WriteSwappedDataToClient(pClient, size, pbuf) \
115 if ((pClient)->swapped) \
116 (*(pClient)->pSwapReplyFunc)(pClient, (int)(size), pbuf); \
117 else WriteToClient(pClient, (int)(size), (pbuf));
118
119 typedef struct _TimeStamp *TimeStampPtr;
120
121 #ifndef _XTYPEDEF_CLIENTPTR
122 typedef struct _Client *ClientPtr; /* also in misc.h */
123
124 #define _XTYPEDEF_CLIENTPTR
125 #endif
126
127 typedef struct _WorkQueue *WorkQueuePtr;
128
129 extern _X_EXPORT ClientPtr clients[MAXCLIENTS];
130 extern _X_EXPORT ClientPtr serverClient;
131 extern _X_EXPORT int currentMaxClients;
132 extern _X_EXPORT char dispatchExceptionAtReset;
133
134 typedef int HWEventQueueType;
135 typedef HWEventQueueType *HWEventQueuePtr;
136
137 extern _X_EXPORT HWEventQueuePtr checkForInput[2];
138
139 static inline _X_NOTSAN Bool
InputCheckPending(void)140 InputCheckPending(void)
141 {
142 return (*checkForInput[0] != *checkForInput[1]);
143 }
144
145 typedef struct _TimeStamp {
146 CARD32 months; /* really ~49.7 days */
147 CARD32 milliseconds;
148 } TimeStamp;
149
150 /* dispatch.c */
151 extern _X_EXPORT ClientPtr GetCurrentClient(void);
152
153 extern _X_EXPORT void SetInputCheck(HWEventQueuePtr /*c0 */ ,
154 HWEventQueuePtr /*c1 */ );
155
156 extern _X_EXPORT void CloseDownClient(ClientPtr /*client */ );
157
158 extern _X_EXPORT void UpdateCurrentTime(void);
159
160 extern _X_EXPORT void UpdateCurrentTimeIf(void);
161
162 extern _X_EXPORT int dixDestroyPixmap(void *value,
163 XID pid);
164
165 extern _X_EXPORT void InitClient(ClientPtr client,
166 int i,
167 void *ospriv);
168
169 extern _X_EXPORT ClientPtr NextAvailableClient(void *ospriv);
170
171 extern _X_EXPORT void SendErrorToClient(ClientPtr /*client */ ,
172 unsigned int /*majorCode */ ,
173 unsigned int /*minorCode */ ,
174 XID /*resId */ ,
175 int /*errorCode */ );
176
177 extern _X_EXPORT void MarkClientException(ClientPtr /*client */ );
178
179 extern _X_HIDDEN Bool CreateConnectionBlock(void);
180
181 /* dixutils.c */
182
183 extern _X_EXPORT int CompareISOLatin1Lowered(const unsigned char * /*a */ ,
184 int alen,
185 const unsigned char * /*b */ ,
186 int blen);
187
188 extern _X_EXPORT int dixLookupWindow(WindowPtr *result,
189 XID id,
190 ClientPtr client, Mask access_mode);
191
192 extern _X_EXPORT int dixLookupDrawable(DrawablePtr *result,
193 XID id,
194 ClientPtr client,
195 Mask type_mask, Mask access_mode);
196
197 extern _X_EXPORT int dixLookupGC(GCPtr *result,
198 XID id, ClientPtr client, Mask access_mode);
199
200 extern _X_EXPORT int dixLookupFontable(FontPtr *result,
201 XID id,
202 ClientPtr client, Mask access_mode);
203
204 extern _X_EXPORT int dixLookupClient(ClientPtr *result,
205 XID id,
206 ClientPtr client, Mask access_mode);
207
208 extern _X_EXPORT void NoopDDA(void);
209
210 extern _X_EXPORT int AlterSaveSetForClient(ClientPtr /*client */ ,
211 WindowPtr /*pWin */ ,
212 unsigned /*mode */ ,
213 Bool /*toRoot */ ,
214 Bool /*map */ );
215
216 extern _X_EXPORT void DeleteWindowFromAnySaveSet(WindowPtr /*pWin */ );
217
218 extern _X_EXPORT void BlockHandler(void *timeout);
219
220 extern _X_EXPORT void WakeupHandler(int result);
221
222 void
223 EnableLimitedSchedulingLatency(void);
224
225 void
226 DisableLimitedSchedulingLatency(void);
227
228 typedef void (*ServerBlockHandlerProcPtr) (void *blockData,
229 void *timeout);
230
231 typedef void (*ServerWakeupHandlerProcPtr) (void *blockData,
232 int result);
233
234 extern _X_EXPORT Bool RegisterBlockAndWakeupHandlers(ServerBlockHandlerProcPtr blockHandler,
235 ServerWakeupHandlerProcPtr wakeupHandler,
236 void *blockData);
237
238 extern _X_EXPORT void RemoveBlockAndWakeupHandlers(ServerBlockHandlerProcPtr blockHandler,
239 ServerWakeupHandlerProcPtr wakeupHandler,
240 void *blockData);
241
242 extern _X_EXPORT void InitBlockAndWakeupHandlers(void);
243
244 extern _X_EXPORT void ClearWorkQueue(void);
245
246 extern _X_EXPORT void ProcessWorkQueue(void);
247
248 extern _X_EXPORT void ProcessWorkQueueZombies(void);
249
250 extern _X_EXPORT Bool QueueWorkProc(Bool (*function)(ClientPtr clientUnused,
251 void *closure),
252 ClientPtr client,
253 void *closure);
254
255 typedef Bool (*ClientSleepProcPtr) (ClientPtr client,
256 void *closure);
257
258 extern _X_EXPORT Bool ClientSleep(ClientPtr client,
259 ClientSleepProcPtr function,
260 void *closure);
261
262 #ifndef ___CLIENTSIGNAL_DEFINED___
263 #define ___CLIENTSIGNAL_DEFINED___
264 extern _X_EXPORT Bool ClientSignal(ClientPtr /*client */ );
265 #endif /* ___CLIENTSIGNAL_DEFINED___ */
266
267 #define CLIENT_SIGNAL_ANY ((void *)-1)
268 extern _X_EXPORT int ClientSignalAll(ClientPtr /*client*/,
269 ClientSleepProcPtr /*function*/,
270 void * /*closure*/);
271
272 extern _X_EXPORT void ClientWakeup(ClientPtr /*client */ );
273
274 extern _X_EXPORT Bool ClientIsAsleep(ClientPtr /*client */ );
275
276 extern _X_EXPORT void SendGraphicsExpose(ClientPtr /*client */ ,
277 RegionPtr /*pRgn */ ,
278 XID /*drawable */ ,
279 int /*major */ ,
280 int /*minor */);
281
282 /* atom.c */
283
284 extern _X_EXPORT Atom MakeAtom(const char * /*string */ ,
285 unsigned /*len */ ,
286 Bool /*makeit */ );
287
288 extern _X_EXPORT Bool ValidAtom(Atom /*atom */ );
289
290 extern _X_EXPORT const char *NameForAtom(Atom /*atom */ );
291
292 extern _X_EXPORT void
293 AtomError(void)
294 _X_NORETURN;
295
296 extern _X_EXPORT void
297 FreeAllAtoms(void);
298
299 extern _X_EXPORT void
300 InitAtoms(void);
301
302 /* main.c */
303
304 extern _X_EXPORT void
305 SetVendorRelease(int release);
306
307 int
308 dix_main(int argc, char *argv[], char *envp[]);
309
310 /* events.c */
311
312 extern void
313 SetMaskForEvent(int /* deviceid */ ,
314 Mask /* mask */ ,
315 int /* event */ );
316
317 extern _X_EXPORT void
318 ConfineToShape(DeviceIntPtr /* pDev */ ,
319 RegionPtr /* shape */ ,
320 int * /* px */ ,
321 int * /* py */ );
322
323 extern _X_EXPORT Bool
324 IsParent(WindowPtr /* maybeparent */ ,
325 WindowPtr /* child */ );
326
327 extern _X_EXPORT WindowPtr
328 GetCurrentRootWindow(DeviceIntPtr pDev);
329
330 extern _X_EXPORT WindowPtr
331 GetSpriteWindow(DeviceIntPtr pDev);
332
333 extern _X_EXPORT void
334 NoticeTime(const DeviceIntPtr dev,
335 TimeStamp time);
336 extern _X_EXPORT void
337 NoticeEventTime(InternalEvent *ev,
338 DeviceIntPtr dev);
339 extern _X_EXPORT TimeStamp
340 LastEventTime(int deviceid);
341 extern _X_EXPORT Bool
342 LastEventTimeWasReset(int deviceid);
343 extern _X_EXPORT void
344 LastEventTimeToggleResetFlag(int deviceid, Bool state);
345 extern _X_EXPORT void
346 LastEventTimeToggleResetAll(Bool state);
347
348 extern void
349 EnqueueEvent(InternalEvent * /* ev */ ,
350 DeviceIntPtr /* device */ );
351 extern void
352 PlayReleasedEvents(void);
353
354 extern void
355 ActivatePointerGrab(DeviceIntPtr /* mouse */ ,
356 GrabPtr /* grab */ ,
357 TimeStamp /* time */ ,
358 Bool /* autoGrab */ );
359
360 extern void
361 DeactivatePointerGrab(DeviceIntPtr /* mouse */ );
362
363 extern void
364 ActivateKeyboardGrab(DeviceIntPtr /* keybd */ ,
365 GrabPtr /* grab */ ,
366 TimeStamp /* time */ ,
367 Bool /* passive */ );
368
369 extern void
370 DeactivateKeyboardGrab(DeviceIntPtr /* keybd */ );
371
372 extern BOOL
373 ActivateFocusInGrab(DeviceIntPtr /* dev */ ,
374 WindowPtr /* old */ ,
375 WindowPtr /* win */ );
376
377 extern void
378 AllowSome(ClientPtr /* client */ ,
379 TimeStamp /* time */ ,
380 DeviceIntPtr /* thisDev */ ,
381 int /* newState */ );
382
383 extern void
384 ReleaseActiveGrabs(ClientPtr client);
385
386 extern GrabPtr
387 CheckPassiveGrabsOnWindow(WindowPtr /* pWin */ ,
388 DeviceIntPtr /* device */ ,
389 InternalEvent * /* event */ ,
390 BOOL /* checkCore */ ,
391 BOOL /* activate */ );
392
393 extern _X_EXPORT int
394 DeliverEventsToWindow(DeviceIntPtr /* pWin */ ,
395 WindowPtr /* pWin */ ,
396 xEventPtr /* pEvents */ ,
397 int /* count */ ,
398 Mask /* filter */ ,
399 GrabPtr /* grab */ );
400
401 extern _X_EXPORT void
402 DeliverRawEvent(RawDeviceEvent * /* ev */ ,
403 DeviceIntPtr /* dev */
404 );
405
406 extern int
407 DeliverDeviceEvents(WindowPtr /* pWin */ ,
408 InternalEvent * /* event */ ,
409 GrabPtr /* grab */ ,
410 WindowPtr /* stopAt */ ,
411 DeviceIntPtr /* dev */ );
412
413 extern int
414 DeliverOneGrabbedEvent(InternalEvent * /* event */ ,
415 DeviceIntPtr /* dev */ ,
416 enum InputLevel /* level */ );
417
418 extern void
419 DeliverTouchEvents(DeviceIntPtr /* dev */ ,
420 TouchPointInfoPtr /* ti */ ,
421 InternalEvent * /* ev */ ,
422 XID /* resource */ );
423
424 extern void
425 InitializeSprite(DeviceIntPtr /* pDev */ ,
426 WindowPtr /* pWin */ );
427 extern void
428 FreeSprite(DeviceIntPtr pDev);
429
430 extern void
431 UpdateSpriteForScreen(DeviceIntPtr /* pDev */ ,
432 ScreenPtr /* pScreen */ );
433
434 extern _X_EXPORT void
435 WindowHasNewCursor(WindowPtr /* pWin */ );
436
437 extern Bool
438 CheckDeviceGrabs(DeviceIntPtr /* device */ ,
439 DeviceEvent * /* event */ ,
440 WindowPtr /* ancestor */ );
441
442 extern void
443 DeliverFocusedEvent(DeviceIntPtr /* keybd */ ,
444 InternalEvent * /* event */ ,
445 WindowPtr /* window */ );
446
447 extern int
448 DeliverGrabbedEvent(InternalEvent * /* event */ ,
449 DeviceIntPtr /* thisDev */ ,
450 Bool /* deactivateGrab */ );
451
452 extern void
453 FixKeyState(DeviceEvent * /* event */ ,
454 DeviceIntPtr /* keybd */ );
455
456 extern void
457 RecalculateDeliverableEvents(WindowPtr /* pWin */ );
458
459 extern _X_EXPORT int
460 OtherClientGone(void *value,
461 XID id);
462
463 extern void
464 DoFocusEvents(DeviceIntPtr /* dev */ ,
465 WindowPtr /* fromWin */ ,
466 WindowPtr /* toWin */ ,
467 int /* mode */ );
468
469 extern int
470 SetInputFocus(ClientPtr /* client */ ,
471 DeviceIntPtr /* dev */ ,
472 Window /* focusID */ ,
473 CARD8 /* revertTo */ ,
474 Time /* ctime */ ,
475 Bool /* followOK */ );
476
477 extern int
478 GrabDevice(ClientPtr /* client */ ,
479 DeviceIntPtr /* dev */ ,
480 unsigned /* this_mode */ ,
481 unsigned /* other_mode */ ,
482 Window /* grabWindow */ ,
483 unsigned /* ownerEvents */ ,
484 Time /* ctime */ ,
485 GrabMask * /* mask */ ,
486 int /* grabtype */ ,
487 Cursor /* curs */ ,
488 Window /* confineToWin */ ,
489 CARD8 * /* status */ );
490
491 extern void
492 InitEvents(void);
493
494 extern void
495 CloseDownEvents(void);
496
497 extern void
498 DeleteWindowFromAnyEvents(WindowPtr /* pWin */ ,
499 Bool /* freeResources */ );
500
501 extern Mask
502 EventMaskForClient(WindowPtr /* pWin */ ,
503 ClientPtr /* client */ );
504
505 extern _X_EXPORT int
506 DeliverEvents(WindowPtr /*pWin */ ,
507 xEventPtr /*xE */ ,
508 int /*count */ ,
509 WindowPtr /*otherParent */ );
510
511 extern Bool
512 CheckMotion(DeviceEvent * /* ev */ ,
513 DeviceIntPtr /* pDev */ );
514
515 extern _X_EXPORT void
516 WriteEventsToClient(ClientPtr /*pClient */ ,
517 int /*count */ ,
518 xEventPtr /*events */ );
519
520 extern _X_EXPORT int
521 TryClientEvents(ClientPtr /*client */ ,
522 DeviceIntPtr /* device */ ,
523 xEventPtr /*pEvents */ ,
524 int /*count */ ,
525 Mask /*mask */ ,
526 Mask /*filter */ ,
527 GrabPtr /*grab */ );
528
529 extern _X_EXPORT void
530 WindowsRestructured(void);
531
532 extern int
533 SetClientPointer(ClientPtr /* client */ ,
534 DeviceIntPtr /* device */ );
535
536 extern _X_EXPORT DeviceIntPtr
537 PickPointer(ClientPtr /* client */ );
538
539 extern _X_EXPORT DeviceIntPtr
540 PickKeyboard(ClientPtr /* client */ );
541
542 extern Bool
543 IsInterferingGrab(ClientPtr /* client */ ,
544 DeviceIntPtr /* dev */ ,
545 xEvent * /* events */ );
546
547 #ifdef PANORAMIX
548 extern _X_EXPORT void
549 ReinitializeRootWindow(WindowPtr win, int xoff, int yoff);
550 #endif
551
552 #ifdef RANDR
553 extern _X_EXPORT void
554 ScreenRestructured(ScreenPtr pScreen);
555 #endif
556
557 /*
558 * ServerGrabCallback stuff
559 */
560
561 extern _X_EXPORT CallbackListPtr ServerGrabCallback;
562
563 typedef enum { SERVER_GRABBED, SERVER_UNGRABBED,
564 CLIENT_PERVIOUS, CLIENT_IMPERVIOUS
565 } ServerGrabState;
566
567 typedef struct {
568 ClientPtr client;
569 ServerGrabState grabstate;
570 } ServerGrabInfoRec;
571
572 /*
573 * EventCallback stuff
574 */
575
576 extern _X_EXPORT CallbackListPtr EventCallback;
577
578 typedef struct {
579 ClientPtr client;
580 xEventPtr events;
581 int count;
582 } EventInfoRec;
583
584 /*
585 * DeviceEventCallback stuff
586 */
587
588 extern _X_EXPORT CallbackListPtr DeviceEventCallback;
589
590 typedef struct {
591 InternalEvent *event;
592 DeviceIntPtr device;
593 } DeviceEventInfoRec;
594
595 extern _X_EXPORT CallbackListPtr RootWindowFinalizeCallback;
596
597 extern int
598 XItoCoreType(int xi_type);
599 extern Bool
600 DevHasCursor(DeviceIntPtr pDev);
601 extern _X_EXPORT Bool
602 IsPointerDevice(DeviceIntPtr dev);
603 extern _X_EXPORT Bool
604 IsKeyboardDevice(DeviceIntPtr dev);
605 extern Bool
606 IsPointerEvent(InternalEvent *event);
607 extern Bool
608 IsTouchEvent(InternalEvent *event);
609 extern _X_EXPORT Bool
610 IsMaster(DeviceIntPtr dev);
611 extern _X_EXPORT Bool
612 IsFloating(DeviceIntPtr dev);
613
614 extern _X_HIDDEN void
615 CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
616 extern _X_HIDDEN int
617 CorePointerProc(DeviceIntPtr dev, int what);
618 extern _X_HIDDEN int
619 CoreKeyboardProc(DeviceIntPtr dev, int what);
620
621 extern _X_EXPORT void *lastGLContext;
622
623 #endif /* DIX_H */
624