[PATCH] dix: fix scale_to_desktop for edge ABS events

Daniel Kurtz djkurtz at chromium.org
Tue Jul 24 19:44:02 PDT 2012


On Wed, Jul 25, 2012 at 2:04 AM, Jeremy Huddleston Sequoia
<jeremyhu at apple.com> wrote:
> Yick.  This is why origin/size are better descriptors =(
>
> Reviewed-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>
>
> On Jul 20, 2012, at 16:41, Yufeng Shen <miletus at chromium.org> wrote:
>
>> Scale_to_desktop() converts ABS events from device coordinates
>> to screen coordinates:
>> [dev_X_min, dev_X_max]  -> [screen_X_min, screen_X_max]
>> [dev_Y_min, dev_Y_max]  -> [screen_Y_min, screen_Y_max]
>>
>> An edge ABS event with X = dev_X_max (e.g., generated from the
>> edge of a touchscreen) will be converted to have screen X value
>> = screen_X_max, which, however, will be filterd out when xserver
>> tries to find proper Window to receive the event, because the
>> range check for a Window to receive events is
>>       window_X_min <= event_screen_X < window_X_max
>> Events with event_screen_X = screen_X_max will fail the test get
>> and rejected by the Window.
>>
>> To fix this, we change the device to screen coordinates mapping to
>> [dev_X_min, dev_X_max]  -> [screen_X_min, screen_X_max-1]
>> [dev_Y_min, dev_Y_max]  -> [screen_Y_min, screen_Y_max-1]
>>
>> Signed-off-by: Yufeng Shen <miletus at chromium.org>
>> ---
>> dix/getevents.c |    4 ++--
>> 1 files changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/dix/getevents.c b/dix/getevents.c
>> index b78d5ce..9898c6a 100644
>> --- a/dix/getevents.c
>> +++ b/dix/getevents.c
>> @@ -890,9 +890,9 @@ scale_to_desktop(DeviceIntPtr dev, ValuatorMask *mask,
>>
>>     /* scale x&y to desktop coordinates */
>>     *screenx = rescaleValuatorAxis(x, dev->valuator->axes + 0, NULL,
>> -                                   screenInfo.x, screenInfo.width);
>> +                                   screenInfo.x, screenInfo.width - 1);

Hi Yufeng,

rescaleValuatorAxis() expects min/max for its last two arguments.

Technically, this patch (and the original code) looks like it is
assuming that screenInfo.x == 0.  This is probably a good assumption
(since this is the global origin
for all screens together).  However, I think something like the
following is probably safer:

  *screenx = rescaleValuatorAxis(x, dev->valuator->axes + 0, NULL,
screenInfo.x, screenInfo.x + screenInfo.width - 1);
  *screeny = rescaleValuatorAxis(y, dev->valuator->axes + 0, NULL,
screenInfo.y, screenInfo.y + screenInfo.height - 1);

Also, can you double check to make sure that the arguments to
rescaleValuatorAxis() are set correctly elsewhere as well?  A quick
glance shows that (a) positionSprite() has the exact same issue, and
(b) other callers seem to be treating them as "origin / width", and
not "min / max".

Thanks,
-Daniel

>>     *screeny = rescaleValuatorAxis(y, dev->valuator->axes + 1, NULL,
>> -                                   screenInfo.y, screenInfo.height);
>> +                                   screenInfo.y, screenInfo.height - 1);
>>
>>     *devx = x;
>>     *devy = y;
>> --
>> 1.7.7.3
>>
>> _______________________________________________
>> xorg-devel at lists.x.org: X.Org development
>> Archives: http://lists.x.org/archives/xorg-devel
>> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>>
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list