[PATCH 1/3][master][1.12] Don't attempt to add non-master core touch pointer emulation listeners
Chase Douglas
chase.douglas at canonical.com
Wed Apr 18 11:45:50 PDT 2012
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.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.
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.
-- Chase
More information about the xorg-devel
mailing list