From a42ee93c10bf9a63c22e0642d6e51877fba8dae5 Mon Sep 17 00:00:00 2001 From: Alexander Bersenev Date: Mon, 17 Jun 2019 22:56:43 +0500 Subject: Fix the FIXME in XIValuatorClass case of copy_classes function in XExtInt.c In addition fix FP3232_TO_DOUBLE macro to correctly compute the fractional part. This fixes glitchy scrolling in Qt applications when the application was just activated or was scrolled in the backgroud. Qt uses XIQueryDevice call to synchronize internal scroll location with an actual one. Bug: https://gitlab.freedesktop.org/xorg/lib/libxi/issues/10 --- src/XExtInt.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/XExtInt.c b/src/XExtInt.c index a35fcc6..ccd3238 100644 --- a/src/XExtInt.c +++ b/src/XExtInt.c @@ -1616,6 +1616,8 @@ size_classes(xXIAnyInfo* from, int nclasses) return len; } +#define FP3232_TO_DOUBLE(x) ((double) (x).integral + (double) (x).frac / (1ULL << 32)) + /* Copy classes from any into to->classes and return the number of bytes * copied. Memory layout of to->classes is * [clsptr][clsptr][clsptr][classinfo][classinfo]... @@ -1724,10 +1726,9 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses) cls_lib->number = cls_wire->number; cls_lib->label = cls_wire->label; cls_lib->resolution = cls_wire->resolution; - cls_lib->min = cls_wire->min.integral; - cls_lib->max = cls_wire->max.integral; - cls_lib->value = cls_wire->value.integral; - /* FIXME: fractional parts */ + cls_lib->min = FP3232_TO_DOUBLE(cls_wire->min); + cls_lib->max = FP3232_TO_DOUBLE(cls_wire->max); + cls_lib->value = FP3232_TO_DOUBLE(cls_wire->value); cls_lib->mode = cls_wire->mode; to->classes[cls_idx++] = any_lib; @@ -2000,8 +2001,6 @@ wireToTouchOwnershipEvent(xXITouchOwnershipEvent *in, return 1; } -#define FP3232_TO_DOUBLE(x) ((double) (x).integral + (x).frac / (1ULL << 32)) - static int wireToBarrierEvent(xXIBarrierEvent *in, XGenericEventCookie *cookie) { -- cgit v1.2.3