[RFC libinput] Use floating point numbers instead of fixed point numbers

Peter Hutterer peter.hutterer at who-t.net
Mon Jun 2 17:51:53 PDT 2014


On Mon, Jun 02, 2014 at 11:42:10PM +0200, Jonas Ådahl wrote:
> Fixed point numbers can easily overflow, and double to fixed point
> conversion is lossy. Use floating point (double) where fixed point
> numbers where previously used and remove the li_fixed_t type.
> 
> Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
> ---
> 
> It has been brought up a couple of times that it might not be the best
> idea to use fixed point numbers in the libinput API due to various
> reasons. This patch changes the API to always use double where it fixed
> point were previously used.
> 
> Will reply to this E-mail with patches to weston, clutter and
> xf86-input-libinput for consideration.
> 
> Jonas
> 
>  src/evdev-mt-touchpad.c | 12 +++------
>  src/evdev.c             | 51 +++++++++++++++++--------------------
>  src/evdev.h             | 10 ++++----
>  src/libinput-private.h  | 18 ++++++-------
>  src/libinput-util.h     | 23 -----------------
>  src/libinput.c          | 50 ++++++++++++++++++------------------
>  src/libinput.h          | 68 ++++++++-----------------------------------------
>  test/pointer.c          |  7 +++--
>  test/touch.c            |  6 ++---
>  tools/event-debug.c     | 28 ++++++++------------
>  10 files changed, 94 insertions(+), 179 deletions(-)
> 
> diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
> index 26d5f7d..4973a5f 100644
> --- a/src/evdev-mt-touchpad.c
> +++ b/src/evdev-mt-touchpad.c
> @@ -488,7 +488,7 @@ tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t time)
>  		pointer_notify_axis(&tp->device->base,
>  				    time,
>  				    LIBINPUT_POINTER_AXIS_VERTICAL_SCROLL,
> -				    li_fixed_from_double(dy));
> +				    dy);
>  	}
>  
>  	if (dx != 0.0 &&
> @@ -496,7 +496,7 @@ tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t time)
>  		pointer_notify_axis(&tp->device->base,
>  				    time,
>  				    LIBINPUT_POINTER_AXIS_HORIZONTAL_SCROLL,
> -				    li_fixed_from_double(dx));
> +				    dx);
>  	}
>  }
>  
> @@ -576,12 +576,8 @@ tp_post_events(struct tp_dispatch *tp, uint64_t time)
>  		tp_get_delta(t, &dx, &dy);
>  		tp_filter_motion(tp, &dx, &dy, time);
>  
> -		if (dx != 0 || dy != 0)
> -			pointer_notify_motion(
> -				&tp->device->base,
> -				time,
> -				li_fixed_from_double(dx),
> -				li_fixed_from_double(dy));
> +		if (dx != 0.0 || dy != 0.0)
> +			pointer_notify_motion(&tp->device->base, time, dx, dy);
>  	}
>  }
>  
> diff --git a/src/evdev.c b/src/evdev.c
> index d32ece3..d23c09f 100644
> --- a/src/evdev.c
> +++ b/src/evdev.c
> @@ -39,7 +39,7 @@
>  #include "filter.h"
>  #include "libinput-private.h"
>  
> -#define DEFAULT_AXIS_STEP_DISTANCE li_fixed_from_int(10)
> +#define DEFAULT_AXIS_STEP_DISTANCE 10
>  
>  #ifndef KEY_MICMUTE
>  #define KEY_MICMUTE 0xf8
> @@ -97,22 +97,22 @@ transform_absolute(struct evdev_device *device, int32_t *x, int32_t *y)
>  	}
>  }
>  
> -li_fixed_t
> +double
>  evdev_device_transform_x(struct evdev_device *device,
> -			 li_fixed_t x,
> +			 double x,
>  			 uint32_t width)
>  {
> -	return ((uint64_t)x - li_fixed_from_int(device->abs.min_x)) * width /
> -		(device->abs.max_x - device->abs.min_x + 1);
> +	return (x - (double) device->abs.min_x) * (double) width /
> +		(double) (device->abs.max_x - device->abs.min_x + 1);

one cast to double is enough, you don't need to cast all of them. In this
case, because x is already double we shouldn't need any cast.

>  }
>  
> -li_fixed_t
> +double
>  evdev_device_transform_y(struct evdev_device *device,
> -			 li_fixed_t y,
> +			 double y,
>  			 uint32_t height)
>  {
> -	return ((uint64_t)y - li_fixed_from_int(device->abs.min_y)) * height /
> -		(device->abs.max_y - device->abs.min_y + 1);
> +	return (y - (double) device->abs.min_y) * (double) height /
> +		(double) (device->abs.max_y - device->abs.min_y + 1);
>  }

same here

>  static void
> @@ -120,8 +120,7 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
>  {
>  	struct motion_params motion;
>  	int32_t cx, cy;
> -	li_fixed_t x, y;
> -	li_fixed_t dx, dy;
> +	double x, y;
>  	int slot;
>  	int seat_slot;
>  	struct libinput_device *base = &device->base;
> @@ -133,20 +132,18 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
>  	case EVDEV_NONE:
>  		return;
>  	case EVDEV_RELATIVE_MOTION:
> -		motion.dx = li_fixed_to_double(device->rel.dx);
> -		motion.dy = li_fixed_to_double(device->rel.dy);
> +		motion.dx = (double) device->rel.dx;
> +		motion.dy = (double) device->rel.dy;

the cast here is superfluous.

Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
otherwise

Cheers,
   Peter

>  		device->rel.dx = 0;
>  		device->rel.dy = 0;
>  
>  		/* Apply pointer acceleration. */
>  		filter_dispatch(device->pointer.filter, &motion, device, time);
>  
> -		dx = li_fixed_from_double(motion.dx);
> -		dy = li_fixed_from_double(motion.dy);
> -		if (dx == 0 && dy == 0)
> +		if (motion.dx == 0.0 && motion.dy == 0.0)
>  			break;
>  
> -		pointer_notify_motion(base, time, dx, dy);
> +		pointer_notify_motion(base, time, motion.dx, motion.dy);
>  		break;
>  	case EVDEV_ABSOLUTE_MT_DOWN:
>  		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
> @@ -165,8 +162,8 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
>  			break;
>  
>  		seat->slot_map |= 1 << seat_slot;
> -		x = li_fixed_from_int(device->mt.slots[slot].x);
> -		y = li_fixed_from_int(device->mt.slots[slot].y);
> +		x = device->mt.slots[slot].x;
> +		y = device->mt.slots[slot].y;
>  
>  		touch_notify_touch_down(base, time, slot, seat_slot, x, y);
>  		break;
> @@ -175,8 +172,8 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
>  			break;
>  
>  		seat_slot = device->mt.slots[slot].seat_slot;
> -		x = li_fixed_from_int(device->mt.slots[slot].x);
> -		y = li_fixed_from_int(device->mt.slots[slot].y);
> +		x = device->mt.slots[slot].x;
> +		y = device->mt.slots[slot].y;
>  
>  		if (seat_slot == -1)
>  			break;
> @@ -216,15 +213,13 @@ evdev_flush_pending_event(struct evdev_device *device, uint64_t time)
>  		seat->slot_map |= 1 << seat_slot;
>  
>  		transform_absolute(device, &cx, &cy);
> -		x = li_fixed_from_int(cx);
> -		y = li_fixed_from_int(cy);
>  
> -		touch_notify_touch_down(base, time, -1, seat_slot, x, y);
> +		touch_notify_touch_down(base, time, -1, seat_slot, cx, cy);
>  		break;
>  	case EVDEV_ABSOLUTE_MOTION:
>  		transform_absolute(device, &cx, &cy);
> -		x = li_fixed_from_int(cx);
> -		y = li_fixed_from_int(cy);
> +		x = cx;
> +		y = cy;
>  
>  		if (device->seat_caps & EVDEV_DEVICE_TOUCH) {
>  			seat_slot = device->abs.seat_slot;
> @@ -382,13 +377,13 @@ evdev_process_relative(struct evdev_device *device,
>  	case REL_X:
>  		if (device->pending_event != EVDEV_RELATIVE_MOTION)
>  			evdev_flush_pending_event(device, time);
> -		device->rel.dx += li_fixed_from_int(e->value);
> +		device->rel.dx += e->value;
>  		device->pending_event = EVDEV_RELATIVE_MOTION;
>  		break;
>  	case REL_Y:
>  		if (device->pending_event != EVDEV_RELATIVE_MOTION)
>  			evdev_flush_pending_event(device, time);
> -		device->rel.dy += li_fixed_from_int(e->value);
> +		device->rel.dy += e->value;
>  		device->pending_event = EVDEV_RELATIVE_MOTION;
>  		break;
>  	case REL_WHEEL:
> diff --git a/src/evdev.h b/src/evdev.h
> index c9717b5..8a41b81 100644
> --- a/src/evdev.h
> +++ b/src/evdev.h
> @@ -83,7 +83,7 @@ struct evdev_device {
>  	struct mtdev *mtdev;
>  
>  	struct {
> -		li_fixed_t dx, dy;
> +		int dx, dy;
>  	} rel;
>  
>  	enum evdev_event_type pending_event;
> @@ -148,14 +148,14 @@ int
>  evdev_device_has_capability(struct evdev_device *device,
>  			    enum libinput_device_capability capability);
>  
> -li_fixed_t
> +double
>  evdev_device_transform_x(struct evdev_device *device,
> -			 li_fixed_t x,
> +			 double x,
>  			 uint32_t width);
>  
> -li_fixed_t
> +double
>  evdev_device_transform_y(struct evdev_device *device,
> -			 li_fixed_t y,
> +			 double y,
>  			 uint32_t height);
>  
>  void
> diff --git a/src/libinput-private.h b/src/libinput-private.h
> index 61cdc79..2e4cff8 100644
> --- a/src/libinput-private.h
> +++ b/src/libinput-private.h
> @@ -140,14 +140,14 @@ keyboard_notify_key(struct libinput_device *device,
>  void
>  pointer_notify_motion(struct libinput_device *device,
>  		      uint32_t time,
> -		      li_fixed_t dx,
> -		      li_fixed_t dy);
> +		      double dx,
> +		      double dy);
>  
>  void
>  pointer_notify_motion_absolute(struct libinput_device *device,
>  			       uint32_t time,
> -			       li_fixed_t x,
> -			       li_fixed_t y);
> +			       double x,
> +			       double y);
>  
>  void
>  pointer_notify_button(struct libinput_device *device,
> @@ -159,23 +159,23 @@ void
>  pointer_notify_axis(struct libinput_device *device,
>  		    uint32_t time,
>  		    enum libinput_pointer_axis axis,
> -		    li_fixed_t value);
> +		    double value);
>  
>  void
>  touch_notify_touch_down(struct libinput_device *device,
>  			uint32_t time,
>  			int32_t slot,
>  			int32_t seat_slot,
> -			li_fixed_t x,
> -			li_fixed_t y);
> +			double x,
> +			double y);
>  
>  void
>  touch_notify_touch_motion(struct libinput_device *device,
>  			  uint32_t time,
>  			  int32_t slot,
>  			  int32_t seat_slot,
> -			  li_fixed_t x,
> -			  li_fixed_t y);
> +			  double x,
> +			  double y);
>  
>  void
>  touch_notify_touch_up(struct libinput_device *device,
> diff --git a/src/libinput-util.h b/src/libinput-util.h
> index c920568..11c4f5c 100644
> --- a/src/libinput-util.h
> +++ b/src/libinput-util.h
> @@ -76,29 +76,6 @@ int list_empty(const struct list *list);
>  #define min(a, b) (((a) < (b)) ? (a) : (b))
>  #define max(a, b) (((a) > (b)) ? (a) : (b))
>  
> -/*
> - * This fixed point implementation is a verbatim copy from wayland-util.h from
> - * the Wayland project, with the wl_ prefix renamed li_.
> - */
> -
> -static inline li_fixed_t li_fixed_from_int(int i)
> -{
> -	return i * 256;
> -}
> -
> -static inline li_fixed_t
> -li_fixed_from_double(double d)
> -{
> -	union {
> -		double d;
> -		int64_t i;
> -	} u;
> -
> -	u.d = d + (3LL << (51 - 8));
> -
> -	return u.i;
> -}
> -
>  #define LIBINPUT_EXPORT __attribute__ ((visibility("default")))
>  
>  static inline void *
> diff --git a/src/libinput.c b/src/libinput.c
> index 6b7e8b8..048200c 100644
> --- a/src/libinput.c
> +++ b/src/libinput.c
> @@ -61,13 +61,13 @@ struct libinput_event_keyboard {
>  struct libinput_event_pointer {
>  	struct libinput_event base;
>  	uint32_t time;
> -	li_fixed_t x;
> -	li_fixed_t y;
> +	double x;
> +	double y;
>  	uint32_t button;
>  	uint32_t seat_button_count;
>  	enum libinput_pointer_button_state state;
>  	enum libinput_pointer_axis axis;
> -	li_fixed_t value;
> +	double value;
>  };
>  
>  struct libinput_event_touch {
> @@ -75,8 +75,8 @@ struct libinput_event_touch {
>  	uint32_t time;
>  	int32_t slot;
>  	int32_t seat_slot;
> -	li_fixed_t x;
> -	li_fixed_t y;
> +	double x;
> +	double y;
>  };
>  
>  static void
> @@ -296,31 +296,31 @@ libinput_event_pointer_get_time(struct libinput_event_pointer *event)
>  	return event->time;
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_pointer_get_dx(struct libinput_event_pointer *event)
>  {
>  	return event->x;
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_pointer_get_dy(struct libinput_event_pointer *event)
>  {
>  	return event->y;
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_pointer_get_absolute_x(struct libinput_event_pointer *event)
>  {
>  	return event->x;
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_pointer_get_absolute_y(struct libinput_event_pointer *event)
>  {
>  	return event->y;
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_pointer_get_absolute_x_transformed(
>  	struct libinput_event_pointer *event,
>  	uint32_t width)
> @@ -331,7 +331,7 @@ libinput_event_pointer_get_absolute_x_transformed(
>  	return evdev_device_transform_x(device, event->x, width);
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_pointer_get_absolute_y_transformed(
>  	struct libinput_event_pointer *event,
>  	uint32_t height)
> @@ -367,7 +367,7 @@ libinput_event_pointer_get_axis(struct libinput_event_pointer *event)
>  	return event->axis;
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_pointer_get_axis_value(struct libinput_event_pointer *event)
>  {
>  	return event->value;
> @@ -391,13 +391,13 @@ libinput_event_touch_get_seat_slot(struct libinput_event_touch *event)
>  	return event->seat_slot;
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_touch_get_x(struct libinput_event_touch *event)
>  {
>  	return event->x;
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_touch_get_x_transformed(struct libinput_event_touch *event,
>  				       uint32_t width)
>  {
> @@ -407,7 +407,7 @@ libinput_event_touch_get_x_transformed(struct libinput_event_touch *event,
>  	return evdev_device_transform_x(device, event->x, width);
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_touch_get_y_transformed(struct libinput_event_touch *event,
>  				       uint32_t height)
>  {
> @@ -417,7 +417,7 @@ libinput_event_touch_get_y_transformed(struct libinput_event_touch *event,
>  	return evdev_device_transform_y(device, event->y, height);
>  }
>  
> -LIBINPUT_EXPORT li_fixed_t
> +LIBINPUT_EXPORT double
>  libinput_event_touch_get_y(struct libinput_event_touch *event)
>  {
>  	return event->y;
> @@ -816,8 +816,8 @@ keyboard_notify_key(struct libinput_device *device,
>  void
>  pointer_notify_motion(struct libinput_device *device,
>  		      uint32_t time,
> -		      li_fixed_t dx,
> -		      li_fixed_t dy)
> +		      double dx,
> +		      double dy)
>  {
>  	struct libinput_event_pointer *motion_event;
>  
> @@ -839,8 +839,8 @@ pointer_notify_motion(struct libinput_device *device,
>  void
>  pointer_notify_motion_absolute(struct libinput_device *device,
>  			       uint32_t time,
> -			       li_fixed_t x,
> -			       li_fixed_t y)
> +			       double x,
> +			       double y)
>  {
>  	struct libinput_event_pointer *motion_absolute_event;
>  
> @@ -892,7 +892,7 @@ void
>  pointer_notify_axis(struct libinput_device *device,
>  		    uint32_t time,
>  		    enum libinput_pointer_axis axis,
> -		    li_fixed_t value)
> +		    double value)
>  {
>  	struct libinput_event_pointer *axis_event;
>  
> @@ -916,8 +916,8 @@ touch_notify_touch_down(struct libinput_device *device,
>  			uint32_t time,
>  			int32_t slot,
>  			int32_t seat_slot,
> -			li_fixed_t x,
> -			li_fixed_t y)
> +			double x,
> +			double y)
>  {
>  	struct libinput_event_touch *touch_event;
>  
> @@ -943,8 +943,8 @@ touch_notify_touch_motion(struct libinput_device *device,
>  			  uint32_t time,
>  			  int32_t slot,
>  			  int32_t seat_slot,
> -			  li_fixed_t x,
> -			  li_fixed_t y)
> +			  double x,
> +			  double y)
>  {
>  	struct libinput_event_touch *touch_event;
>  
> diff --git a/src/libinput.h b/src/libinput.h
> index d771e21..d88140f 100644
> --- a/src/libinput.h
> +++ b/src/libinput.h
> @@ -79,13 +79,6 @@ extern "C" {
>   */
>  
>  /**
> - * @ingroup fixed_point
> - *
> - * libinput 24.8 fixed point real number.
> - */
> -typedef int32_t li_fixed_t;
> -
> -/**
>   * Log priority for internal logging messages.
>   */
>  enum libinput_log_priority {
> @@ -220,45 +213,6 @@ struct libinput_event_pointer;
>  struct libinput_event_touch;
>  
>  /**
> - * @defgroup fixed_point Fixed point utilities
> - */
> -
> -/**
> - * @ingroup fixed_point
> - *
> - * Convert li_fixed_t to a double
> - *
> - * @param f fixed point number
> - * @return Converted double
> - */
> -static inline double
> -li_fixed_to_double (li_fixed_t f)
> -{
> -	union {
> -		double d;
> -		int64_t i;
> -	} u;
> -
> -	u.i = ((1023LL + 44LL) << 52) + (1LL << 51) + f;
> -
> -	return u.d - (3LL << 43);
> -}
> -
> -/**
> - * @ingroup fixed_point
> - *
> - * Convert li_fixed_t to a int. The fraction part is discarded.
> - *
> - * @param f fixed point number
> - * @return Converted int
> - */
> -static inline int
> -li_fixed_to_int(li_fixed_t f)
> -{
> -	return f / 256;
> -}
> -
> -/**
>   * @defgroup event Acessing and destruction of events
>   */
>  
> @@ -453,7 +407,7 @@ libinput_event_pointer_get_time(struct libinput_event_pointer *event);
>   *
>   * @return the relative x movement since the last event
>   */
> -li_fixed_t
> +double
>  libinput_event_pointer_get_dx(struct libinput_event_pointer *event);
>  
>  /**
> @@ -468,7 +422,7 @@ libinput_event_pointer_get_dx(struct libinput_event_pointer *event);
>   *
>   * @return the relative y movement since the last event
>   */
> -li_fixed_t
> +double
>  libinput_event_pointer_get_dy(struct libinput_event_pointer *event);
>  
>  /**
> @@ -488,7 +442,7 @@ libinput_event_pointer_get_dy(struct libinput_event_pointer *event);
>   *
>   * @return the current absolute x coordinate
>   */
> -li_fixed_t
> +double
>  libinput_event_pointer_get_absolute_x(struct libinput_event_pointer *event);
>  
>  /**
> @@ -508,7 +462,7 @@ libinput_event_pointer_get_absolute_x(struct libinput_event_pointer *event);
>   *
>   * @return the current absolute y coordinate
>   */
> -li_fixed_t
> +double
>  libinput_event_pointer_get_absolute_y(struct libinput_event_pointer *event);
>  
>  /**
> @@ -528,7 +482,7 @@ libinput_event_pointer_get_absolute_y(struct libinput_event_pointer *event);
>   * @param width The current output screen width
>   * @return the current absolute x coordinate transformed to a screen coordinate
>   */
> -li_fixed_t
> +double
>  libinput_event_pointer_get_absolute_x_transformed(
>  	struct libinput_event_pointer *event,
>  	uint32_t width);
> @@ -550,7 +504,7 @@ libinput_event_pointer_get_absolute_x_transformed(
>   * @param height The current output screen height
>   * @return the current absolute y coordinate transformed to a screen coordinate
>   */
> -li_fixed_t
> +double
>  libinput_event_pointer_get_absolute_y_transformed(
>  	struct libinput_event_pointer *event,
>  	uint32_t height);
> @@ -636,7 +590,7 @@ libinput_event_pointer_get_axis(struct libinput_event_pointer *event);
>   *
>   * @return the axis value of this event
>   */
> -li_fixed_t
> +double
>  libinput_event_pointer_get_axis_value(struct libinput_event_pointer *event);
>  
>  /**
> @@ -711,7 +665,7 @@ libinput_event_touch_get_seat_slot(struct libinput_event_touch *event);
>   * @param event The libinput touch event
>   * @return the current absolute x coordinate
>   */
> -li_fixed_t
> +double
>  libinput_event_touch_get_x(struct libinput_event_touch *event);
>  
>  /**
> @@ -731,7 +685,7 @@ libinput_event_touch_get_x(struct libinput_event_touch *event);
>   * @param event The libinput touch event
>   * @return the current absolute y coordinate
>   */
> -li_fixed_t
> +double
>  libinput_event_touch_get_y(struct libinput_event_touch *event);
>  
>  /**
> @@ -747,7 +701,7 @@ libinput_event_touch_get_y(struct libinput_event_touch *event);
>   * @param width The current output screen width
>   * @return the current absolute x coordinate transformed to a screen coordinate
>   */
> -li_fixed_t
> +double
>  libinput_event_touch_get_x_transformed(struct libinput_event_touch *event,
>  				       uint32_t width);
>  
> @@ -764,7 +718,7 @@ libinput_event_touch_get_x_transformed(struct libinput_event_touch *event,
>   * @param height The current output screen height
>   * @return the current absolute y coordinate transformed to a screen coordinate
>   */
> -li_fixed_t
> +double
>  libinput_event_touch_get_y_transformed(struct libinput_event_touch *event,
>  				       uint32_t height);
>  
> diff --git a/test/pointer.c b/test/pointer.c
> index f47e094..3a2386c 100644
> --- a/test/pointer.c
> +++ b/test/pointer.c
> @@ -66,8 +66,8 @@ test_relative_event(struct litest_device *dev, int dx, int dy)
>  	expected_length = sqrt(dx*dx + dy*dy);
>  	expected_dir = atan2(dx, dy);
>  
> -	ev_dx = li_fixed_to_double(libinput_event_pointer_get_dx(ptrev));
> -	ev_dy = li_fixed_to_double(libinput_event_pointer_get_dy(ptrev));
> +	ev_dx = libinput_event_pointer_get_dx(ptrev);
> +	ev_dy = libinput_event_pointer_get_dy(ptrev);
>  	actual_length = sqrt(ev_dx*ev_dx + ev_dy*ev_dy);
>  	actual_dir = atan2(ev_dx, ev_dy);
>  
> @@ -183,8 +183,7 @@ test_wheel_event(struct litest_device *dev, int which, int amount)
>  			 which == REL_WHEEL ?
>  				LIBINPUT_POINTER_AXIS_VERTICAL_SCROLL :
>  				LIBINPUT_POINTER_AXIS_HORIZONTAL_SCROLL);
> -	ck_assert_int_eq(libinput_event_pointer_get_axis_value(ptrev),
> -			 li_fixed_from_int(expected));
> +	ck_assert_int_eq(libinput_event_pointer_get_axis_value(ptrev), expected);
>  	libinput_event_destroy(event);
>  }
>  
> diff --git a/test/touch.c b/test/touch.c
> index 41ecc18..2a7c966 100644
> --- a/test/touch.c
> +++ b/test/touch.c
> @@ -68,7 +68,7 @@ START_TEST(touch_abs_transform)
>  	struct libinput *libinput;
>  	struct libinput_event *ev;
>  	struct libinput_event_touch *tev;
> -	li_fixed_t fx, fy;
> +	double fx, fy;
>  	bool tested = false;
>  
>  	struct input_absinfo abs[] = {
> @@ -97,9 +97,9 @@ START_TEST(touch_abs_transform)
>  
>  		tev = libinput_event_get_touch_event(ev);
>  		fx = libinput_event_touch_get_x_transformed(tev, 1920);
> -		ck_assert_int_eq(li_fixed_to_int(fx), 1919);
> +		ck_assert_int_eq(fx, 1919.0);
>  		fy = libinput_event_touch_get_y_transformed(tev, 720);
> -		ck_assert_int_eq(li_fixed_to_int(fy), 719);
> +		ck_assert_int_eq(fy, 719.0);
>  
>  		tested = true;
>  
> diff --git a/tools/event-debug.c b/tools/event-debug.c
> index de6b875..dee7ae6 100644
> --- a/tools/event-debug.c
> +++ b/tools/event-debug.c
> @@ -254,29 +254,25 @@ static void
>  print_motion_event(struct libinput_event *ev)
>  {
>  	struct libinput_event_pointer *p = libinput_event_get_pointer_event(ev);
> -	li_fixed_t x =	libinput_event_pointer_get_dx(p),
> -		   y = libinput_event_pointer_get_dy(p);
> +	double x = libinput_event_pointer_get_dx(p);
> +	double y = libinput_event_pointer_get_dy(p);
>  
>  	print_event_time(libinput_event_pointer_get_time(p));
>  
> -	printf("%6.2f/%6.2f\n",
> -	       li_fixed_to_double(x),
> -	       li_fixed_to_double(y));
> +	printf("%6.2f/%6.2f\n", x, y);
>  }
>  
>  static void
>  print_absmotion_event(struct libinput_event *ev)
>  {
>  	struct libinput_event_pointer *p = libinput_event_get_pointer_event(ev);
> -	li_fixed_t x = libinput_event_pointer_get_absolute_x_transformed(
> +	double x = libinput_event_pointer_get_absolute_x_transformed(
>  		p, screen_width);
> -	li_fixed_t y = libinput_event_pointer_get_absolute_y_transformed(
> +	double y = libinput_event_pointer_get_absolute_y_transformed(
>  		p, screen_height);
>  
>  	print_event_time(libinput_event_pointer_get_time(p));
> -	printf("%6.2f/%6.2f\n",
> -	       li_fixed_to_double(x),
> -	       li_fixed_to_double(y));
> +	printf("%6.2f/%6.2f\n", x, y);
>  }
>  
>  static void
> @@ -300,7 +296,7 @@ print_axis_event(struct libinput_event *ev)
>  	struct libinput_event_pointer *p = libinput_event_get_pointer_event(ev);
>  	enum libinput_pointer_axis axis = libinput_event_pointer_get_axis(p);
>  	const char *ax;
> -	li_fixed_t val;
> +	double val;
>  
>  	switch (axis) {
>  	case LIBINPUT_POINTER_AXIS_VERTICAL_SCROLL:
> @@ -315,8 +311,7 @@ print_axis_event(struct libinput_event *ev)
>  
>  	print_event_time(libinput_event_pointer_get_time(p));
>  	val = libinput_event_pointer_get_axis_value(p);
> -	printf("%s %.2f\n",
> -	       ax, li_fixed_to_double(val));
> +	printf("%s %.2f\n", ax, val);
>  }
>  
>  static void
> @@ -332,16 +327,15 @@ static void
>  print_touch_event_with_coords(struct libinput_event *ev)
>  {
>  	struct libinput_event_touch *t = libinput_event_get_touch_event(ev);
> -	li_fixed_t x = libinput_event_touch_get_x_transformed(t, screen_width),
> -		   y = libinput_event_touch_get_y_transformed(t, screen_height);
> +	double x = libinput_event_touch_get_x_transformed(t, screen_width);
> +	double y = libinput_event_touch_get_y_transformed(t, screen_height);
>  
>  	print_event_time(libinput_event_touch_get_time(t));
>  
>  	printf("%d (%d) %5.2f/%5.2f\n",
>  	       libinput_event_touch_get_slot(t),
>  	       libinput_event_touch_get_seat_slot(t),
> -	       li_fixed_to_double(x),
> -	       li_fixed_to_double(y));
> +	       x, y);
>  }
>  
>  static int
> -- 
> 1.9.1


More information about the wayland-devel mailing list