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