dix.h revision 9ace9065
1/*********************************************************** 2 3Copyright 1987, 1998 The Open Group 4 5Permission to use, copy, modify, distribute, and sell this software and its 6documentation for any purpose is hereby granted without fee, provided that 7the above copyright notice appear in all copies and that both that 8copyright notice and this permission notice appear in supporting 9documentation. 10 11The above copyright notice and this permission notice shall be included in 12all copies or substantial portions of the Software. 13 14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 21Except as contained in this notice, the name of The Open Group shall not be 22used in advertising or otherwise to promote the sale, use or other dealings 23in this Software without prior written authorization from The Open Group. 24 25 26Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. 27 28 All Rights Reserved 29 30Permission to use, copy, modify, and distribute this software and its 31documentation for any purpose and without fee is hereby granted, 32provided that the above copyright notice appear in all copies and that 33both that copyright notice and this permission notice appear in 34supporting documentation, and that the name of Digital not be 35used in advertising or publicity pertaining to distribution of the 36software without specific, written prior permission. 37 38DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING 39ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL 40DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR 41ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, 42WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 43ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 44SOFTWARE. 45 46******************************************************************/ 47 48#ifndef DIX_H 49#define DIX_H 50 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> 59 60#define EARLIER -1 61#define SAMETIME 0 62#define LATER 1 63 64#define NullClient ((ClientPtr) 0) 65#define REQUEST(type) \ 66 type *stuff = (type *)client->requestBuffer 67 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_FIXED_SIZE(req, n)\ 78 if (((sizeof(req) >> 2) > client->req_len) || \ 79 (((sizeof(req) + (n) + 3) >> 2) != client->req_len)) \ 80 return(BadLength) 81 82#define LEGAL_NEW_RESOURCE(id,client)\ 83 if (!LegalNewID(id,client)) \ 84 {\ 85 client->errorValue = id;\ 86 return BadIDChoice;\ 87 } 88 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); 102 103 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)); } 109 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)); 114 115typedef struct _TimeStamp *TimeStampPtr; 116 117#ifndef _XTYPEDEF_CLIENTPTR 118typedef struct _Client *ClientPtr; /* also in misc.h */ 119#define _XTYPEDEF_CLIENTPTR 120#endif 121 122typedef struct _WorkQueue *WorkQueuePtr; 123 124extern _X_EXPORT ClientPtr clients[MAXCLIENTS]; 125extern _X_EXPORT ClientPtr serverClient; 126extern _X_EXPORT int currentMaxClients; 127extern _X_EXPORT char dispatchExceptionAtReset; 128 129typedef int HWEventQueueType; 130typedef HWEventQueueType* HWEventQueuePtr; 131 132extern _X_EXPORT HWEventQueuePtr checkForInput[2]; 133 134typedef struct _TimeStamp { 135 CARD32 months; /* really ~49.7 days */ 136 CARD32 milliseconds; 137} TimeStamp; 138 139/* dispatch.c */ 140 141extern _X_EXPORT void SetInputCheck( 142 HWEventQueuePtr /*c0*/, 143 HWEventQueuePtr /*c1*/); 144 145extern _X_EXPORT void CloseDownClient( 146 ClientPtr /*client*/); 147 148extern _X_EXPORT void UpdateCurrentTime(void); 149 150extern _X_EXPORT void UpdateCurrentTimeIf(void); 151 152extern _X_EXPORT int dixDestroyPixmap( 153 pointer /*value*/, 154 XID /*pid*/); 155 156extern _X_EXPORT void InitClient( 157 ClientPtr /*client*/, 158 int /*i*/, 159 pointer /*ospriv*/); 160 161extern _X_EXPORT ClientPtr NextAvailableClient( 162 pointer /*ospriv*/); 163 164extern _X_EXPORT void SendErrorToClient( 165 ClientPtr /*client*/, 166 unsigned int /*majorCode*/, 167 unsigned int /*minorCode*/, 168 XID /*resId*/, 169 int /*errorCode*/); 170 171extern _X_EXPORT void MarkClientException( 172 ClientPtr /*client*/); 173 174extern _X_HIDDEN Bool CreateConnectionBlock(void); 175/* dixutils.c */ 176 177extern _X_EXPORT int CompareISOLatin1Lowered( 178 unsigned char * /*a*/, 179 int alen, 180 unsigned char * /*b*/, 181 int blen); 182 183extern _X_EXPORT int dixLookupWindow( 184 WindowPtr *result, 185 XID id, 186 ClientPtr client, 187 Mask access_mode); 188 189extern _X_EXPORT int dixLookupDrawable( 190 DrawablePtr *result, 191 XID id, 192 ClientPtr client, 193 Mask type_mask, 194 Mask access_mode); 195 196extern _X_EXPORT int dixLookupGC( 197 GCPtr *result, 198 XID id, 199 ClientPtr client, 200 Mask access_mode); 201 202extern _X_EXPORT int dixLookupFontable( 203 FontPtr *result, 204 XID id, 205 ClientPtr client, 206 Mask access_mode); 207 208extern _X_EXPORT int dixLookupClient( 209 ClientPtr *result, 210 XID id, 211 ClientPtr client, 212 Mask access_mode); 213 214extern _X_EXPORT void NoopDDA(void); 215 216extern _X_EXPORT int AlterSaveSetForClient( 217 ClientPtr /*client*/, 218 WindowPtr /*pWin*/, 219 unsigned /*mode*/, 220 Bool /*toRoot*/, 221 Bool /*map*/); 222 223extern _X_EXPORT void DeleteWindowFromAnySaveSet( 224 WindowPtr /*pWin*/); 225 226extern _X_EXPORT void BlockHandler( 227 pointer /*pTimeout*/, 228 pointer /*pReadmask*/); 229 230extern _X_EXPORT void WakeupHandler( 231 int /*result*/, 232 pointer /*pReadmask*/); 233 234void 235EnableLimitedSchedulingLatency(void); 236 237void 238DisableLimitedSchedulingLatency(void); 239 240typedef void (* WakeupHandlerProcPtr)( 241 pointer /* blockData */, 242 int /* result */, 243 pointer /* pReadmask */); 244 245extern _X_EXPORT Bool RegisterBlockAndWakeupHandlers( 246 BlockHandlerProcPtr /*blockHandler*/, 247 WakeupHandlerProcPtr /*wakeupHandler*/, 248 pointer /*blockData*/); 249 250extern _X_EXPORT void RemoveBlockAndWakeupHandlers( 251 BlockHandlerProcPtr /*blockHandler*/, 252 WakeupHandlerProcPtr /*wakeupHandler*/, 253 pointer /*blockData*/); 254 255extern _X_EXPORT void InitBlockAndWakeupHandlers(void); 256 257extern _X_EXPORT void ProcessWorkQueue(void); 258 259extern _X_EXPORT void ProcessWorkQueueZombies(void); 260 261extern _X_EXPORT Bool QueueWorkProc( 262 Bool (* /*function*/)( 263 ClientPtr /*clientUnused*/, 264 pointer /*closure*/), 265 ClientPtr /*client*/, 266 pointer /*closure*/ 267); 268 269typedef Bool (* ClientSleepProcPtr)( 270 ClientPtr /*client*/, 271 pointer /*closure*/); 272 273extern _X_EXPORT Bool ClientSleep( 274 ClientPtr /*client*/, 275 ClientSleepProcPtr /* function */, 276 pointer /*closure*/); 277 278#ifndef ___CLIENTSIGNAL_DEFINED___ 279#define ___CLIENTSIGNAL_DEFINED___ 280extern _X_EXPORT Bool ClientSignal( 281 ClientPtr /*client*/); 282#endif /* ___CLIENTSIGNAL_DEFINED___ */ 283 284extern _X_EXPORT void ClientWakeup( 285 ClientPtr /*client*/); 286 287extern _X_EXPORT Bool ClientIsAsleep( 288 ClientPtr /*client*/); 289 290/* atom.c */ 291 292extern _X_EXPORT Atom MakeAtom( 293 const char * /*string*/, 294 unsigned /*len*/, 295 Bool /*makeit*/); 296 297extern _X_EXPORT Bool ValidAtom( 298 Atom /*atom*/); 299 300extern _X_EXPORT const char *NameForAtom( 301 Atom /*atom*/); 302 303extern _X_EXPORT void AtomError(void) _X_NORETURN; 304 305extern _X_EXPORT void FreeAllAtoms(void); 306 307extern _X_EXPORT void InitAtoms(void); 308 309/* main.c */ 310 311extern _X_EXPORT void SetVendorRelease(int release); 312 313extern _X_EXPORT void SetVendorString(char *string); 314 315/* events.c */ 316 317extern void SetMaskForEvent( 318 int /* deviceid */, 319 Mask /* mask */, 320 int /* event */); 321 322extern _X_EXPORT void ConfineToShape( 323 DeviceIntPtr /* pDev */, 324 RegionPtr /* shape */, 325 int* /* px */, 326 int* /* py */); 327 328extern _X_EXPORT Bool IsParent( 329 WindowPtr /* maybeparent */, 330 WindowPtr /* child */); 331 332extern _X_EXPORT WindowPtr GetCurrentRootWindow(DeviceIntPtr pDev); 333 334extern _X_EXPORT WindowPtr GetSpriteWindow(DeviceIntPtr pDev); 335 336 337extern _X_EXPORT void NoticeEventTime(InternalEvent *ev); 338 339extern void EnqueueEvent( 340 InternalEvent * /* ev */, 341 DeviceIntPtr /* device */); 342 343extern void ActivatePointerGrab( 344 DeviceIntPtr /* mouse */, 345 GrabPtr /* grab */, 346 TimeStamp /* time */, 347 Bool /* autoGrab */); 348 349extern void DeactivatePointerGrab( 350 DeviceIntPtr /* mouse */); 351 352extern void ActivateKeyboardGrab( 353 DeviceIntPtr /* keybd */, 354 GrabPtr /* grab */, 355 TimeStamp /* time */, 356 Bool /* passive */); 357 358extern void DeactivateKeyboardGrab( 359 DeviceIntPtr /* keybd */); 360 361extern BOOL ActivateFocusInGrab( 362 DeviceIntPtr /* dev */, 363 WindowPtr /* old */, 364 WindowPtr /* win */); 365 366extern void AllowSome( 367 ClientPtr /* client */, 368 TimeStamp /* time */, 369 DeviceIntPtr /* thisDev */, 370 int /* newState */); 371 372extern void ReleaseActiveGrabs( 373 ClientPtr client); 374 375extern GrabPtr CheckPassiveGrabsOnWindow( 376 WindowPtr /* pWin */, 377 DeviceIntPtr /* device */, 378 DeviceEvent * /* event */, 379 BOOL /* checkCore */, 380 BOOL /* activate */); 381 382extern _X_EXPORT int DeliverEventsToWindow( 383 DeviceIntPtr /* pWin */, 384 WindowPtr /* pWin */, 385 xEventPtr /* pEvents */, 386 int /* count */, 387 Mask /* filter */, 388 GrabPtr /* grab */); 389 390extern int DeliverDeviceEvents( 391 WindowPtr /* pWin */, 392 InternalEvent* /* event */, 393 GrabPtr /* grab */, 394 WindowPtr /* stopAt */, 395 DeviceIntPtr /* dev */); 396 397extern void InitializeSprite( 398 DeviceIntPtr /* pDev */, 399 WindowPtr /* pWin */); 400 401extern void UpdateSpriteForScreen( 402 DeviceIntPtr /* pDev */, 403 ScreenPtr /* pScreen */); 404 405extern _X_EXPORT void WindowHasNewCursor( 406 WindowPtr /* pWin */); 407 408extern Bool CheckDeviceGrabs( 409 DeviceIntPtr /* device */, 410 DeviceEvent* /* event */, 411 WindowPtr /* ancestor */); 412 413extern void DeliverFocusedEvent( 414 DeviceIntPtr /* keybd */, 415 InternalEvent* /* event */, 416 WindowPtr /* window */); 417 418extern void DeliverGrabbedEvent( 419 InternalEvent* /* event */, 420 DeviceIntPtr /* thisDev */, 421 Bool /* deactivateGrab */); 422 423extern void FixKeyState( 424 DeviceEvent* /* event */, 425 DeviceIntPtr /* keybd */); 426 427extern void RecalculateDeliverableEvents( 428 WindowPtr /* pWin */); 429 430extern _X_EXPORT int OtherClientGone( 431 pointer /* value */, 432 XID /* id */); 433 434extern void DoFocusEvents( 435 DeviceIntPtr /* dev */, 436 WindowPtr /* fromWin */, 437 WindowPtr /* toWin */, 438 int /* mode */); 439 440extern int SetInputFocus( 441 ClientPtr /* client */, 442 DeviceIntPtr /* dev */, 443 Window /* focusID */, 444 CARD8 /* revertTo */, 445 Time /* ctime */, 446 Bool /* followOK */); 447 448extern int GrabDevice( 449 ClientPtr /* client */, 450 DeviceIntPtr /* dev */, 451 unsigned /* this_mode */, 452 unsigned /* other_mode */, 453 Window /* grabWindow */, 454 unsigned /* ownerEvents */, 455 Time /* ctime */, 456 GrabMask* /* mask */, 457 int /* grabtype */, 458 Cursor /* curs */, 459 Window /* confineToWin */, 460 CARD8 * /* status */); 461 462extern void InitEvents(void); 463 464extern void CloseDownEvents(void); 465 466extern void DeleteWindowFromAnyEvents( 467 WindowPtr /* pWin */, 468 Bool /* freeResources */); 469 470 471extern Mask EventMaskForClient( 472 WindowPtr /* pWin */, 473 ClientPtr /* client */); 474 475 476 477extern _X_EXPORT int DeliverEvents( 478 WindowPtr /*pWin*/, 479 xEventPtr /*xE*/, 480 int /*count*/, 481 WindowPtr /*otherParent*/); 482 483extern Bool CheckMotion( 484 DeviceEvent* /* ev */, 485 DeviceIntPtr /* pDev */); 486 487extern _X_EXPORT void WriteEventsToClient( 488 ClientPtr /*pClient*/, 489 int /*count*/, 490 xEventPtr /*events*/); 491 492extern _X_EXPORT int TryClientEvents( 493 ClientPtr /*client*/, 494 DeviceIntPtr /* device */, 495 xEventPtr /*pEvents*/, 496 int /*count*/, 497 Mask /*mask*/, 498 Mask /*filter*/, 499 GrabPtr /*grab*/); 500 501extern _X_EXPORT void WindowsRestructured(void); 502 503extern int SetClientPointer( 504 ClientPtr /* client */, 505 DeviceIntPtr /* device */); 506 507extern _X_EXPORT DeviceIntPtr PickPointer( 508 ClientPtr /* client */); 509 510extern _X_EXPORT DeviceIntPtr PickKeyboard( 511 ClientPtr /* client */); 512 513extern Bool IsInterferingGrab( 514 ClientPtr /* client */, 515 DeviceIntPtr /* dev */, 516 xEvent* /* events */); 517 518#ifdef PANORAMIX 519extern _X_EXPORT void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff); 520#endif 521 522#ifdef RANDR 523extern _X_EXPORT void 524ScreenRestructured (ScreenPtr pScreen); 525#endif 526 527extern _X_EXPORT int ffs(int i); 528 529 530/* 531 * ServerGrabCallback stuff 532 */ 533 534extern _X_EXPORT CallbackListPtr ServerGrabCallback; 535 536typedef enum {SERVER_GRABBED, SERVER_UNGRABBED, 537 CLIENT_PERVIOUS, CLIENT_IMPERVIOUS } ServerGrabState; 538 539typedef struct { 540 ClientPtr client; 541 ServerGrabState grabstate; 542} ServerGrabInfoRec; 543 544/* 545 * EventCallback stuff 546 */ 547 548extern _X_EXPORT CallbackListPtr EventCallback; 549 550typedef struct { 551 ClientPtr client; 552 xEventPtr events; 553 int count; 554} EventInfoRec; 555 556/* 557 * DeviceEventCallback stuff 558 */ 559 560extern _X_EXPORT CallbackListPtr DeviceEventCallback; 561 562typedef struct { 563 InternalEvent *event; 564 DeviceIntPtr device; 565} DeviceEventInfoRec; 566 567extern int XItoCoreType(int xi_type); 568extern Bool DevHasCursor(DeviceIntPtr pDev); 569extern Bool _X_EXPORT IsPointerDevice( DeviceIntPtr dev); 570extern Bool _X_EXPORT IsKeyboardDevice(DeviceIntPtr dev); 571extern Bool IsPointerEvent(InternalEvent *event); 572extern _X_EXPORT Bool IsMaster(DeviceIntPtr dev); 573 574extern _X_HIDDEN void CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master); 575extern _X_HIDDEN int CorePointerProc(DeviceIntPtr dev, int what); 576extern _X_HIDDEN int CoreKeyboardProc(DeviceIntPtr dev, int what); 577 578 579/* 580 * These are deprecated compatibility functions and will be removed soon! 581 * Please use the noted replacements instead. 582 */ 583/* replaced by dixLookupWindow */ 584extern _X_EXPORT WindowPtr SecurityLookupWindow( 585 XID id, 586 ClientPtr client, 587 Mask access_mode); 588/* replaced by dixLookupWindow */ 589extern _X_EXPORT WindowPtr LookupWindow( 590 XID id, 591 ClientPtr client); 592 593/* replaced by dixLookupDrawable */ 594extern _X_EXPORT pointer SecurityLookupDrawable( 595 XID id, 596 ClientPtr client, 597 Mask access_mode); 598 599/* replaced by dixLookupDrawable */ 600extern _X_EXPORT pointer LookupDrawable( 601 XID id, 602 ClientPtr client); 603 604/* replaced by dixLookupClient */ 605extern _X_EXPORT ClientPtr LookupClient( 606 XID id, 607 ClientPtr client); 608 609#endif /* DIX_H */ 610