[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