[PATCH 1/3][master][1.12] Don't attempt to add non-master core touch pointer emulation listeners

Peter Hutterer peter.hutterer at who-t.net
Tue Apr 17 23:03:55 PDT 2012


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.douglas at 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.

That loop cannot be skipped for masters. Mind you, the whole (mask & EVENT_CORE_MASK)
can be skipped for slaves.

Cheers,
  Peter


More information about the xorg-devel mailing list