On 04/18/2012 11:45 AM, Chase Douglas wrote: > On 04/17/2012 11:03 PM, Peter Hutterer wrote: >> On Mon, Apr 16, 2012 at 11:22:48AM -0700, Chase Douglas wrote: >>> On 04/12/2012 10:38 PM, Peter Hutterer wrote: >>>> On Wed, Apr 04, 2012 at 01:48:09PM -0700, Chase Douglas wrote: >>>>> Core events aren't generated for slave devices, so this is just wrong. >>>>> On top of that, the mask being checked in the removed hunk is wrong as >>>>> well. It is dereferencing a pointer of type OtherClients as though it >>>>> were a pointer to type InputClients. >>>>> >>>>> Signed-off-by: Chase Douglas <chase.doug...@canonical.com> >>>>> --- >>>>> dix/touch.c | 12 ------------ >>>>> 1 files changed, 0 insertions(+), 12 deletions(-) >>>>> >>>>> diff --git a/dix/touch.c b/dix/touch.c >>>>> index 0829b65..fcec916 100644 >>>>> --- a/dix/touch.c >>>>> +++ b/dix/touch.c >>>>> @@ -830,18 +830,6 @@ TouchAddRegularListener(DeviceIntPtr dev, >>>>> TouchPointInfoPtr ti, >>>>> win); >>>>> return TRUE; >>>>> } >>>>> - >>>>> - /* all others */ >>>>> - nt_list_for_each_entry(iclients, (InputClients *) >>>>> wOtherClients(win), >>>>> - next) { >>>>> - if (!(iclients->mask[XIAllDevices] & core_filter)) >>>>> - continue; >>>>> - >>>>> - TouchEventHistoryAllocate(ti); >>>>> - TouchAddListener(ti, iclients->resource, CORE, >>>>> - type, LISTENER_AWAITING_BEGIN, win); >>>>> - return TRUE; >>>>> - } >>>>> } >>>>> >>>>> return FALSE; >>>>> -- >>>>> 1.7.9.1 >>>> >>>> wouldn't you have to check for IsMaster() somewhere? >>>> iirc, this code is called for slave and master devices, but then again my >>>> brain is a bit mushy by now. >>> >>> See the block right above the one being removed here: >>> >>> if (mask & EVENT_CORE_MASK) { >>> int coretype = GetCoreType(TouchGetPointerEventType(ev)); >>> Mask core_filter = event_get_filter_from_type(dev, coretype); >>> >>> /* window owner */ >>> if (IsMaster(dev) && (win->eventMask & core_filter)) { >>> TouchEventHistoryAllocate(ti); >>> TouchAddListener(ti, win->drawable.id, CORE, >>> LISTENER_POINTER_REGULAR, LISTENER_AWAITING_BEGIN, >>> win); >>> return TRUE; >>> } >>> >>> It does check IsMaster(dev). >> >> right, but the mask is split up: the window owner's mask is in >> win->eventMask, others are in the iclients->mask[XIAllDevices]. So for the >> case where a different client sets a core mask on a window, you still need >> loop you removed to make sure we send to the right client. > > Ok, I didn't realize that the core event mask was split up. > > I think, reading RecalculateDeliverableEvents(), that we merely need to > change the block that I have left to: > > if (IsMaster(dev) && > ((win->eventMask | wOtherEventMasks(win)) & core_filter) { > > My understanding is that the block this commit removed should still be > gone. I'll send a second version of this patch out.
Then I realized that the block for the other clients is necessary for using the correct resource when adding the listener. I think all that is needed is to fix the second block so it properly checks an OtherClients mask instead of an InputClients mask. -- Chase _______________________________________________ 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