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