(eventPtr, winPtr)
| 486 | * Side effects: |
| 487 | * Grab state information may be updated. |
| 488 | * |
| 489 | *---------------------------------------------------------------------- |
| 490 | */ |
| 491 | |
| 492 | int |
| 493 | TkPointerEvent(eventPtr, winPtr) |
| 494 | register XEvent *eventPtr; /* Pointer to the event. */ |
| 495 | TkWindow *winPtr; /* Tk's information for window |
| 496 | * where event was reported. */ |
| 497 | { |
| 498 | register TkWindow *winPtr2; |
| 499 | TkDisplay *dispPtr = winPtr->dispPtr; |
| 500 | int outsideGrabTree = 0; |
| 501 | int originalFlags; |
| 502 | int appGrabbed = 0; /* Non-zero means event is being |
| 503 | * reported to an application that is |
| 504 | * affected by the grab. */ |
| 505 | static unsigned int state[] = { |
| 506 | Button1Mask, Button2Mask, Button3Mask, Button4Mask, Button5Mask |
| 507 | }; |
| 508 | |
| 509 | /* |
| 510 | * Don't do any filtering on events generated by the event-sharing code. |
| 511 | */ |
| 512 | |
| 513 | if (eventPtr == tkShareEventPtr) { |
| 514 | return 1; |
| 515 | } |
| 516 | |
| 517 | /* |
| 518 | * If a grab is in effect, see if the event is being reported to |
| 519 | * a window in the grab tree. Also see if the event is being reported |
| 520 | * to an application that is affected by the grab. |
| 521 | */ |
| 522 | |
| 523 | if (dispPtr->grabWinPtr != NULL) { |
| 524 | if ((winPtr->mainPtr == dispPtr->grabWinPtr->mainPtr) |
| 525 | || (dispPtr->grabFlags & GRAB_GLOBAL)) { |
| 526 | appGrabbed = 1; |
| 527 | } |
| 528 | for (winPtr2 = winPtr; winPtr2 != dispPtr->grabWinPtr; |
| 529 | winPtr2 = winPtr2->parentPtr) { |
| 530 | if (winPtr2 == NULL) { |
| 531 | outsideGrabTree = 1; |
| 532 | break; |
| 533 | } |
| 534 | } |
| 535 | } |
| 536 | |
| 537 | originalFlags = dispPtr->grabFlags; |
| 538 | dispPtr->grabFlags &= ~GRAB_BUTTON_RELEASE; |
| 539 | if ((eventPtr->type == EnterNotify) || (eventPtr->type == LeaveNotify)) { |
| 540 | if ((eventPtr->type == EnterNotify) |
| 541 | && (eventPtr->xcrossing.detail != NotifyVirtual) |
| 542 | && (eventPtr->xcrossing.detail != NotifyNonlinearVirtual)) { |
| 543 | if ((dispPtr->grabWinPtr == NULL) |
| 544 | || (dispPtr->grabWinPtr->mainPtr == winPtr->mainPtr)) { |
| 545 | dispPtr->ungrabWinPtr = winPtr; |
no test coverage detected