Re: Mixed "pen" and multitouch input devices

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/16/2012 10:33 AM, Thorsten Wissmann wrote:
> On Thu, Mar 15, 2012 at 09:57:30PM -0500, Chris Bagwell wrote:
>> On Thu, Mar 15, 2012 at 9:03 PM, Chase Douglas <chasedouglas@xxxxxxxxx> wrote:
>>> On 03/15/2012 06:52 PM, Thorsten Wissmann wrote:
>>>> It turned out xf86-input-evdev really discards all non-multitouch events
>>>> (especially ABS_X and ABS_Y) events in EvdevProcessAbsoluteMotionEvent()
>>>> in evdev.c, if the device is configured as a multitouch device. So there
>>>> is a quick fix (or only workaround?), which processes ABS_X and ABS_Y
>>>> events even if it is a multitouch device:
>>>>
>>>> diff --git a/src/evdev.c b/src/evdev.c
>>>> index d540b87..b857b83 100644
>>>> --- a/src/evdev.c
>>>> +++ b/src/evdev.c
>>>> @@ -832,7 +832,7 @@ EvdevProcessAbsoluteMotionEvent(InputInfoPtr pInfo,
>>>> struct input_event *ev)
>>>>      if (ev->code >= ABS_MT_SLOT) {
>>>>          EvdevProcessTouchEvent(pInfo, ev);
>>>>          pEvdev->abs_queued = 1;
>>>> -    } else if (!pEvdev->mt_mask) {
>>>> +    } else if (!pEvdev->mt_mask || ev->code == ABS_X || ev->code ==
>>>> ABS_Y) {
>>>>          map = pEvdev->axis_map[ev->code];
>>>>          valuator_mask_set(pEvdev->vals, map, value);
>>>>          pEvdev->abs_queued = 1;
>>>>
>>>> This patch already is submitted to the xorg bugtracker and can be found
>>>> at [1].
>>>>
>>>> The only remaining question is: Does it break other drivers?
>>>>
>>>> [1] https://bugs.freedesktop.org/show_bug.cgi?id=47382
>>>
>>> Great!
>>>
>>> I haven't fully thought about it enough to give a reviewed-by, but it
>>> seems sane.
>>>
>>> I suggest sending the patch to xorg-devel@xxxxxxxxxxx. That's where most
>>> patch reviews are handled. You will likely get faster results there.
>>
>> Yep, agree thats also a great way to go.
> 
> Thanks!
> 
>> One thing I might suggest is to include with patch your thinking on
>> how a pen+multitouch device should send events to help in review of
>> the patch.  Just the basics.  For example, from above patch I have an
>> assumption that your sending ABS_X/Y only for PEN events and
>> ABS_MT_POSITION_X/Y only for touch events; but then again I'm not 100%
>> sure of that.
> 
> That's correct. In our case, it's ABS_X/Y for pen, ABS_MT_* for fingers
> (normal touches). But maybe other devices behave different. So we should
> send something like this as an addition to the patch on the x.org list?
> 
> # finger touch
>     ABS_MT_SLOT 0
>     ABS_MT_TRACKING_ID 42
>     ABS_MT_POSITION_X finger_x
>     ABS_MT_POSITION_Y finger_y
>     SYN_MT_REPORT
>     SYN_REPORT
> # finger release
>     ABS_MT_SLOT 0
>     ABS_MT_TRACKING_ID -1
>     SYN_REPORT
> # pen motion
>     ABS_X pen_x
>     ABS_Y pen_y
>     SYN_REPORT

The proper way to send events through evdev when there are two different
"tools" (pen and touch) is to use BTN_TOOL_*. In your example above, it
would be:

# finger touch (Note lack of tool, it's assumed to be finger)
    ABS_MT_SLOT 0
    ABS_MT_TRACKING_ID 42
    ABS_MT_POSITION_X finger_x
    ABS_MT_POSITION_Y finger_y
    SYN_MT_REPORT
    ABS_X finger_x
    ABS_Y finger_y
    SYN_REPORT
# finger release
    ABS_MT_SLOT 0
    ABS_MT_TRACKING_ID -1
    SYN_REPORT
# pen motion
    BTN_TOOL_PEN 1
    ABS_X pen_x
    ABS_Y pen_y
    SYN_REPORT
# finger touch begin
    ABS_MT_SLOT 0
    ABS_MT_TRACKING_ID 42
    ABS_MT_POSITION_X finger_x
    ABS_MT_POSITION_Y finger_y
    SYN_MT_REPORT
    BTN_TOOL_PEN 0
    ABS_X finger_x
    ABS_Y finger_y
    SYN_REPORT
etc.

Then, xf86-input-evdev ignores ABS_{X,Y} events when there is no
BTN_TOOL_* active.

-- Chase
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux