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