Merge branch 'input-fixes' of git://people.freedesktop.org/~cndougla/xserver into for-keith
This commit is contained in:
commit
51a8d8dd19
|
@ -1234,14 +1234,6 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource,
|
|||
}
|
||||
}
|
||||
|
||||
/* If there are no other listeners left, and the touchpoint is pending
|
||||
* finish, then we can just kill it now. */
|
||||
if (ti->num_listeners == 1 && ti->pending_finish) {
|
||||
TouchEndTouch(sourcedev, ti);
|
||||
CheckOldestTouch(sourcedev);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Remove the resource from the listener list, updating
|
||||
* ti->num_listeners, as well as ti->num_grabs if it was a grab. */
|
||||
if (TouchRemoveListener(ti, resource)) {
|
||||
|
@ -1254,6 +1246,8 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource,
|
|||
* the TouchOwnership or TouchBegin event to the new owner. */
|
||||
if (ev && ti->num_listeners > 0 && was_owner)
|
||||
TouchPuntToNextOwner(sourcedev, ti, ev);
|
||||
else if (ti->num_listeners == 0)
|
||||
TouchEndTouch(sourcedev, ti);
|
||||
|
||||
CheckOldestTouch(sourcedev);
|
||||
}
|
||||
|
@ -1273,9 +1267,18 @@ ProcessTouchOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
if (ev->reason == XIRejectTouch)
|
||||
TouchRejected(dev, ti, ev->resource, ev);
|
||||
else if (ev->reason == XIAcceptTouch) {
|
||||
int i;
|
||||
|
||||
/* Go through the motions of ending the touch if the listener has
|
||||
* already seen the end. This ensures that the touch record is ended in
|
||||
* the server. */
|
||||
if (ti->listeners[0].state == LISTENER_HAS_END)
|
||||
EmitTouchEnd(dev, ti, TOUCH_ACCEPT, ti->listeners[0].listener);
|
||||
|
||||
/* The touch owner has accepted the touch. Send TouchEnd events to
|
||||
* everyone else, and truncate the list of listeners. */
|
||||
EmitTouchEnd(dev, ti, TOUCH_ACCEPT, 0);
|
||||
for (i = 1; i < ti->num_listeners; i++)
|
||||
EmitTouchEnd(dev, ti, TOUCH_ACCEPT, ti->listeners[i].listener);
|
||||
|
||||
while (ti->num_listeners > 1)
|
||||
TouchRemoveListener(ti, ti->listeners[1].listener);
|
||||
|
@ -1327,6 +1330,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
{
|
||||
int rc;
|
||||
InputClients *iclients = NULL;
|
||||
*mask = NULL;
|
||||
|
||||
if (listener->type == LISTENER_GRAB ||
|
||||
listener->type == LISTENER_POINTER_GRAB) {
|
||||
|
@ -1377,6 +1381,9 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
BUG_WARN(!iclients);
|
||||
if (!iclients)
|
||||
return FALSE;
|
||||
|
||||
*mask = iclients->xi2mask;
|
||||
*client = rClient(iclients);
|
||||
}
|
||||
else if (listener->level == XI) {
|
||||
int xi_type = GetXIType(TouchGetPointerEventType(ev));
|
||||
|
@ -1389,21 +1396,24 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
BUG_WARN(!iclients);
|
||||
if (!iclients)
|
||||
return FALSE;
|
||||
|
||||
*client = rClient(iclients);
|
||||
}
|
||||
else {
|
||||
int coretype = GetCoreType(TouchGetPointerEventType(ev));
|
||||
Mask core_filter = event_get_filter_from_type(dev, coretype);
|
||||
OtherClients *oclients;
|
||||
|
||||
/* all others */
|
||||
nt_list_for_each_entry(iclients,
|
||||
(InputClients *) wOtherClients(*win), next)
|
||||
if (iclients->mask[XIAllDevices] & core_filter)
|
||||
break;
|
||||
/* if owner selected, iclients is NULL */
|
||||
nt_list_for_each_entry(oclients,
|
||||
(OtherClients *) wOtherClients(*win), next)
|
||||
if (oclients->mask & core_filter)
|
||||
break;
|
||||
|
||||
/* if owner selected, oclients is NULL */
|
||||
*client = oclients ? rClient(oclients) : wClient(*win);
|
||||
}
|
||||
|
||||
*client = iclients ? rClient(iclients) : wClient(*win);
|
||||
*mask = iclients ? iclients->xi2mask : NULL;
|
||||
*grab = NULL;
|
||||
}
|
||||
|
||||
|
@ -1459,7 +1469,14 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
if (!deliveries)
|
||||
DeliverOneGrabbedEvent(ptrev, dev, grab->grabtype);
|
||||
|
||||
/* We must accept the touch sequence once a pointer listener has
|
||||
* received one event past ButtonPress. */
|
||||
if (deliveries && ev->any.type != ET_TouchBegin &&
|
||||
!(ev->device_event.flags & TOUCH_CLIENT_ID))
|
||||
TouchListenerAcceptReject(dev, ti, 0, XIAcceptTouch);
|
||||
|
||||
if (ev->any.type == ET_TouchEnd &&
|
||||
!(ev->device_event.flags & TOUCH_CLIENT_ID) &&
|
||||
!dev->button->buttonsDown &&
|
||||
dev->deviceGrab.fromPassiveGrab && GrabIsPointerGrab(grab)) {
|
||||
(*dev->deviceGrab.DeactivateGrab) (dev);
|
||||
|
@ -1580,6 +1597,9 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
|
|||
else
|
||||
touchid = ev->device_event.touchid;
|
||||
|
||||
if (emulate_pointer)
|
||||
UpdateDeviceState(dev, &ev->device_event);
|
||||
|
||||
if (type == ET_TouchBegin) {
|
||||
ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
|
||||
emulate_pointer);
|
||||
|
@ -1587,6 +1607,34 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
|
|||
else
|
||||
ti = TouchFindByClientID(dev, touchid);
|
||||
|
||||
/* Under the following circumstances we create a new touch record for an
|
||||
* existing touch:
|
||||
*
|
||||
* - The touch may be pointer emulated
|
||||
* - An explicit grab is active on the device
|
||||
* - The grab is a pointer grab
|
||||
*
|
||||
* This allows for an explicit grab to receive pointer events for an already
|
||||
* active touch.
|
||||
*/
|
||||
if (!ti && type != ET_TouchBegin && emulate_pointer &&
|
||||
dev->deviceGrab.grab && !dev->deviceGrab.fromPassiveGrab &&
|
||||
(dev->deviceGrab.grab->grabtype == CORE ||
|
||||
dev->deviceGrab.grab->grabtype == XI ||
|
||||
!xi2mask_isset(dev->deviceGrab.grab->xi2mask, dev, XI_TouchBegin))) {
|
||||
ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
|
||||
emulate_pointer);
|
||||
if (!ti) {
|
||||
DebugF("[Xi] %s: Failed to create new dix record for explicitly "
|
||||
"grabbed touchpoint %d\n",
|
||||
dev->name, type, touchid);
|
||||
return;
|
||||
}
|
||||
|
||||
TouchBuildSprite(dev, ti, ev);
|
||||
TouchSetupListeners(dev, ti, ev);
|
||||
}
|
||||
|
||||
if (!ti) {
|
||||
DebugF("[Xi] %s: Failed to get event %d for touchpoint %d\n",
|
||||
dev->name, type, touchid);
|
||||
|
@ -1602,9 +1650,11 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
|
|||
CheckMotion(&ev->device_event, dev);
|
||||
|
||||
/* Make sure we have a valid window trace for event delivery; must be
|
||||
* called after event type mutation. */
|
||||
* called after event type mutation. Touch end events are always processed
|
||||
* in order to end touch records. */
|
||||
/* FIXME: check this */
|
||||
if (!TouchEnsureSprite(dev, ti, ev))
|
||||
if ((type == ET_TouchBegin && !TouchBuildSprite(dev, ti, ev)) ||
|
||||
(type != ET_TouchEnd && ti->sprite.spriteTraceGood == 0))
|
||||
return;
|
||||
|
||||
/* TouchOwnership events are handled separately from the rest, as they
|
||||
|
@ -1834,7 +1884,8 @@ DeliverTouchEndEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
|
|||
if (ti->num_listeners > 1) {
|
||||
ev->any.type = ET_TouchUpdate;
|
||||
ev->device_event.flags |= TOUCH_PENDING_END;
|
||||
ti->pending_finish = TRUE;
|
||||
if (!(ev->device_event.flags & TOUCH_CLIENT_ID))
|
||||
ti->pending_finish = TRUE;
|
||||
}
|
||||
|
||||
goto out;
|
||||
|
@ -1948,9 +1999,6 @@ DeliverTouchEvents(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
|
||||
DeliverTouchEvent(dev, ti, ev, listener, client, win, grab, mask);
|
||||
}
|
||||
|
||||
if (ti->emulate_pointer)
|
||||
UpdateDeviceState(dev, &ev->device_event);
|
||||
}
|
||||
|
||||
int
|
||||
|
|
|
@ -214,7 +214,7 @@ UpdateCurrentTimeIf(void)
|
|||
systime.milliseconds = GetTimeInMillis();
|
||||
if (systime.milliseconds < currentTime.milliseconds)
|
||||
systime.months++;
|
||||
if (*checkForInput[0] == *checkForInput[1])
|
||||
if (CompareTimeStamps(systime, currentTime) == LATER)
|
||||
currentTime = systime;
|
||||
}
|
||||
|
||||
|
@ -393,6 +393,9 @@ Dispatch(void)
|
|||
}
|
||||
/* now, finally, deal with client requests */
|
||||
|
||||
/* Update currentTime so request time checks, such as for input
|
||||
* device grabs, are calculated correctly */
|
||||
UpdateCurrentTimeIf();
|
||||
result = ReadRequestFromClient(client);
|
||||
if (result <= 0) {
|
||||
if (result < 0)
|
||||
|
|
55
dix/events.c
55
dix/events.c
|
@ -1273,18 +1273,11 @@ ComputeFreezes(void)
|
|||
event->root_x, event->root_y);
|
||||
if (!CheckDeviceGrabs(replayDev, event, syncEvents.replayWin)) {
|
||||
if (IsTouchEvent((InternalEvent *) event)) {
|
||||
InternalEvent *events = InitEventList(GetMaximumEventsNum());
|
||||
int i, nev;
|
||||
TouchPointInfoPtr ti =
|
||||
TouchFindByClientID(replayDev, event->touchid);
|
||||
BUG_WARN(!ti);
|
||||
nev =
|
||||
GetTouchOwnershipEvents(events, replayDev, ti,
|
||||
XIRejectTouch,
|
||||
ti->listeners[0].listener, 0);
|
||||
for (i = 0; i < nev; i++)
|
||||
mieqProcessDeviceEvent(replayDev, events + i, NULL);
|
||||
ProcessInputEvents();
|
||||
|
||||
TouchListenerAcceptReject(replayDev, ti, 0, XIRejectTouch);
|
||||
}
|
||||
else if (replayDev->focus &&
|
||||
!IsPointerEvent((InternalEvent *) event))
|
||||
|
@ -1415,6 +1408,38 @@ ReattachToOldMaster(DeviceIntPtr dev)
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update touch records when an explicit grab is activated. Any touches owned by
|
||||
* the grabbing client are updated so the listener state reflects the new grab.
|
||||
*/
|
||||
static void
|
||||
UpdateTouchesForGrab(DeviceIntPtr mouse)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!mouse->touch || mouse->deviceGrab.fromPassiveGrab)
|
||||
return;
|
||||
|
||||
for (i = 0; i < mouse->touch->num_touches; i++) {
|
||||
TouchPointInfoPtr ti = mouse->touch->touches + i;
|
||||
GrabPtr grab = mouse->deviceGrab.grab;
|
||||
|
||||
if (ti->active &&
|
||||
CLIENT_BITS(ti->listeners[0].listener) == grab->resource) {
|
||||
ti->listeners[0].listener = grab->resource;
|
||||
ti->listeners[0].level = grab->grabtype;
|
||||
ti->listeners[0].state = LISTENER_IS_OWNER;
|
||||
ti->listeners[0].window = grab->window;
|
||||
|
||||
if (grab->grabtype == CORE || grab->grabtype == XI ||
|
||||
!xi2mask_isset(grab->xi2mask, mouse, XI_TouchBegin))
|
||||
ti->listeners[0].type = LISTENER_POINTER_GRAB;
|
||||
else
|
||||
ti->listeners[0].type = LISTENER_GRAB;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Activate a pointer grab on the given device. A pointer grab will cause all
|
||||
* core pointer events of this device to be delivered to the grabbing client only.
|
||||
|
@ -1464,6 +1489,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
|
|||
grabinfo->fromPassiveGrab = isPassive;
|
||||
grabinfo->implicitGrab = autoGrab & ImplicitGrabMask;
|
||||
PostNewCursor(mouse);
|
||||
UpdateTouchesForGrab(mouse);
|
||||
CheckGrabForSyncs(mouse, (Bool) grab->pointerMode,
|
||||
(Bool) grab->keyboardMode);
|
||||
}
|
||||
|
@ -1480,6 +1506,8 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
|
|||
DeviceIntPtr dev;
|
||||
Bool wasImplicit = (mouse->deviceGrab.fromPassiveGrab &&
|
||||
mouse->deviceGrab.implicitGrab);
|
||||
XID grab_resource = grab->resource;
|
||||
int i;
|
||||
|
||||
TouchRemovePointerGrab(mouse);
|
||||
|
||||
|
@ -1504,6 +1532,15 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
|
|||
ReattachToOldMaster(mouse);
|
||||
|
||||
ComputeFreezes();
|
||||
|
||||
/* If an explicit grab was deactivated, we must remove it from the head of
|
||||
* all the touches' listener lists. */
|
||||
for (i = 0; mouse->touch && i < mouse->touch->num_touches; i++) {
|
||||
TouchPointInfoPtr ti = mouse->touch->touches + i;
|
||||
|
||||
if (ti->active && TouchResourceIsOwner(ti, grab_resource))
|
||||
TouchListenerAcceptReject(mouse, ti, 0, XIRejectTouch);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
117
dix/touch.c
117
dix/touch.c
|
@ -364,14 +364,6 @@ TouchEndTouch(DeviceIntPtr dev, TouchPointInfoPtr ti)
|
|||
{
|
||||
if (ti->emulate_pointer) {
|
||||
GrabPtr grab;
|
||||
DeviceEvent ev;
|
||||
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.type = ET_TouchEnd;
|
||||
ev.detail.button = 1;
|
||||
ev.touchid = ti->client_id;
|
||||
ev.flags = TOUCH_POINTER_EMULATED | TOUCH_END;
|
||||
UpdateDeviceState(dev, &ev);
|
||||
|
||||
if ((grab = dev->deviceGrab.grab)) {
|
||||
if (dev->deviceGrab.fromPassiveGrab &&
|
||||
|
@ -482,10 +474,22 @@ TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, XID resource)
|
|||
flags = TOUCH_CLIENT_ID | TOUCH_REPLAYING;
|
||||
if (ti->emulate_pointer)
|
||||
flags |= TOUCH_POINTER_EMULATED;
|
||||
/* send fake begin event to next owner */
|
||||
/* Generate events based on a fake touch begin event to get DCCE events if
|
||||
* needed */
|
||||
/* FIXME: This needs to be cleaned up */
|
||||
nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchBegin, flags, mask);
|
||||
for (i = 0; i < nev; i++)
|
||||
DeliverTouchEvents(dev, ti, tel + i, resource);
|
||||
for (i = 0; i < nev; i++) {
|
||||
/* Send saved touch begin event */
|
||||
if (tel[i].any.type == ET_TouchBegin) {
|
||||
DeviceEvent *ev = &ti->history[0];
|
||||
ev->flags |= TOUCH_REPLAYING;
|
||||
DeliverTouchEvents(dev, ti, (InternalEvent*)ev, resource);
|
||||
}
|
||||
else {/* Send DCCE event */
|
||||
tel[i].any.time = ti->history[0].time;
|
||||
DeliverTouchEvents(dev, ti, tel + i, resource);
|
||||
}
|
||||
}
|
||||
|
||||
valuator_mask_free(&mask);
|
||||
FreeEventList(tel, GetMaximumEventsNum());
|
||||
|
@ -542,22 +546,12 @@ TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite)
|
|||
* TouchBegin events.
|
||||
*/
|
||||
Bool
|
||||
TouchEnsureSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
|
||||
InternalEvent *ev)
|
||||
TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
|
||||
InternalEvent *ev)
|
||||
{
|
||||
TouchClassPtr t = sourcedev->touch;
|
||||
SpritePtr sprite = &ti->sprite;
|
||||
|
||||
/* We may not have a sprite if there are no applicable grabs or
|
||||
* event selections, or if they've disappeared, or if all the grab
|
||||
* owners have rejected the touch. Don't bother delivering motion
|
||||
* events if not, but TouchEnd events still need to be processed so
|
||||
* we can call FinishTouchPoint and release it for later use. */
|
||||
if (ev->any.type == ET_TouchEnd)
|
||||
return TRUE;
|
||||
else if (ev->any.type != ET_TouchBegin)
|
||||
return (sprite->spriteTraceGood > 0);
|
||||
|
||||
if (t->mode == XIDirectTouch) {
|
||||
/* Focus immediately under the touchpoint in direct touch mode.
|
||||
* XXX: Do we need to handle crossing screens here? */
|
||||
|
@ -821,6 +815,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
if (mask & EVENT_CORE_MASK) {
|
||||
int coretype = GetCoreType(TouchGetPointerEventType(ev));
|
||||
Mask core_filter = event_get_filter_from_type(dev, coretype);
|
||||
OtherClients *oclients;
|
||||
|
||||
/* window owner */
|
||||
if (IsMaster(dev) && (win->eventMask & core_filter)) {
|
||||
|
@ -832,13 +827,12 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
}
|
||||
|
||||
/* all others */
|
||||
nt_list_for_each_entry(iclients, (InputClients *) wOtherClients(win),
|
||||
next) {
|
||||
if (!(iclients->mask[XIAllDevices] & core_filter))
|
||||
nt_list_for_each_entry(oclients, wOtherClients(win), next) {
|
||||
if (!(oclients->mask & core_filter))
|
||||
continue;
|
||||
|
||||
TouchEventHistoryAllocate(ti);
|
||||
TouchAddListener(ti, iclients->resource, CORE,
|
||||
TouchAddListener(ti, oclients->resource, CORE,
|
||||
type, LISTENER_AWAITING_BEGIN, win);
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -874,6 +868,11 @@ TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev)
|
|||
if (dev->deviceGrab.grab)
|
||||
TouchAddActiveGrabListener(dev, ti, ev, dev->deviceGrab.grab);
|
||||
|
||||
/* We set up an active touch listener for existing touches, but not any
|
||||
* passive grab or regular listeners. */
|
||||
if (ev->any.type != ET_TouchBegin)
|
||||
return;
|
||||
|
||||
/* First, find all grabbing clients from the root window down
|
||||
* to the deepest child window. */
|
||||
for (i = 0; i < sprite->spriteTraceGood; i++) {
|
||||
|
@ -959,16 +958,49 @@ TouchListenerGone(XID resource)
|
|||
FreeEventList(events, GetMaximumEventsNum());
|
||||
}
|
||||
|
||||
int
|
||||
TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti, int listener,
|
||||
int mode)
|
||||
{
|
||||
InternalEvent *events;
|
||||
int nev;
|
||||
int i;
|
||||
|
||||
if (listener > 0) {
|
||||
if (mode == XIRejectTouch)
|
||||
TouchRejected(dev, ti, ti->listeners[listener].listener, NULL);
|
||||
else
|
||||
ti->listeners[listener].state = LISTENER_EARLY_ACCEPT;
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
events = InitEventList(GetMaximumEventsNum());
|
||||
if (!events) {
|
||||
BUG_WARN_MSG(TRUE, "Failed to allocate touch ownership events\n");
|
||||
return BadAlloc;
|
||||
}
|
||||
|
||||
nev = GetTouchOwnershipEvents(events, dev, ti, mode,
|
||||
ti->listeners[0].listener, 0);
|
||||
BUG_WARN_MSG(nev == 0, "Failed to get touch ownership events\n");
|
||||
|
||||
for (i = 0; i < nev; i++)
|
||||
mieqProcessDeviceEvent(dev, events + i, NULL);
|
||||
|
||||
ProcessInputEvents();
|
||||
|
||||
FreeEventList(events, GetMaximumEventsNum());
|
||||
|
||||
return nev ? Success : BadMatch;
|
||||
}
|
||||
|
||||
int
|
||||
TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
|
||||
uint32_t touchid, Window grab_window, XID *error)
|
||||
{
|
||||
TouchPointInfoPtr ti;
|
||||
int nev, i;
|
||||
InternalEvent *events = InitEventList(GetMaximumEventsNum());
|
||||
|
||||
if (!events)
|
||||
return BadAlloc;
|
||||
int i;
|
||||
|
||||
if (!dev->touch) {
|
||||
*error = dev->id;
|
||||
|
@ -989,24 +1021,5 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
|
|||
if (i == ti->num_listeners)
|
||||
return BadAccess;
|
||||
|
||||
if (i > 0) {
|
||||
if (mode == XIRejectTouch)
|
||||
TouchRejected(dev, ti, ti->listeners[i].listener, NULL);
|
||||
else
|
||||
ti->listeners[i].state = LISTENER_EARLY_ACCEPT;
|
||||
|
||||
return Success;
|
||||
}
|
||||
|
||||
nev = GetTouchOwnershipEvents(events, dev, ti, mode,
|
||||
ti->listeners[0].listener, 0);
|
||||
if (nev == 0)
|
||||
return BadAlloc;
|
||||
for (i = 0; i < nev; i++)
|
||||
mieqProcessDeviceEvent(dev, events + i, NULL);
|
||||
|
||||
ProcessInputEvents();
|
||||
|
||||
FreeEventList(events, GetMaximumEventsNum());
|
||||
return Success;
|
||||
return TouchListenerAcceptReject(dev, ti, i, mode);
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -563,8 +563,8 @@ extern void TouchAddListener(TouchPointInfoPtr ti, XID resource,
|
|||
extern Bool TouchRemoveListener(TouchPointInfoPtr ti, XID resource);
|
||||
extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
||||
InternalEvent *ev);
|
||||
extern Bool TouchEnsureSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
|
||||
InternalEvent *ev);
|
||||
extern Bool TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti,
|
||||
InternalEvent *ev);
|
||||
extern Bool TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite);
|
||||
extern int TouchConvertToPointerEvent(const InternalEvent *ev,
|
||||
InternalEvent *motion,
|
||||
|
@ -572,6 +572,8 @@ extern int TouchConvertToPointerEvent(const InternalEvent *ev,
|
|||
extern int TouchGetPointerEventType(const InternalEvent *ev);
|
||||
extern void TouchRemovePointerGrab(DeviceIntPtr dev);
|
||||
extern void TouchListenerGone(XID resource);
|
||||
extern int TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
||||
int listener, int mode);
|
||||
extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
|
||||
uint32_t touchid, Window grab_window, XID *error);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user