dix: deliver device enter/leave events.
This commit is contained in:
parent
04ed0bcb25
commit
87ff1159b4
|
@ -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
|
||||||
|
|
91
dix/events.c
91
dix/events.c
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue