On Tue, Apr 17, 2012 at 04:33:23PM -0700, Chase Douglas wrote: > Pointer passive grabs may be changed by the grabbing client. This allows > for a selecting client to change an implicit grab to an active grab, > which is the mechanism used for pop-up windows like application menus. > > We need to do the same thing with touches. If the grabbing client is the > owner of a touch sequence, change the listener record to reflect the new > grab. If the grabbing client is not the owner, nothing changes for the > touch. > > Signed-off-by: Chase Douglas <chase.doug...@canonical.com> > --- > dix/events.c | 33 +++++++++++++++++++++++++++++++++ > 1 files changed, 33 insertions(+), 0 deletions(-) > > diff --git a/dix/events.c b/dix/events.c > index 52ce0b8..9496b6f 100644 > --- a/dix/events.c > +++ b/dix/events.c > @@ -1409,6 +1409,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;
This routine also has an assumption that !mouse. Which I suppose is pretty obvious, but the function will definitely segfault if mouse==NULL here. > + 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; Checking len(ti->listeners) prior to this spot would avoid out of bounds, if that's a conceivable situation. > + 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. > * No other device will send core events to the grab client while the grab is > @@ -1457,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); > } > -- > 1.7.9.1 > > _______________________________________________ > xorg-devel@lists.x.org: X.Org development > Archives: http://lists.x.org/archives/xorg-devel > Info: http://lists.x.org/mailman/listinfo/xorg-devel _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel