1 /***********************************************************
3 Copyright 1987, 1998 The Open Group
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.
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
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.
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.
26 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
28 All Rights Reserved
30 Permission to use, copy, modify, and distribute this software and its
31 documentation for any purpose and without fee is hereby granted,
32 provided that the above copyright notice appear in all copies and that
33 both that copyright notice and this permission notice appear in
34 supporting documentation, and that the name of Digital not be
35 used in advertising or publicity pertaining to distribution of the
36 software without specific, written prior permission.
38 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
39 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
40 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
41 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
42 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
43 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
44 SOFTWARE.
46 ******************************************************************/
48 #ifndef DIX_H
49 #define DIX_H
51 #include "callback.h"
52 #include "gc.h"
53 #include "window.h"
54 #include "input.h"
55 #include "cursor.h"
56 #include "geext.h"
57 #include "events.h"
58 #include <X11/extensions/XI.h>
60 #define EARLIER -1
61 #define SAMETIME 0
62 #define LATER 1
64 #define NullClient ((ClientPtr) 0)
65 #define REQUEST(type) \
66 type *stuff = (type *)client->requestBuffer
69 #define REQUEST_SIZE_MATCH(req)\
70 if ((sizeof(req) >> 2) != client->req_len)\
71 return(BadLength)
73 #define REQUEST_AT_LEAST_SIZE(req) \
74 if ((sizeof(req) >> 2) > client->req_len )\
75 return(BadLength)
77 #define REQUEST_FIXED_SIZE(req, n)\
78 if (((sizeof(req) >> 2) > client->req_len) || \
79 (((sizeof(req) + (n) + 3) >> 2) != client->req_len)) \
80 return(BadLength)
82 #define LEGAL_NEW_RESOURCE(id,client)\
83 if (!LegalNewID(id,client)) \
84 {\
85 client->errorValue = id;\
86 return BadIDChoice;\
87 }
89 #define VALIDATE_DRAWABLE_AND_GC(drawID, pDraw, mode)\
90 {\
91 int rc = dixLookupDrawable(&(pDraw), drawID, client, M_ANY, mode);\
92 if (rc != Success)\
93 return rc;\
94 rc = dixLookupGC(&(pGC), stuff->gc, client, DixUseAccess);\
95 if (rc != Success)\
96 return rc;\
97 if ((pGC->depth != pDraw->depth) || (pGC->pScreen != pDraw->pScreen))\
98 return BadMatch;\
99 }\
100 if (pGC->serialNumber != pDraw->serialNumber)\
101 ValidateGC(pDraw, pGC);
104 #define WriteReplyToClient(pClient, size, pReply) { \
105 if ((pClient)->swapped) \
106 (*ReplySwapVector[((xReq *)(pClient)->requestBuffer)->reqType]) \
107 (pClient, (int)(size), pReply); \
108 else (void) WriteToClient(pClient, (int)(size), (char *)(pReply)); }
110 #define WriteSwappedDataToClient(pClient, size, pbuf) \
111 if ((pClient)->swapped) \
112 (*(pClient)->pSwapReplyFunc)(pClient, (int)(size), pbuf); \
113 else (void) WriteToClient (pClient, (int)(size), (char *)(pbuf));
115 typedef struct _TimeStamp *TimeStampPtr;
117 #ifndef _XTYPEDEF_CLIENTPTR
118 typedef struct _Client *ClientPtr; /* also in misc.h */
119 #define _XTYPEDEF_CLIENTPTR
120 #endif
122 typedef struct _WorkQueue *WorkQueuePtr;
124 extern _X_EXPORT ClientPtr clients[MAXCLIENTS];
125 extern _X_EXPORT ClientPtr serverClient;
126 extern _X_EXPORT int currentMaxClients;
127 extern _X_EXPORT char dispatchExceptionAtReset;
129 typedef int HWEventQueueType;
130 typedef HWEventQueueType* HWEventQueuePtr;
132 extern _X_EXPORT HWEventQueuePtr checkForInput[2];
134 typedef struct _TimeStamp {
135 CARD32 months; /* really ~49.7 days */
136 CARD32 milliseconds;
137 } TimeStamp;
139 /* dispatch.c */
141 extern _X_EXPORT void SetInputCheck(
142 HWEventQueuePtr /*c0*/,
143 HWEventQueuePtr /*c1*/);
145 extern _X_EXPORT void CloseDownClient(
146 ClientPtr /*client*/);
148 extern _X_EXPORT void UpdateCurrentTime(void);
150 extern _X_EXPORT void UpdateCurrentTimeIf(void);
152 extern _X_EXPORT int dixDestroyPixmap(
153 pointer /*value*/,
154 XID /*pid*/);
156 extern _X_EXPORT void InitClient(
157 ClientPtr /*client*/,
158 int /*i*/,
159 pointer /*ospriv*/);
161 extern _X_EXPORT ClientPtr NextAvailableClient(
162 pointer /*ospriv*/);
164 extern _X_EXPORT void SendErrorToClient(
165 ClientPtr /*client*/,
166 unsigned int /*majorCode*/,
167 unsigned int /*minorCode*/,
168 XID /*resId*/,
169 int /*errorCode*/);
171 extern _X_EXPORT void MarkClientException(
172 ClientPtr /*client*/);
174 extern _X_HIDDEN Bool CreateConnectionBlock(void);
175 /* dixutils.c */
177 extern _X_EXPORT int CompareISOLatin1Lowered(
178 unsigned char * /*a*/,
179 int alen,
180 unsigned char * /*b*/,
181 int blen);
183 extern _X_EXPORT int dixLookupWindow(
184 WindowPtr *result,
185 XID id,
186 ClientPtr client,
187 Mask access_mode);
189 extern _X_EXPORT int dixLookupDrawable(
190 DrawablePtr *result,
191 XID id,
192 ClientPtr client,
193 Mask type_mask,
194 Mask access_mode);
196 extern _X_EXPORT int dixLookupGC(
197 GCPtr *result,
198 XID id,
199 ClientPtr client,
200 Mask access_mode);
202 extern _X_EXPORT int dixLookupFontable(
203 FontPtr *result,
204 XID id,
205 ClientPtr client,
206 Mask access_mode);
208 extern _X_EXPORT int dixLookupClient(
209 ClientPtr *result,
210 XID id,
211 ClientPtr client,
212 Mask access_mode);
214 extern _X_EXPORT void NoopDDA(void);
216 extern _X_EXPORT int AlterSaveSetForClient(
217 ClientPtr /*client*/,
218 WindowPtr /*pWin*/,
219 unsigned /*mode*/,
220 Bool /*toRoot*/,
221 Bool /*map*/);
223 extern _X_EXPORT void DeleteWindowFromAnySaveSet(
224 WindowPtr /*pWin*/);
226 extern _X_EXPORT void BlockHandler(
227 pointer /*pTimeout*/,
228 pointer /*pReadmask*/);
230 extern _X_EXPORT void WakeupHandler(
231 int /*result*/,
232 pointer /*pReadmask*/);
234 void
235 EnableLimitedSchedulingLatency(void);
237 void
238 DisableLimitedSchedulingLatency(void);
240 typedef void (* WakeupHandlerProcPtr)(
241 pointer /* blockData */,
242 int /* result */,
243 pointer /* pReadmask */);
245 extern _X_EXPORT Bool RegisterBlockAndWakeupHandlers(
246 BlockHandlerProcPtr /*blockHandler*/,
247 WakeupHandlerProcPtr /*wakeupHandler*/,
248 pointer /*blockData*/);
250 extern _X_EXPORT void RemoveBlockAndWakeupHandlers(
251 BlockHandlerProcPtr /*blockHandler*/,
252 WakeupHandlerProcPtr /*wakeupHandler*/,
253 pointer /*blockData*/);
255 extern _X_EXPORT void InitBlockAndWakeupHandlers(void);
257 extern _X_EXPORT void ProcessWorkQueue(void);
259 extern _X_EXPORT void ProcessWorkQueueZombies(void);
261 extern _X_EXPORT Bool QueueWorkProc(
262 Bool (* /*function*/)(
263 ClientPtr /*clientUnused*/,
264 pointer /*closure*/),
265 ClientPtr /*client*/,
266 pointer /*closure*/
267 );
269 extern _X_EXPORT Bool QueueWorkItem(WorkQueuePtr item);
271 typedef Bool (* ClientSleepProcPtr)(
272 ClientPtr /*client*/,
273 pointer /*closure*/);
275 extern _X_EXPORT Bool ClientSleep(
276 ClientPtr /*client*/,
277 ClientSleepProcPtr /* function */,
278 pointer /*closure*/);
280 #ifndef ___CLIENTSIGNAL_DEFINED___
281 #define ___CLIENTSIGNAL_DEFINED___
282 extern _X_EXPORT Bool ClientSignal(
283 ClientPtr /*client*/);
284 #endif /* ___CLIENTSIGNAL_DEFINED___ */
286 extern _X_EXPORT void ClientWakeup(
287 ClientPtr /*client*/);
289 extern _X_EXPORT Bool ClientIsAsleep(
290 ClientPtr /*client*/);
292 /* atom.c */
294 extern _X_EXPORT Atom MakeAtom(
295 const char * /*string*/,
296 unsigned /*len*/,
297 Bool /*makeit*/);
299 extern _X_EXPORT Bool ValidAtom(
300 Atom /*atom*/);
302 extern _X_EXPORT const char *NameForAtom(
303 Atom /*atom*/);
305 extern _X_EXPORT void AtomError(void) _X_NORETURN;
307 extern _X_EXPORT void FreeAllAtoms(void);
309 extern _X_EXPORT void InitAtoms(void);
311 /* main.c */
313 extern _X_EXPORT void SetVendorRelease(int release);
315 extern _X_EXPORT void SetVendorString(char *string);
317 /* events.c */
319 extern void SetMaskForEvent(
320 int /* deviceid */,
321 Mask /* mask */,
322 int /* event */);
324 extern _X_EXPORT void ConfineToShape(
325 DeviceIntPtr /* pDev */,
326 RegionPtr /* shape */,
327 int* /* px */,
328 int* /* py */);
330 extern _X_EXPORT Bool IsParent(
331 WindowPtr /* maybeparent */,
332 WindowPtr /* child */);
334 extern _X_EXPORT WindowPtr GetCurrentRootWindow(DeviceIntPtr pDev);
336 extern _X_EXPORT WindowPtr GetSpriteWindow(DeviceIntPtr pDev);
339 extern _X_EXPORT void NoticeEventTime(InternalEvent *ev);
341 extern void EnqueueEvent(
342 InternalEvent * /* ev */,
343 DeviceIntPtr /* device */);
344 extern void PlayReleasedEvents(void);
346 extern void ActivatePointerGrab(
347 DeviceIntPtr /* mouse */,
348 GrabPtr /* grab */,
349 TimeStamp /* time */,
350 Bool /* autoGrab */);
352 extern void DeactivatePointerGrab(
353 DeviceIntPtr /* mouse */);
355 extern void ActivateKeyboardGrab(
356 DeviceIntPtr /* keybd */,
357 GrabPtr /* grab */,
358 TimeStamp /* time */,
359 Bool /* passive */);
361 extern void DeactivateKeyboardGrab(
362 DeviceIntPtr /* keybd */);
364 extern BOOL ActivateFocusInGrab(
365 DeviceIntPtr /* dev */,
366 WindowPtr /* old */,
367 WindowPtr /* win */);
369 extern void AllowSome(
370 ClientPtr /* client */,
371 TimeStamp /* time */,
372 DeviceIntPtr /* thisDev */,
373 int /* newState */);
375 extern void ReleaseActiveGrabs(
376 ClientPtr client);
378 extern GrabPtr CheckPassiveGrabsOnWindow(
379 WindowPtr /* pWin */,
380 DeviceIntPtr /* device */,
381 InternalEvent * /* event */,
382 BOOL /* checkCore */,
383 BOOL /* activate */);
385 extern _X_EXPORT int DeliverEventsToWindow(
386 DeviceIntPtr /* pWin */,
387 WindowPtr /* pWin */,
388 xEventPtr /* pEvents */,
389 int /* count */,
390 Mask /* filter */,
391 GrabPtr /* grab */);
393 extern _X_EXPORT void DeliverRawEvent(
394 RawDeviceEvent* /* ev */,
395 DeviceIntPtr /* dev */
396 );
398 extern int DeliverDeviceEvents(
399 WindowPtr /* pWin */,
400 InternalEvent* /* event */,
401 GrabPtr /* grab */,
402 WindowPtr /* stopAt */,
403 DeviceIntPtr /* dev */);
405 extern int DeliverOneGrabbedEvent(
406 InternalEvent* /* event*/,
407 DeviceIntPtr /* dev */,
408 enum InputLevel /* level */);
410 extern void DeliverTouchEvents(
411 DeviceIntPtr /* dev */,
412 TouchPointInfoPtr /* ti */,
413 InternalEvent* /* ev */,
414 XID /* resource */);
416 extern void InitializeSprite(
417 DeviceIntPtr /* pDev */,
418 WindowPtr /* pWin */);
420 extern void UpdateSpriteForScreen(
421 DeviceIntPtr /* pDev */,
422 ScreenPtr /* pScreen */);
424 extern _X_EXPORT void WindowHasNewCursor(
425 WindowPtr /* pWin */);
427 extern Bool CheckDeviceGrabs(
428 DeviceIntPtr /* device */,
429 DeviceEvent* /* event */,
430 WindowPtr /* ancestor */);
432 extern void DeliverFocusedEvent(
433 DeviceIntPtr /* keybd */,
434 InternalEvent* /* event */,
435 WindowPtr /* window */);
437 extern int DeliverGrabbedEvent(
438 InternalEvent* /* event */,
439 DeviceIntPtr /* thisDev */,
440 Bool /* deactivateGrab */);
442 extern void FixKeyState(
443 DeviceEvent* /* event */,
444 DeviceIntPtr /* keybd */);
446 extern void RecalculateDeliverableEvents(
447 WindowPtr /* pWin */);
449 extern _X_EXPORT int OtherClientGone(
450 pointer /* value */,
451 XID /* id */);
453 extern void DoFocusEvents(
454 DeviceIntPtr /* dev */,
455 WindowPtr /* fromWin */,
456 WindowPtr /* toWin */,
457 int /* mode */);
459 extern int SetInputFocus(
460 ClientPtr /* client */,
461 DeviceIntPtr /* dev */,
462 Window /* focusID */,
463 CARD8 /* revertTo */,
464 Time /* ctime */,
465 Bool /* followOK */);
467 extern int GrabDevice(
468 ClientPtr /* client */,
469 DeviceIntPtr /* dev */,
470 unsigned /* this_mode */,
471 unsigned /* other_mode */,
472 Window /* grabWindow */,
473 unsigned /* ownerEvents */,
474 Time /* ctime */,
475 GrabMask* /* mask */,
476 int /* grabtype */,
477 Cursor /* curs */,
478 Window /* confineToWin */,
479 CARD8 * /* status */);
481 extern void InitEvents(void);
483 extern void CloseDownEvents(void);
485 extern void DeleteWindowFromAnyEvents(
486 WindowPtr /* pWin */,
487 Bool /* freeResources */);
490 extern Mask EventMaskForClient(
491 WindowPtr /* pWin */,
492 ClientPtr /* client */);
496 extern _X_EXPORT int DeliverEvents(
497 WindowPtr /*pWin*/,
498 xEventPtr /*xE*/,
499 int /*count*/,
500 WindowPtr /*otherParent*/);
502 extern Bool CheckMotion(
503 DeviceEvent* /* ev */,
504 DeviceIntPtr /* pDev */);
506 extern _X_EXPORT void WriteEventsToClient(
507 ClientPtr /*pClient*/,
508 int /*count*/,
509 xEventPtr /*events*/);
511 extern _X_EXPORT int TryClientEvents(
512 ClientPtr /*client*/,
513 DeviceIntPtr /* device */,
514 xEventPtr /*pEvents*/,
515 int /*count*/,
516 Mask /*mask*/,
517 Mask /*filter*/,
518 GrabPtr /*grab*/);
520 extern _X_EXPORT void WindowsRestructured(void);
522 extern int SetClientPointer(
523 ClientPtr /* client */,
524 DeviceIntPtr /* device */);
526 extern _X_EXPORT DeviceIntPtr PickPointer(
527 ClientPtr /* client */);
529 extern _X_EXPORT DeviceIntPtr PickKeyboard(
530 ClientPtr /* client */);
532 extern Bool IsInterferingGrab(
533 ClientPtr /* client */,
534 DeviceIntPtr /* dev */,
535 xEvent* /* events */);
537 #ifdef PANORAMIX
538 extern _X_EXPORT void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff);
539 #endif
541 #ifdef RANDR
542 extern _X_EXPORT void
543 ScreenRestructured (ScreenPtr pScreen);
544 #endif
546 extern _X_EXPORT int ffs(int i);
549 /*
550 * ServerGrabCallback stuff
551 */
553 extern _X_EXPORT CallbackListPtr ServerGrabCallback;
555 typedef enum {SERVER_GRABBED, SERVER_UNGRABBED,
556 CLIENT_PERVIOUS, CLIENT_IMPERVIOUS } ServerGrabState;
558 typedef struct {
559 ClientPtr client;
560 ServerGrabState grabstate;
561 } ServerGrabInfoRec;
563 /*
564 * EventCallback stuff
565 */
567 extern _X_EXPORT CallbackListPtr EventCallback;
569 typedef struct {
570 ClientPtr client;
571 xEventPtr events;
572 int count;
573 } EventInfoRec;
575 /*
576 * DeviceEventCallback stuff
577 */
579 extern _X_EXPORT CallbackListPtr DeviceEventCallback;
581 typedef struct {
582 InternalEvent *event;
583 DeviceIntPtr device;
584 } DeviceEventInfoRec;
586 extern int XItoCoreType(int xi_type);
587 extern Bool DevHasCursor(DeviceIntPtr pDev);
588 extern _X_EXPORT Bool IsPointerDevice(DeviceIntPtr dev);
589 extern _X_EXPORT Bool IsKeyboardDevice(DeviceIntPtr dev);
590 extern Bool IsPointerEvent(InternalEvent *event);
591 extern Bool IsTouchEvent(InternalEvent *event);
592 extern _X_EXPORT Bool IsMaster(DeviceIntPtr dev);
593 extern _X_EXPORT Bool IsFloating(DeviceIntPtr dev);
595 extern _X_HIDDEN void CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master);
596 extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what);
597 extern _X_HIDDEN int CoreKeyboardProc(DeviceIntPtr dev, int what);
599 #endif /* DIX_H */