dix: deliver device enter/leave events.

This commit is contained in:
Peter Hutterer 2009-03-11 09:01:23 +10:00
parent 04ed0bcb25
commit 87ff1159b4
2 changed files with 52 additions and 43 deletions

View File

@ -624,6 +624,10 @@ SDeviceLeaveNotifyEvent (xXILeaveEvent *from, xXILeaveEvent *to)
swaps(&to->event_y.integral, n); swaps(&to->event_y.integral, n);
swaps(&to->event_y.frac, n); swaps(&to->event_y.frac, n);
swaps(&to->sourceid, n); swaps(&to->sourceid, n);
swaps(&to->buttons_len, n);
swapl(&to->mods.base_mods, n);
swapl(&to->mods.latched_mods, n);
swapl(&to->mods.locked_mods, n);
} }
static void static void

View File

@ -4015,57 +4015,62 @@ DeviceEnterLeaveEvent(
Window child) Window child)
{ {
GrabPtr grab = mouse->deviceGrab.grab; GrabPtr grab = mouse->deviceGrab.grab;
xXIEnterEvent event; xXIEnterEvent *event;
int mskidx;
OtherInputMasks *inputMasks;
Mask mask; Mask mask;
xEvent dummy; int filter;
int btlen, len, i;
DeviceIntPtr kbd;
if (grab) { btlen = (mouse->button) ? (mouse->button->numButtons + 7)/8 : 0;
mask = (pWin == grab->window) ? grab->eventMask : 0; btlen = (btlen + 3)/4;
if (grab->ownerEvents) len = sizeof(xXIEnterEvent) + btlen * 4;
mask |= EventMaskForClient(pWin, rClient(grab));
} else {
mask = pWin->eventMask | wOtherEventMasks(pWin);
}
memset(&event, 0, sizeof(event)); event = xcalloc(1, len);
event.type = GenericEvent; event->type = GenericEvent;
event.extension = IReqCode; event->extension = IReqCode;
event.evtype = type; event->evtype = type;
event.detail = detail; event->length = (len - sizeof(xEvent))/4;
event.time = currentTime.milliseconds; event->buttons_len = btlen;
event.deviceid = mouse->id; event->detail = detail;
event.sourceid = 0; /*XXX */ event->time = currentTime.milliseconds;
event.mode = mode; event->deviceid = mouse->id;
event.root_x.integral = mouse->spriteInfo->sprite->hot.x; event->sourceid = 0; /*XXX */
event.root_y.integral = mouse->spriteInfo->sprite->hot.y; event->mode = mode;
event->root_x.integral = mouse->spriteInfo->sprite->hot.x;
event->root_y.integral = mouse->spriteInfo->sprite->hot.y;
/* We use FUEFW to fill in dummy, then copy the values */ for (i = 0; mouse && mouse->button && i < mouse->button->numButtons; i++)
FixUpEventFromWindow(mouse, &dummy, pWin, None, FALSE); if (BitIsOn(mouse->button->down, i))
SetBit(&event[1], i);
event.same_screen = dummy.u.keyButtonPointer.sameScreen; kbd = (mouse->isMaster || mouse->u.master) ? GetPairedDevice(mouse) : NULL;
event.child = dummy.u.keyButtonPointer.child; if (kbd && kbd->key)
event.event_x.integral = dummy.u.keyButtonPointer.eventX;
event.event_y.integral = dummy.u.keyButtonPointer.eventY;
mskidx = mouse->id;
inputMasks = wOtherInputMasks(pWin);
if (inputMasks &&
(GetEventFilter(mouse, (xEvent*)&event) &
inputMasks->deliverableEvents[mskidx]))
{ {
if (grab) event->mods.base_mods = kbd->key->xkbInfo->state.base_mods;
TryClientEvents(rClient(grab), mouse, event->mods.latched_mods = kbd->key->xkbInfo->state.latched_mods;
(xEvent*)&event, 1, mask, event->mods.locked_mods = kbd->key->xkbInfo->state.locked_mods;
GetEventFilter(mouse, (xEvent*)&event),
grab); event->group.base_group = kbd->key->xkbInfo->state.base_group;
else event->group.latched_group = kbd->key->xkbInfo->state.latched_group;
DeliverEventsToWindow(mouse, pWin, (xEvent*)&event, 1, event->group.locked_group = kbd->key->xkbInfo->state.locked_group;
GetEventFilter(mouse, (xEvent*)&event),
NullGrab, mouse->id);
} }
FixUpEventFromWindow(mouse, (xEvent*)event, pWin, None, FALSE);
if (!GetWindowXI2Mask(mouse, pWin, (xEvent*)event))
return;
filter = GetEventFilter(mouse, (xEvent*)event);
mask = 0x0; /* FIXME: we should handle grabs, once we can */
if (grab)
TryClientEvents(rClient(grab), mouse, (xEvent*)event, 1, mask,
filter, grab);
else
DeliverEventsToWindow(mouse, pWin, (xEvent*)event, 1, filter,
NullGrab, mouse->id);
xfree(event);
} }
void void