mirror of
https://github.com/X11Libre/xf86-input-evdev.git
synced 2026-04-14 11:44:16 +00:00
Change the logic concerning EVDEV_RELATIVE_MODE and in_proximity
When not in_proximity, we don't really trust data, even though a valuator sent just before a in_proximity event might actually be important. The present code for EVDEV_RELATIVE_MODE throws away all data if not in_proximity, which is a little bit too much. This patch allows for relative values to be calculated and old_vals to be updated even if not in_proximity, but will prevent evdev to sending (presumably) wrong information to the X server. But at least, old_vals will be correctly filled when the device comes into proximity again. Signed-off-by: Éric Brunet <Eric.Brunet@lps.ens.fr> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
committed by
Peter Hutterer
parent
593bbc6390
commit
f59585b367
45
src/evdev.c
45
src/evdev.c
@@ -440,25 +440,21 @@ EvdevProcessValuators(InputInfoPtr pInfo)
|
||||
if (pEvdev->abs_queued) {
|
||||
/* convert to relative motion for touchpads */
|
||||
if (pEvdev->flags & EVDEV_RELATIVE_MODE) {
|
||||
if (pEvdev->in_proximity) {
|
||||
if (valuator_mask_isset(pEvdev->abs_vals, 0))
|
||||
{
|
||||
if (valuator_mask_isset(pEvdev->old_vals, 0))
|
||||
deltaX = valuator_mask_get(pEvdev->abs_vals, 0) -
|
||||
valuator_mask_get(pEvdev->old_vals, 0);
|
||||
valuator_mask_set(pEvdev->old_vals, 0,
|
||||
valuator_mask_get(pEvdev->abs_vals, 0));
|
||||
}
|
||||
if (valuator_mask_isset(pEvdev->abs_vals, 1))
|
||||
{
|
||||
if (valuator_mask_isset(pEvdev->old_vals, 1))
|
||||
deltaY = valuator_mask_get(pEvdev->abs_vals, 1) -
|
||||
valuator_mask_get(pEvdev->old_vals, 1);
|
||||
valuator_mask_set(pEvdev->old_vals, 1,
|
||||
valuator_mask_get(pEvdev->abs_vals, 1));
|
||||
}
|
||||
} else {
|
||||
valuator_mask_zero(pEvdev->old_vals);
|
||||
if (valuator_mask_isset(pEvdev->abs_vals, 0))
|
||||
{
|
||||
if (valuator_mask_isset(pEvdev->old_vals, 0))
|
||||
deltaX = valuator_mask_get(pEvdev->abs_vals, 0) -
|
||||
valuator_mask_get(pEvdev->old_vals, 0);
|
||||
valuator_mask_set(pEvdev->old_vals, 0,
|
||||
valuator_mask_get(pEvdev->abs_vals, 0));
|
||||
}
|
||||
if (valuator_mask_isset(pEvdev->abs_vals, 1))
|
||||
{
|
||||
if (valuator_mask_isset(pEvdev->old_vals, 1))
|
||||
deltaY = valuator_mask_get(pEvdev->abs_vals, 1) -
|
||||
valuator_mask_get(pEvdev->old_vals, 1);
|
||||
valuator_mask_set(pEvdev->old_vals, 1,
|
||||
valuator_mask_get(pEvdev->abs_vals, 1));
|
||||
}
|
||||
valuator_mask_zero(pEvdev->abs_vals);
|
||||
pEvdev->abs_queued = 0;
|
||||
@@ -859,6 +855,15 @@ EvdevProcessKeyEvent(InputInfoPtr pInfo, struct input_event *ev)
|
||||
* BTN_TOUCH as the proximity notifier */
|
||||
if (!pEvdev->use_proximity)
|
||||
pEvdev->in_proximity = value ? ev->code : 0;
|
||||
/* When !pEvdev->use_proximity, we don't report
|
||||
* proximity events to the X server. However, we
|
||||
* still want to keep track if one is in proximity or
|
||||
* not. This is especially important for touchpad
|
||||
* who report proximity information to the computer
|
||||
* (but it is not sent to X) and who might send unreliable
|
||||
* position information when not in_proximity.
|
||||
*/
|
||||
|
||||
if (!(pEvdev->flags & (EVDEV_TOUCHSCREEN | EVDEV_TABLET)) ||
|
||||
pEvdev->mt_mask)
|
||||
break;
|
||||
@@ -881,7 +886,7 @@ EvdevPostRelativeMotionEvents(InputInfoPtr pInfo)
|
||||
{
|
||||
EvdevPtr pEvdev = pInfo->private;
|
||||
|
||||
if (pEvdev->rel_queued) {
|
||||
if (pEvdev->rel_queued && pEvdev->in_proximity) {
|
||||
xf86PostMotionEventM(pInfo->dev, Relative, pEvdev->rel_vals);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user