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
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.
25 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
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.
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
45 ******************************************************************/
57 #include <X11/extensions/XI.h>
63 #define NullClient ((ClientPtr) 0)
64 #define REQUEST(type) \
65 type *stuff = (type *)client->requestBuffer
67 #define ARRAY_SIZE(a) (sizeof((a)) / sizeof((a)[0]))
69 #define REQUEST_SIZE_MATCH(req)\
70 if ((sizeof(req) >> 2) != client->req_len)\
73 #define REQUEST_AT_LEAST_SIZE(req) \
74 if ((sizeof(req) >> 2) > client->req_len )\
77 #define REQUEST_FIXED_SIZE(req, n)\
78 if (((sizeof(req) >> 2) > client->req_len) || \
79 (((sizeof(req) + (n) + 3) >> 2) != client->req_len)) \
82 #define LEGAL_NEW_RESOURCE(id,client)\
83 if (!LegalNewID(id,client)) \
85 client->errorValue = id;\
89 #define VALIDATE_DRAWABLE_AND_GC(drawID, pDraw, mode)\
91 int tmprc = dixLookupDrawable(&(pDraw), drawID, client, M_ANY, mode);\
92 if (tmprc != Success)\
94 tmprc = dixLookupGC(&(pGC), stuff->gc, client, DixUseAccess);\
95 if (tmprc != Success)\
97 if ((pGC->depth != pDraw->depth) || (pGC->pScreen != pDraw->pScreen))\
100 if (pGC->serialNumber != pDraw->serialNumber)\
101 ValidateGC(pDraw, pGC);
103 #define WriteReplyToClient(pClient, size, pReply) { \
104 if ((pClient)->swapped) \
105 (*ReplySwapVector[((xReq *)(pClient)->requestBuffer)->reqType]) \
106 (pClient, (int)(size), pReply); \
107 else WriteToClient(pClient, (int)(size), (pReply)); }
109 #define WriteSwappedDataToClient(pClient, size, pbuf) \
110 if ((pClient)->swapped) \
111 (*(pClient)->pSwapReplyFunc)(pClient, (int)(size), pbuf); \
112 else WriteToClient(pClient, (int)(size), (pbuf));
114 typedef struct _TimeStamp
*TimeStampPtr
;
116 #ifndef _XTYPEDEF_CLIENTPTR
117 typedef struct _Client
*ClientPtr
; /* also in misc.h */
119 #define _XTYPEDEF_CLIENTPTR
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 */
141 extern _X_EXPORT
void SetInputCheck(HWEventQueuePtr
/*c0 */ ,
142 HWEventQueuePtr
/*c1 */ );
144 extern _X_EXPORT
void CloseDownClient(ClientPtr
/*client */ );
146 extern _X_EXPORT
void UpdateCurrentTime(void);
148 extern _X_EXPORT
void UpdateCurrentTimeIf(void);
150 extern _X_EXPORT
int dixDestroyPixmap(pointer
/*value */ ,
153 extern _X_EXPORT
void InitClient(ClientPtr
/*client */ ,
155 pointer
/*ospriv */ );
157 extern _X_EXPORT ClientPtr
NextAvailableClient(pointer
/*ospriv */ );
159 extern _X_EXPORT
void SendErrorToClient(ClientPtr
/*client */ ,
160 unsigned int /*majorCode */ ,
161 unsigned int /*minorCode */ ,
163 int /*errorCode */ );
165 extern _X_EXPORT
void MarkClientException(ClientPtr
/*client */ );
167 extern _X_HIDDEN Bool
CreateConnectionBlock(void);
171 extern _X_EXPORT
int CompareISOLatin1Lowered(const unsigned char * /*a */ ,
173 const unsigned char * /*b */ ,
176 extern _X_EXPORT
int dixLookupWindow(WindowPtr
*result
,
178 ClientPtr client
, Mask access_mode
);
180 extern _X_EXPORT
int dixLookupDrawable(DrawablePtr
*result
,
183 Mask type_mask
, Mask access_mode
);
185 extern _X_EXPORT
int dixLookupGC(GCPtr
*result
,
186 XID id
, ClientPtr client
, Mask access_mode
);
188 extern _X_EXPORT
int dixLookupFontable(FontPtr
*result
,
190 ClientPtr client
, Mask access_mode
);
192 extern _X_EXPORT
int dixLookupClient(ClientPtr
*result
,
194 ClientPtr client
, Mask access_mode
);
196 extern _X_EXPORT
void NoopDDA(void);
198 extern _X_EXPORT
int AlterSaveSetForClient(ClientPtr
/*client */ ,
199 WindowPtr
/*pWin */ ,
204 extern _X_EXPORT
void DeleteWindowFromAnySaveSet(WindowPtr
/*pWin */ );
206 extern _X_EXPORT
void BlockHandler(pointer
/*pTimeout */ ,
207 pointer
/*pReadmask */ );
209 extern _X_EXPORT
void WakeupHandler(int /*result */ ,
210 pointer
/*pReadmask */ );
213 EnableLimitedSchedulingLatency(void);
216 DisableLimitedSchedulingLatency(void);
218 typedef void (*WakeupHandlerProcPtr
) (pointer
/* blockData */ ,
220 pointer
/* pReadmask */ );
222 extern _X_EXPORT Bool
RegisterBlockAndWakeupHandlers(BlockHandlerProcPtr
226 pointer
/*blockData */ );
228 extern _X_EXPORT
void RemoveBlockAndWakeupHandlers(BlockHandlerProcPtr
232 pointer
/*blockData */ );
234 extern _X_EXPORT
void InitBlockAndWakeupHandlers(void);
236 extern _X_EXPORT
void ProcessWorkQueue(void);
238 extern _X_EXPORT
void ProcessWorkQueueZombies(void);
240 extern _X_EXPORT Bool
QueueWorkProc(Bool (* /*function */ )(
246 ClientPtr
/*client */ ,
250 typedef Bool (*ClientSleepProcPtr
) (ClientPtr
/*client */ ,
251 pointer
/*closure */ );
253 extern _X_EXPORT Bool
ClientSleep(ClientPtr
/*client */ ,
254 ClientSleepProcPtr
/* function */ ,
255 pointer
/*closure */ );
257 #ifndef ___CLIENTSIGNAL_DEFINED___
258 #define ___CLIENTSIGNAL_DEFINED___
259 extern _X_EXPORT Bool
ClientSignal(ClientPtr
/*client */ );
260 #endif /* ___CLIENTSIGNAL_DEFINED___ */
262 extern _X_EXPORT
void ClientWakeup(ClientPtr
/*client */ );
264 extern _X_EXPORT Bool
ClientIsAsleep(ClientPtr
/*client */ );
268 extern _X_EXPORT Atom
MakeAtom(const char * /*string */ ,
272 extern _X_EXPORT Bool
ValidAtom(Atom
/*atom */ );
274 extern _X_EXPORT
const char *NameForAtom(Atom
/*atom */ );
276 extern _X_EXPORT
void
280 extern _X_EXPORT
void
283 extern _X_EXPORT
void
288 extern _X_EXPORT
void
289 SetVendorRelease(int release
);
291 extern _X_EXPORT
void
292 SetVendorString(char *string
);
297 SetMaskForEvent(int /* deviceid */ ,
301 extern _X_EXPORT
void
302 ConfineToShape(DeviceIntPtr
/* pDev */ ,
303 RegionPtr
/* shape */ ,
307 extern _X_EXPORT Bool
308 IsParent(WindowPtr
/* maybeparent */ ,
309 WindowPtr
/* child */ );
311 extern _X_EXPORT WindowPtr
312 GetCurrentRootWindow(DeviceIntPtr pDev
);
314 extern _X_EXPORT WindowPtr
315 GetSpriteWindow(DeviceIntPtr pDev
);
317 extern _X_EXPORT
void
318 NoticeTime(const DeviceIntPtr dev
,
320 extern _X_EXPORT
void
321 NoticeEventTime(InternalEvent
*ev
,
323 extern _X_EXPORT TimeStamp
324 LastEventTime(int deviceid
);
325 extern _X_EXPORT Bool
326 LastEventTimeWasReset(int deviceid
);
327 extern _X_EXPORT
void
328 LastEventTimeToggleResetFlag(int deviceid
, Bool state
);
329 extern _X_EXPORT
void
330 LastEventTimeToggleResetAll(Bool state
);
333 EnqueueEvent(InternalEvent
* /* ev */ ,
334 DeviceIntPtr
/* device */ );
336 PlayReleasedEvents(void);
339 ActivatePointerGrab(DeviceIntPtr
/* mouse */ ,
341 TimeStamp
/* time */ ,
342 Bool
/* autoGrab */ );
345 DeactivatePointerGrab(DeviceIntPtr
/* mouse */ );
348 ActivateKeyboardGrab(DeviceIntPtr
/* keybd */ ,
350 TimeStamp
/* time */ ,
351 Bool
/* passive */ );
354 DeactivateKeyboardGrab(DeviceIntPtr
/* keybd */ );
357 ActivateFocusInGrab(DeviceIntPtr
/* dev */ ,
358 WindowPtr
/* old */ ,
359 WindowPtr
/* win */ );
362 AllowSome(ClientPtr
/* client */ ,
363 TimeStamp
/* time */ ,
364 DeviceIntPtr
/* thisDev */ ,
365 int /* newState */ );
368 ReleaseActiveGrabs(ClientPtr client
);
371 CheckPassiveGrabsOnWindow(WindowPtr
/* pWin */ ,
372 DeviceIntPtr
/* device */ ,
373 InternalEvent
* /* event */ ,
374 BOOL
/* checkCore */ ,
375 BOOL
/* activate */ );
378 DeliverEventsToWindow(DeviceIntPtr
/* pWin */ ,
379 WindowPtr
/* pWin */ ,
380 xEventPtr
/* pEvents */ ,
383 GrabPtr
/* grab */ );
385 extern _X_EXPORT
void
386 DeliverRawEvent(RawDeviceEvent
* /* ev */ ,
387 DeviceIntPtr
/* dev */
391 DeliverDeviceEvents(WindowPtr
/* pWin */ ,
392 InternalEvent
* /* event */ ,
394 WindowPtr
/* stopAt */ ,
395 DeviceIntPtr
/* dev */ );
398 DeliverOneGrabbedEvent(InternalEvent
* /* event */ ,
399 DeviceIntPtr
/* dev */ ,
400 enum InputLevel
/* level */ );
403 DeliverTouchEvents(DeviceIntPtr
/* dev */ ,
404 TouchPointInfoPtr
/* ti */ ,
405 InternalEvent
* /* ev */ ,
406 XID
/* resource */ );
409 InitializeSprite(DeviceIntPtr
/* pDev */ ,
410 WindowPtr
/* pWin */ );
412 FreeSprite(DeviceIntPtr pDev
);
415 UpdateSpriteForScreen(DeviceIntPtr
/* pDev */ ,
416 ScreenPtr
/* pScreen */ );
418 extern _X_EXPORT
void
419 WindowHasNewCursor(WindowPtr
/* pWin */ );
422 CheckDeviceGrabs(DeviceIntPtr
/* device */ ,
423 DeviceEvent
* /* event */ ,
424 WindowPtr
/* ancestor */ );
427 DeliverFocusedEvent(DeviceIntPtr
/* keybd */ ,
428 InternalEvent
* /* event */ ,
429 WindowPtr
/* window */ );
432 DeliverGrabbedEvent(InternalEvent
* /* event */ ,
433 DeviceIntPtr
/* thisDev */ ,
434 Bool
/* deactivateGrab */ );
437 FixKeyState(DeviceEvent
* /* event */ ,
438 DeviceIntPtr
/* keybd */ );
441 RecalculateDeliverableEvents(WindowPtr
/* pWin */ );
444 OtherClientGone(pointer
/* value */ ,
448 DoFocusEvents(DeviceIntPtr
/* dev */ ,
449 WindowPtr
/* fromWin */ ,
450 WindowPtr
/* toWin */ ,
454 SetInputFocus(ClientPtr
/* client */ ,
455 DeviceIntPtr
/* dev */ ,
456 Window
/* focusID */ ,
457 CARD8
/* revertTo */ ,
459 Bool
/* followOK */ );
462 GrabDevice(ClientPtr
/* client */ ,
463 DeviceIntPtr
/* dev */ ,
464 unsigned /* this_mode */ ,
465 unsigned /* other_mode */ ,
466 Window
/* grabWindow */ ,
467 unsigned /* ownerEvents */ ,
469 GrabMask
* /* mask */ ,
472 Window
/* confineToWin */ ,
473 CARD8
* /* status */ );
479 CloseDownEvents(void);
482 DeleteWindowFromAnyEvents(WindowPtr
/* pWin */ ,
483 Bool
/* freeResources */ );
486 EventMaskForClient(WindowPtr
/* pWin */ ,
487 ClientPtr
/* client */ );
490 DeliverEvents(WindowPtr
/*pWin */ ,
493 WindowPtr
/*otherParent */ );
496 CheckMotion(DeviceEvent
* /* ev */ ,
497 DeviceIntPtr
/* pDev */ );
499 extern _X_EXPORT
void
500 WriteEventsToClient(ClientPtr
/*pClient */ ,
502 xEventPtr
/*events */ );
505 TryClientEvents(ClientPtr
/*client */ ,
506 DeviceIntPtr
/* device */ ,
507 xEventPtr
/*pEvents */ ,
513 extern _X_EXPORT
void
514 WindowsRestructured(void);
517 SetClientPointer(ClientPtr
/* client */ ,
518 DeviceIntPtr
/* device */ );
520 extern _X_EXPORT DeviceIntPtr
521 PickPointer(ClientPtr
/* client */ );
523 extern _X_EXPORT DeviceIntPtr
524 PickKeyboard(ClientPtr
/* client */ );
527 IsInterferingGrab(ClientPtr
/* client */ ,
528 DeviceIntPtr
/* dev */ ,
529 xEvent
* /* events */ );
532 extern _X_EXPORT
void
533 ReinitializeRootWindow(WindowPtr win
, int xoff
, int yoff
);
537 extern _X_EXPORT
void
538 ScreenRestructured(ScreenPtr pScreen
);
547 * ServerGrabCallback stuff
550 extern _X_EXPORT CallbackListPtr ServerGrabCallback
;
552 typedef enum { SERVER_GRABBED
, SERVER_UNGRABBED
,
553 CLIENT_PERVIOUS
, CLIENT_IMPERVIOUS
558 ServerGrabState grabstate
;
562 * EventCallback stuff
565 extern _X_EXPORT CallbackListPtr EventCallback
;
574 * DeviceEventCallback stuff
577 extern _X_EXPORT CallbackListPtr DeviceEventCallback
;
580 InternalEvent
*event
;
582 } DeviceEventInfoRec
;
585 XItoCoreType(int xi_type
);
587 DevHasCursor(DeviceIntPtr pDev
);
588 extern _X_EXPORT Bool
589 IsPointerDevice(DeviceIntPtr dev
);
590 extern _X_EXPORT Bool
591 IsKeyboardDevice(DeviceIntPtr dev
);
593 IsPointerEvent(InternalEvent
*event
);
595 IsTouchEvent(InternalEvent
*event
);
596 extern _X_EXPORT Bool
597 IsMaster(DeviceIntPtr dev
);
598 extern _X_EXPORT Bool
599 IsFloating(DeviceIntPtr dev
);
601 extern _X_HIDDEN
void
602 CopyKeyClass(DeviceIntPtr device
, DeviceIntPtr master
);
604 CorePointerProc(DeviceIntPtr dev
, int what
);
606 CoreKeyboardProc(DeviceIntPtr dev
, int what
);