Hi,
send-email continues to be broken so here's the v2:
- remove unneded casts
- avoid naming absolute variables dx/dy

--
Giulio


2015-10-19 4:49 GMT+03:00 Jonas Ådahl <[email protected]>:
> On Sat, Oct 17, 2015 at 06:07:06PM +0300, Giulio Camuffo wrote:
>> Hi,
>> git send-email has decided that it doesn't want to send this patch but
>> likely format-patch is more reasonable so i've attached it.
>>
>> --
>> Giulio
>
>> From 060186308dde03279f7a0659e7edec706a0f5123 Mon Sep 17 00:00:00 2001
>> From: Giulio Camuffo <[email protected]>
>> Date: Sat, 17 Oct 2015 17:36:08 +0300
>> Subject: [PATCH] input: use doubles in the interfaces to notify of input
>>  events
>>
>> This patch is a further step in the wl_fixed_t internal sanitization.
>> It changes the notify_* functions to take doubles instead of wl_fixed_t
>> but does not change how these are stored in the various input structs
>> yet. However this already allows to remove all wl_fixed_t usage in places
>> like the libinput or the x11 backend.
>> ---
>>  src/compositor-rdp.c     | 13 ++++---------
>>  src/compositor-wayland.c | 20 ++++++++++++++------
>>  src/compositor-x11.c     | 18 +++++++++---------
>>  src/compositor.c         | 12 ++++++------
>>  src/compositor.h         | 14 +++++++-------
>>  src/input.c              | 24 ++++++++++++++++--------
>>  src/libinput-device.c    | 33 +++++++++++++--------------------
>>  src/screen-share.c       |  5 +++--
>>  tests/weston-test.c      |  4 ++--
>>  9 files changed, 74 insertions(+), 69 deletions(-)
>>
>> diff --git a/src/compositor-rdp.c b/src/compositor-rdp.c
>> index 7272f41..8d186fa 100644
>> --- a/src/compositor-rdp.c
>> +++ b/src/compositor-rdp.c
>> @@ -70,7 +70,7 @@
>>  #include "pixman-renderer.h"
>>
>>  #define MAX_FREERDP_FDS 32
>> -#define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int(10)
>> +#define DEFAULT_AXIS_STEP_DISTANCE 10
>>  #define RDP_MODE_FREQ 60 * 1000
>>
>>  struct rdp_backend_config {
>> @@ -943,7 +943,7 @@ static BOOL xf_peer_post_connect(freerdp_peer *client)
>>  static FREERDP_CB_RET_TYPE
>>  xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
>>  {
>> -     wl_fixed_t wl_x, wl_y, axis;
>> +     double axis;
>>       RdpPeerContext *peerContext = (RdpPeerContext *)input->context;
>>       struct rdp_output *output;
>>       uint32_t button = 0;
>> @@ -951,10 +951,8 @@ xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, 
>> UINT16 y)
>>       if (flags & PTR_FLAGS_MOVE) {
>>               output = peerContext->rdpBackend->output;
>>               if (x < output->base.width && y < output->base.height) {
>> -                     wl_x = wl_fixed_from_int((int)x);
>> -                     wl_y = wl_fixed_from_int((int)y);
>>                       notify_motion_absolute(&peerContext->item.seat, 
>> weston_compositor_get_time(),
>> -                                     wl_x, wl_y);
>> +                                     x, y);
>>               }
>>       }
>>
>> @@ -993,16 +991,13 @@ xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, 
>> UINT16 y)
>>  static FREERDP_CB_RET_TYPE
>>  xf_extendedMouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
>>  {
>> -     wl_fixed_t wl_x, wl_y;
>>       RdpPeerContext *peerContext = (RdpPeerContext *)input->context;
>>       struct rdp_output *output;
>>
>>       output = peerContext->rdpBackend->output;
>>       if (x < output->base.width && y < output->base.height) {
>> -             wl_x = wl_fixed_from_int((int)x);
>> -             wl_y = wl_fixed_from_int((int)y);
>>               notify_motion_absolute(&peerContext->item.seat, 
>> weston_compositor_get_time(),
>> -                             wl_x, wl_y);
>> +                             x, y);
>>       }
>>
>>       FREERDP_CB_RETURN(TRUE);
>> diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
>> index 7b11ae4..8f039a9 100644
>> --- a/src/compositor-wayland.c
>> +++ b/src/compositor-wayland.c
>> @@ -1273,6 +1273,7 @@ input_handle_pointer_enter(void *data, struct 
>> wl_pointer *pointer,
>>       struct wayland_input *input = data;
>>       int32_t fx, fy;
>>       enum theme_location location;
>> +     double dx, dy;
>>
>>       /* XXX: If we get a modifier event immediately before the focus,
>>        *      we should try to keep the same serial. */
>> @@ -1293,11 +1294,14 @@ input_handle_pointer_enter(void *data, struct 
>> wl_pointer *pointer,
>>               location = THEME_LOCATION_CLIENT_AREA;
>>       }
>>
>> -     weston_output_transform_coordinate(&input->output->base, x, y, &x, &y);
>> +     dx = wl_fixed_to_double(x);
>> +     dy = wl_fixed_to_double(y);
>> +     weston_output_transform_coordinate(&input->output->base,
>> +                                        dx, dy, &dx, &dy);
>
> dx/dy (d-prefixed x/y) usually mean deltas, but here they are absolute
> numbers, which is quite confusing. I'd rather not use dx/dy for absolute
> numbers. Same here and for all the other non-delta dx/dy's.
>
>>
>>       if (location == THEME_LOCATION_CLIENT_AREA) {
>>               input->focus = 1;
>> -             notify_pointer_focus(&input->base, &input->output->base, x, y);
>> +             notify_pointer_focus(&input->base, &input->output->base, dx, 
>> dy);
>>               wl_pointer_set_cursor(input->parent.pointer,
>>                                     input->enter_serial, NULL, 0, 0);
>>       } else {
>> @@ -1335,6 +1339,7 @@ input_handle_motion(void *data, struct wl_pointer 
>> *pointer,
>>       struct wayland_input *input = data;
>>       int32_t fx, fy;
>>       enum theme_location location;
>> +     double dx, dy;
>>
>>       if (!input->output)
>>               return;
>> @@ -1353,7 +1358,10 @@ input_handle_motion(void *data, struct wl_pointer 
>> *pointer,
>>               location = THEME_LOCATION_CLIENT_AREA;
>>       }
>>
>> -     weston_output_transform_coordinate(&input->output->base, x, y, &x, &y);
>> +     dx = wl_fixed_to_double(x);
>> +     dy = wl_fixed_to_double(y);
>> +     weston_output_transform_coordinate(&input->output->base,
>> +                                        dx, dy, &dx, &dy);
>>
>>       if (input->focus && location != THEME_LOCATION_CLIENT_AREA) {
>>               input_set_cursor(input);
>> @@ -1362,12 +1370,12 @@ input_handle_motion(void *data, struct wl_pointer 
>> *pointer,
>>       } else if (!input->focus && location == THEME_LOCATION_CLIENT_AREA) {
>>               wl_pointer_set_cursor(input->parent.pointer,
>>                                     input->enter_serial, NULL, 0, 0);
>> -             notify_pointer_focus(&input->base, &input->output->base, x, y);
>> +             notify_pointer_focus(&input->base, &input->output->base, dx, 
>> dy);
>>               input->focus = 1;
>>       }
>>
>>       if (location == THEME_LOCATION_CLIENT_AREA)
>> -             notify_motion_absolute(&input->base, time, x, y);
>> +             notify_motion_absolute(&input->base, time, dx, dy);
>>  }
>>
>>  static void
>> @@ -1426,7 +1434,7 @@ input_handle_axis(void *data, struct wl_pointer 
>> *pointer,
>>  {
>>       struct wayland_input *input = data;
>>
>> -     notify_axis(&input->base, time, axis, value);
>> +     notify_axis(&input->base, time, axis, wl_fixed_to_double(value));
>>  }
>>
>>  static const struct wl_pointer_listener pointer_listener = {
>> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
>> index 9a23996..2b9c582 100644
>> --- a/src/compositor-x11.c
>> +++ b/src/compositor-x11.c
>> @@ -58,7 +58,7 @@
>>  #include "presentation_timing-server-protocol.h"
>>  #include "linux-dmabuf.h"
>>
>> -#define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int(10)
>> +#define DEFAULT_AXIS_STEP_DISTANCE 10
>>
>>  static int option_width;
>>  static int option_height;
>> @@ -85,8 +85,8 @@ struct x11_backend {
>>       /* We could map multi-pointer X to multiple wayland seats, but
>>        * for now we only support core X input. */
>>       struct weston_seat               core_seat;
>> -     wl_fixed_t                       prev_x;
>> -     wl_fixed_t                       prev_y;
>> +     double                           prev_x;
>> +     double                           prev_y;
>>
>>       struct {
>>               xcb_atom_t               wm_protocols;
>> @@ -1125,7 +1125,7 @@ x11_backend_deliver_motion_event(struct x11_backend *b,
>>                                xcb_generic_event_t *event)
>>  {
>>       struct x11_output *output;
>> -     wl_fixed_t x, y;
>> +     double x, y;
>>       xcb_motion_notify_event_t *motion_notify =
>>                       (xcb_motion_notify_event_t *) event;
>>
>> @@ -1136,8 +1136,8 @@ x11_backend_deliver_motion_event(struct x11_backend *b,
>>               return;
>>
>>       weston_output_transform_coordinate(&output->base,
>> -                                        
>> wl_fixed_from_int(motion_notify->event_x),
>> -                                        
>> wl_fixed_from_int(motion_notify->event_y),
>> +                                        motion_notify->event_x,
>> +                                        motion_notify->event_y,
>>                                          &x, &y);
>>
>>       notify_motion(&b->core_seat, weston_compositor_get_time(),
>> @@ -1152,7 +1152,7 @@ x11_backend_deliver_enter_event(struct x11_backend *b,
>>                               xcb_generic_event_t *event)
>>  {
>>       struct x11_output *output;
>> -     wl_fixed_t x, y;
>> +     double x, y;
>>
>>       xcb_enter_notify_event_t *enter_notify =
>>                       (xcb_enter_notify_event_t *) event;
>> @@ -1165,8 +1165,8 @@ x11_backend_deliver_enter_event(struct x11_backend *b,
>>               return;
>>
>>       weston_output_transform_coordinate(&output->base,
>> -                                        
>> wl_fixed_from_int(enter_notify->event_x),
>> -                                        
>> wl_fixed_from_int(enter_notify->event_y), &x, &y);
>> +                                        enter_notify->event_x,
>> +                                        enter_notify->event_y, &x, &y);
>>
>>       notify_pointer_focus(&b->core_seat, &output->base, x, y);
>>
>> diff --git a/src/compositor.c b/src/compositor.c
>> index f8437e8..9a1aa8b 100644
>> --- a/src/compositor.c
>> +++ b/src/compositor.c
>> @@ -4107,19 +4107,19 @@ weston_compositor_add_output(struct 
>> weston_compositor *compositor,
>>
>>  WL_EXPORT void
>>  weston_output_transform_coordinate(struct weston_output *output,
>> -                                wl_fixed_t device_x, wl_fixed_t device_y,
>> -                                wl_fixed_t *x, wl_fixed_t *y)
>> +                                double device_x, double device_y,
>> +                                double *x, double *y)
>>  {
>>       struct weston_vector p = { {
>> -             wl_fixed_to_double(device_x),
>> -             wl_fixed_to_double(device_y),
>> +             device_x,
>> +             device_y,
>>               0.0,
>>               1.0 } };
>>
>>       weston_matrix_transform(&output->inverse_matrix, &p);
>>
>> -     *x = wl_fixed_from_double(p.f[0] / p.f[3]);
>> -     *y = wl_fixed_from_double(p.f[1] / p.f[3]);
>> +     *x = p.f[0] / p.f[3];
>> +     *y = p.f[1] / p.f[3];
>>  }
>>
>>  static void
>> diff --git a/src/compositor.h b/src/compositor.h
>> index 2e2a185..d1f5cf3 100644
>> --- a/src/compositor.h
>> +++ b/src/compositor.h
>> @@ -1065,16 +1065,16 @@ weston_surface_activate(struct weston_surface 
>> *surface,
>>                       struct weston_seat *seat);
>>  void
>>  notify_motion(struct weston_seat *seat, uint32_t time,
>> -           wl_fixed_t dx, wl_fixed_t dy);
>> +           double dx, double dy);
>>  void
>>  notify_motion_absolute(struct weston_seat *seat, uint32_t time,
>> -                    wl_fixed_t x, wl_fixed_t y);
>> +                    double x, double y);
>>  void
>>  notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
>>             enum wl_pointer_button_state state);
>>  void
>>  notify_axis(struct weston_seat *seat, uint32_t time, uint32_t axis,
>> -         wl_fixed_t value);
>> +         double value);
>>  void
>>  notify_key(struct weston_seat *seat, uint32_t time, uint32_t key,
>>          enum wl_keyboard_key_state state,
>> @@ -1084,7 +1084,7 @@ notify_modifiers(struct weston_seat *seat, uint32_t 
>> serial);
>>
>>  void
>>  notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
>> -                  wl_fixed_t x, wl_fixed_t y);
>> +                  double x, double y);
>>
>>  void
>>  notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys,
>> @@ -1094,7 +1094,7 @@ notify_keyboard_focus_out(struct weston_seat *seat);
>>
>>  void
>>  notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
>> -          wl_fixed_t x, wl_fixed_t y, int touch_type);
>> +          double x, double y, int touch_type);
>>  void
>>  notify_touch_frame(struct weston_seat *seat);
>>
>> @@ -1397,8 +1397,8 @@ void
>>  weston_output_destroy(struct weston_output *output);
>>  void
>>  weston_output_transform_coordinate(struct weston_output *output,
>> -                                wl_fixed_t device_x, wl_fixed_t device_y,
>> -                                wl_fixed_t *x, wl_fixed_t *y);
>> +                                double device_x, double device_y,
>> +                                double *x, double *y);
>>
>>  void
>>  weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec,
>> diff --git a/src/input.c b/src/input.c
>> index 500c39a..7184731 100644
>> --- a/src/input.c
>> +++ b/src/input.c
>> @@ -976,13 +976,15 @@ weston_pointer_handle_output_destroy(struct 
>> wl_listener *listener, void *data)
>>
>>  WL_EXPORT void
>>  notify_motion(struct weston_seat *seat,
>> -           uint32_t time, wl_fixed_t dx, wl_fixed_t dy)
>> +           uint32_t time, double dx, double dy)
>>  {
>>       struct weston_compositor *ec = seat->compositor;
>>       struct weston_pointer *pointer = weston_seat_get_pointer(seat);
>>
>>       weston_compositor_wake(ec);
>> -     pointer->grab->interface->motion(pointer->grab, time, pointer->x + dx, 
>> pointer->y + dy);
>> +     pointer->grab->interface->motion(pointer->grab, time,
>> +                                      pointer->x + wl_fixed_from_double(dx),
>> +                                      pointer->y + 
>> wl_fixed_from_double(dy));
>>  }
>>
>>  static void
>> @@ -1023,13 +1025,15 @@ run_modifier_bindings(struct weston_seat *seat, 
>> uint32_t old, uint32_t new)
>>
>>  WL_EXPORT void
>>  notify_motion_absolute(struct weston_seat *seat,
>> -                    uint32_t time, wl_fixed_t x, wl_fixed_t y)
>> +                    uint32_t time, double x, double y)
>>  {
>>       struct weston_compositor *ec = seat->compositor;
>>       struct weston_pointer *pointer = weston_seat_get_pointer(seat);
>>
>>       weston_compositor_wake(ec);
>> -     pointer->grab->interface->motion(pointer->grab, time, x, y);
>> +     pointer->grab->interface->motion(pointer->grab, time,
>> +                                      wl_fixed_from_double(x),
>> +                                      wl_fixed_from_double(y));
>>  }
>>
>>  WL_EXPORT void
>> @@ -1080,12 +1084,13 @@ notify_button(struct weston_seat *seat, uint32_t 
>> time, int32_t button,
>>
>>  WL_EXPORT void
>>  notify_axis(struct weston_seat *seat, uint32_t time, uint32_t axis,
>> -         wl_fixed_t value)
>> +         double dv)
>>  {
>>       struct weston_compositor *compositor = seat->compositor;
>>       struct weston_pointer *pointer = weston_seat_get_pointer(seat);
>>       struct wl_resource *resource;
>>       struct wl_list *resource_list;
>> +     wl_fixed_t value = wl_fixed_from_double(dv);
>>
>>       weston_compositor_wake(compositor);
>>
>> @@ -1408,12 +1413,13 @@ notify_key(struct weston_seat *seat, uint32_t time, 
>> uint32_t key,
>>
>>  WL_EXPORT void
>>  notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
>> -                  wl_fixed_t x, wl_fixed_t y)
>> +                  double x, double y)
>>  {
>>       struct weston_pointer *pointer = weston_seat_get_pointer(seat);
>>
>>       if (output) {
>> -             weston_pointer_move(pointer, x, y);
>> +             weston_pointer_move(pointer, wl_fixed_from_double(x),
>> +                                 wl_fixed_from_double(y));
>>       } else {
>>               /* FIXME: We should call weston_pointer_set_focus(seat,
>>                * NULL) here, but somehow that breaks re-entry... */
>> @@ -1541,13 +1547,15 @@ weston_touch_set_focus(struct weston_touch *touch, 
>> struct weston_view *view)
>>   */
>>  WL_EXPORT void
>>  notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
>> -             wl_fixed_t x, wl_fixed_t y, int touch_type)
>> +             double dx, double dy, int touch_type)
>>  {
>>       struct weston_compositor *ec = seat->compositor;
>>       struct weston_touch *touch = weston_seat_get_touch(seat);
>>       struct weston_touch_grab *grab = touch->grab;
>>       struct weston_view *ev;
>>       wl_fixed_t sx, sy;
>> +     wl_fixed_t x = wl_fixed_from_double(dx);
>> +     wl_fixed_t y = wl_fixed_from_double(dy);
>>
>>       /* Update grab's global coordinates. */
>>       if (touch_id == touch->grab_touch_id && touch_type != WL_TOUCH_UP) {
>> diff --git a/src/libinput-device.c b/src/libinput-device.c
>> index 69dcbf8..13440df 100644
>> --- a/src/libinput-device.c
>> +++ b/src/libinput-device.c
>> @@ -86,14 +86,11 @@ handle_pointer_motion(struct libinput_device 
>> *libinput_device,
>>  {
>>       struct evdev_device *device =
>>               libinput_device_get_user_data(libinput_device);
>> -     wl_fixed_t dx, dy;
>>
>> -     dx = 
>> wl_fixed_from_double(libinput_event_pointer_get_dx(pointer_event));
>> -     dy = 
>> wl_fixed_from_double(libinput_event_pointer_get_dy(pointer_event));
>>       notify_motion(device->seat,
>>                     libinput_event_pointer_get_time(pointer_event),
>> -                   dx,
>> -                   dy);
>> +                   libinput_event_pointer_get_dx(pointer_event),
>> +                   libinput_event_pointer_get_dy(pointer_event));
>>  }
>>
>>  static void
>> @@ -105,7 +102,7 @@ handle_pointer_motion_absolute(
>>               libinput_device_get_user_data(libinput_device);
>>       struct weston_output *output = device->output;
>>       uint32_t time;
>> -     wl_fixed_t x, y;
>> +     double x, y;
>>       uint32_t width, height;
>>
>>       if (!output)
>> @@ -115,12 +112,10 @@ handle_pointer_motion_absolute(
>>       width = device->output->current_mode->width;
>>       height = device->output->current_mode->height;
>>
>> -     x = wl_fixed_from_double(
>> -             
>> libinput_event_pointer_get_absolute_x_transformed(pointer_event,
>> -                                                               width));
>> -     y = wl_fixed_from_double(
>> -             
>> libinput_event_pointer_get_absolute_y_transformed(pointer_event,
>> -                                                               height));
>> +     x = libinput_event_pointer_get_absolute_x_transformed(pointer_event,
>> +                                                           width);
>> +     y = libinput_event_pointer_get_absolute_y_transformed(pointer_event,
>> +                                                           height);
>>
>>       weston_output_transform_coordinate(device->output, x, y, &x, &y);
>>       notify_motion_absolute(device->seat, time, x, y);
>> @@ -203,7 +198,7 @@ handle_pointer_axis(struct libinput_device 
>> *libinput_device,
>>               notify_axis(device->seat,
>>                           libinput_event_pointer_get_time(pointer_event),
>>                           WL_POINTER_AXIS_VERTICAL_SCROLL,
>> -                         wl_fixed_from_double(value));
>> +                         value);
>>       }
>>
>>       axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
>> @@ -212,7 +207,7 @@ handle_pointer_axis(struct libinput_device 
>> *libinput_device,
>>               notify_axis(device->seat,
>>                           libinput_event_pointer_get_time(pointer_event),
>>                           WL_POINTER_AXIS_HORIZONTAL_SCROLL,
>> -                         wl_fixed_from_double(value));
>> +                         value);
>>       }
>>  }
>>
>> @@ -223,8 +218,8 @@ handle_touch_with_coords(struct libinput_device 
>> *libinput_device,
>>  {
>>       struct evdev_device *device =
>>               libinput_device_get_user_data(libinput_device);
>> -     wl_fixed_t x;
>> -     wl_fixed_t y;
>> +     double x;
>> +     double y;
>>       uint32_t width, height;
>>       uint32_t time;
>>       int32_t slot;
>> @@ -237,10 +232,8 @@ handle_touch_with_coords(struct libinput_device 
>> *libinput_device,
>>
>>       width = device->output->current_mode->width;
>>       height = device->output->current_mode->height;
>> -     x = wl_fixed_from_double(
>> -             libinput_event_touch_get_x_transformed(touch_event, width));
>> -     y = wl_fixed_from_double(
>> -             libinput_event_touch_get_y_transformed(touch_event, height));
>> +     x =  libinput_event_touch_get_x_transformed(touch_event, width);
>> +     y =  libinput_event_touch_get_y_transformed(touch_event, height);
>>
>>       weston_output_transform_coordinate(device->output,
>>                                          x, y, &x, &y);
>> diff --git a/src/screen-share.c b/src/screen-share.c
>> index d961c89..b38c394 100644
>> --- a/src/screen-share.c
>> +++ b/src/screen-share.c
>> @@ -142,7 +142,8 @@ ss_seat_handle_motion(void *data, struct wl_pointer 
>> *pointer,
>>       /* No transformation of input position is required here because we are
>>        * always receiving the input in the same coordinates as the output. */
>>
>> -     notify_motion_absolute(&seat->base, time, x, y);
>> +     notify_motion_absolute(&seat->base, time,
>> +                            wl_fixed_to_double(x), wl_fixed_to_double(y));
>>  }
>>
>>  static void
>> @@ -161,7 +162,7 @@ ss_seat_handle_axis(void *data, struct wl_pointer 
>> *pointer,
>>  {
>>       struct ss_seat *seat = data;
>>
>> -     notify_axis(&seat->base, time, axis, value);
>> +     notify_axis(&seat->base, time, axis, wl_fixed_to_double(value));
>>  }
>>
>>  static const struct wl_pointer_listener ss_seat_pointer_listener = {
>> diff --git a/tests/weston-test.c b/tests/weston-test.c
>> index b593f1e..057b816 100644
>> --- a/tests/weston-test.c
>> +++ b/tests/weston-test.c
>> @@ -147,8 +147,8 @@ move_pointer(struct wl_client *client, struct 
>> wl_resource *resource,
>>       struct weston_pointer *pointer = weston_seat_get_pointer(seat);
>>
>>       notify_motion(seat, 100,
>> -                   wl_fixed_from_int(x) - pointer->x,
>> -                   wl_fixed_from_int(y) - pointer->y);
>> +                   (double)x - wl_fixed_to_double(pointer->x),
>> +                   (double)y - wl_fixed_to_double(pointer->y));
>
> nit: No need for the casts here AFAIK.
>
> BTW, are you planning on changing the grab interface vfuncs as well? In
> the relative pointer branch I made the motion vfunc take a motion event
> struct, should we do this for all types of events or just where it seems
> needed?
>
>
> Jonas
>
>>
>>       notify_pointer_position(test, resource);
>>  }
>> --
>> 2.6.1
>>
>
>> _______________________________________________
>> wayland-devel mailing list
>> [email protected]
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
From ec1c65f16a84e2528f14d79e1a6b3e030be131bf Mon Sep 17 00:00:00 2001
From: Giulio Camuffo <[email protected]>
Date: Sat, 17 Oct 2015 17:36:08 +0300
Subject: [PATCH] input: use doubles in the interfaces to notify of input
 events

This patch is a further step in the wl_fixed_t internal sanitization.
It changes the notify_* functions to take doubles instead of wl_fixed_t
but does not change how these are stored in the various input structs
yet. However this already allows to remove all wl_fixed_t usage in places
like the libinput or the x11 backend.
---
 src/compositor-rdp.c     | 13 ++++---------
 src/compositor-wayland.c | 30 +++++++++++++++++++-----------
 src/compositor-x11.c     | 18 +++++++++---------
 src/compositor.c         | 12 ++++++------
 src/compositor.h         | 14 +++++++-------
 src/input.c              | 24 ++++++++++++++++--------
 src/libinput-device.c    | 33 +++++++++++++--------------------
 src/screen-share.c       |  5 +++--
 tests/weston-test.c      |  4 ++--
 9 files changed, 79 insertions(+), 74 deletions(-)

diff --git a/src/compositor-rdp.c b/src/compositor-rdp.c
index 7272f41..8d186fa 100644
--- a/src/compositor-rdp.c
+++ b/src/compositor-rdp.c
@@ -70,7 +70,7 @@
 #include "pixman-renderer.h"
 
 #define MAX_FREERDP_FDS 32
-#define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int(10)
+#define DEFAULT_AXIS_STEP_DISTANCE 10
 #define RDP_MODE_FREQ 60 * 1000
 
 struct rdp_backend_config {
@@ -943,7 +943,7 @@ static BOOL xf_peer_post_connect(freerdp_peer *client)
 static FREERDP_CB_RET_TYPE
 xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
 {
-	wl_fixed_t wl_x, wl_y, axis;
+	double axis;
 	RdpPeerContext *peerContext = (RdpPeerContext *)input->context;
 	struct rdp_output *output;
 	uint32_t button = 0;
@@ -951,10 +951,8 @@ xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
 	if (flags & PTR_FLAGS_MOVE) {
 		output = peerContext->rdpBackend->output;
 		if (x < output->base.width && y < output->base.height) {
-			wl_x = wl_fixed_from_int((int)x);
-			wl_y = wl_fixed_from_int((int)y);
 			notify_motion_absolute(&peerContext->item.seat, weston_compositor_get_time(),
-					wl_x, wl_y);
+					x, y);
 		}
 	}
 
@@ -993,16 +991,13 @@ xf_mouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
 static FREERDP_CB_RET_TYPE
 xf_extendedMouseEvent(rdpInput *input, UINT16 flags, UINT16 x, UINT16 y)
 {
-	wl_fixed_t wl_x, wl_y;
 	RdpPeerContext *peerContext = (RdpPeerContext *)input->context;
 	struct rdp_output *output;
 
 	output = peerContext->rdpBackend->output;
 	if (x < output->base.width && y < output->base.height) {
-		wl_x = wl_fixed_from_int((int)x);
-		wl_y = wl_fixed_from_int((int)y);
 		notify_motion_absolute(&peerContext->item.seat, weston_compositor_get_time(),
-				wl_x, wl_y);
+				x, y);
 	}
 
 	FREERDP_CB_RETURN(TRUE);
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index 7b11ae4..ddb07e7 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -1268,11 +1268,15 @@ input_set_cursor(struct wayland_input *input)
 static void
 input_handle_pointer_enter(void *data, struct wl_pointer *pointer,
 			   uint32_t serial, struct wl_surface *surface,
-			   wl_fixed_t x, wl_fixed_t y)
+			   wl_fixed_t fixed_x, wl_fixed_t fixed_y)
 {
 	struct wayland_input *input = data;
 	int32_t fx, fy;
 	enum theme_location location;
+	double x, y;
+
+	x = wl_fixed_to_double(fixed_x);
+	y = wl_fixed_to_double(fixed_y);
 
 	/* XXX: If we get a modifier event immediately before the focus,
 	 *      we should try to keep the same serial. */
@@ -1281,11 +1285,10 @@ input_handle_pointer_enter(void *data, struct wl_pointer *pointer,
 
 	if (input->output->frame) {
 		location = frame_pointer_enter(input->output->frame, input,
-					       wl_fixed_to_int(x),
-					       wl_fixed_to_int(y));
+					       x, y);
 		frame_interior(input->output->frame, &fx, &fy, NULL, NULL);
-		x -= wl_fixed_from_int(fx);
-		y -= wl_fixed_from_int(fy);
+		x -= fx;
+		y -= fy;
 
 		if (frame_status(input->output->frame) & FRAME_STATUS_REPAINT)
 			weston_output_schedule_repaint(&input->output->base);
@@ -1293,6 +1296,8 @@ input_handle_pointer_enter(void *data, struct wl_pointer *pointer,
 		location = THEME_LOCATION_CLIENT_AREA;
 	}
 
+	x = wl_fixed_to_double(fixed_x);
+	y = wl_fixed_to_double(fixed_y);
 	weston_output_transform_coordinate(&input->output->base, x, y, &x, &y);
 
 	if (location == THEME_LOCATION_CLIENT_AREA) {
@@ -1330,22 +1335,25 @@ input_handle_pointer_leave(void *data, struct wl_pointer *pointer,
 
 static void
 input_handle_motion(void *data, struct wl_pointer *pointer,
-		    uint32_t time, wl_fixed_t x, wl_fixed_t y)
+		    uint32_t time, wl_fixed_t fixed_x, wl_fixed_t fixed_y)
 {
 	struct wayland_input *input = data;
 	int32_t fx, fy;
 	enum theme_location location;
+	double x, y;
 
 	if (!input->output)
 		return;
 
+	x = wl_fixed_to_double(fixed_x);
+	y = wl_fixed_to_double(fixed_y);
+
 	if (input->output->frame) {
 		location = frame_pointer_motion(input->output->frame, input,
-						wl_fixed_to_int(x),
-						wl_fixed_to_int(y));
+						x, y);
 		frame_interior(input->output->frame, &fx, &fy, NULL, NULL);
-		x -= wl_fixed_from_int(fx);
-		y -= wl_fixed_from_int(fy);
+		x -= fx;
+		y -= fy;
 
 		if (frame_status(input->output->frame) & FRAME_STATUS_REPAINT)
 			weston_output_schedule_repaint(&input->output->base);
@@ -1426,7 +1434,7 @@ input_handle_axis(void *data, struct wl_pointer *pointer,
 {
 	struct wayland_input *input = data;
 
-	notify_axis(&input->base, time, axis, value);
+	notify_axis(&input->base, time, axis, wl_fixed_to_double(value));
 }
 
 static const struct wl_pointer_listener pointer_listener = {
diff --git a/src/compositor-x11.c b/src/compositor-x11.c
index 9a23996..2b9c582 100644
--- a/src/compositor-x11.c
+++ b/src/compositor-x11.c
@@ -58,7 +58,7 @@
 #include "presentation_timing-server-protocol.h"
 #include "linux-dmabuf.h"
 
-#define DEFAULT_AXIS_STEP_DISTANCE wl_fixed_from_int(10)
+#define DEFAULT_AXIS_STEP_DISTANCE 10
 
 static int option_width;
 static int option_height;
@@ -85,8 +85,8 @@ struct x11_backend {
 	/* We could map multi-pointer X to multiple wayland seats, but
 	 * for now we only support core X input. */
 	struct weston_seat		 core_seat;
-	wl_fixed_t			 prev_x;
-	wl_fixed_t			 prev_y;
+	double				 prev_x;
+	double				 prev_y;
 
 	struct {
 		xcb_atom_t		 wm_protocols;
@@ -1125,7 +1125,7 @@ x11_backend_deliver_motion_event(struct x11_backend *b,
 				 xcb_generic_event_t *event)
 {
 	struct x11_output *output;
-	wl_fixed_t x, y;
+	double x, y;
 	xcb_motion_notify_event_t *motion_notify =
 			(xcb_motion_notify_event_t *) event;
 
@@ -1136,8 +1136,8 @@ x11_backend_deliver_motion_event(struct x11_backend *b,
 		return;
 
 	weston_output_transform_coordinate(&output->base,
-					   wl_fixed_from_int(motion_notify->event_x),
-					   wl_fixed_from_int(motion_notify->event_y),
+					   motion_notify->event_x,
+					   motion_notify->event_y,
 					   &x, &y);
 
 	notify_motion(&b->core_seat, weston_compositor_get_time(),
@@ -1152,7 +1152,7 @@ x11_backend_deliver_enter_event(struct x11_backend *b,
 				xcb_generic_event_t *event)
 {
 	struct x11_output *output;
-	wl_fixed_t x, y;
+	double x, y;
 
 	xcb_enter_notify_event_t *enter_notify =
 			(xcb_enter_notify_event_t *) event;
@@ -1165,8 +1165,8 @@ x11_backend_deliver_enter_event(struct x11_backend *b,
 		return;
 
 	weston_output_transform_coordinate(&output->base,
-					   wl_fixed_from_int(enter_notify->event_x),
-					   wl_fixed_from_int(enter_notify->event_y), &x, &y);
+					   enter_notify->event_x,
+					   enter_notify->event_y, &x, &y);
 
 	notify_pointer_focus(&b->core_seat, &output->base, x, y);
 
diff --git a/src/compositor.c b/src/compositor.c
index f8437e8..9a1aa8b 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -4107,19 +4107,19 @@ weston_compositor_add_output(struct weston_compositor *compositor,
 
 WL_EXPORT void
 weston_output_transform_coordinate(struct weston_output *output,
-				   wl_fixed_t device_x, wl_fixed_t device_y,
-				   wl_fixed_t *x, wl_fixed_t *y)
+				   double device_x, double device_y,
+				   double *x, double *y)
 {
 	struct weston_vector p = { {
-		wl_fixed_to_double(device_x),
-		wl_fixed_to_double(device_y),
+		device_x,
+		device_y,
 		0.0,
 		1.0 } };
 
 	weston_matrix_transform(&output->inverse_matrix, &p);
 
-	*x = wl_fixed_from_double(p.f[0] / p.f[3]);
-	*y = wl_fixed_from_double(p.f[1] / p.f[3]);
+	*x = p.f[0] / p.f[3];
+	*y = p.f[1] / p.f[3];
 }
 
 static void
diff --git a/src/compositor.h b/src/compositor.h
index 2e2a185..d1f5cf3 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -1065,16 +1065,16 @@ weston_surface_activate(struct weston_surface *surface,
 			struct weston_seat *seat);
 void
 notify_motion(struct weston_seat *seat, uint32_t time,
-	      wl_fixed_t dx, wl_fixed_t dy);
+	      double dx, double dy);
 void
 notify_motion_absolute(struct weston_seat *seat, uint32_t time,
-		       wl_fixed_t x, wl_fixed_t y);
+		       double x, double y);
 void
 notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
 	      enum wl_pointer_button_state state);
 void
 notify_axis(struct weston_seat *seat, uint32_t time, uint32_t axis,
-	    wl_fixed_t value);
+	    double value);
 void
 notify_key(struct weston_seat *seat, uint32_t time, uint32_t key,
 	   enum wl_keyboard_key_state state,
@@ -1084,7 +1084,7 @@ notify_modifiers(struct weston_seat *seat, uint32_t serial);
 
 void
 notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
-		     wl_fixed_t x, wl_fixed_t y);
+		     double x, double y);
 
 void
 notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys,
@@ -1094,7 +1094,7 @@ notify_keyboard_focus_out(struct weston_seat *seat);
 
 void
 notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
-	     wl_fixed_t x, wl_fixed_t y, int touch_type);
+	     double x, double y, int touch_type);
 void
 notify_touch_frame(struct weston_seat *seat);
 
@@ -1397,8 +1397,8 @@ void
 weston_output_destroy(struct weston_output *output);
 void
 weston_output_transform_coordinate(struct weston_output *output,
-				   wl_fixed_t device_x, wl_fixed_t device_y,
-				   wl_fixed_t *x, wl_fixed_t *y);
+				   double device_x, double device_y,
+				   double *x, double *y);
 
 void
 weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec,
diff --git a/src/input.c b/src/input.c
index 500c39a..2a2d31b 100644
--- a/src/input.c
+++ b/src/input.c
@@ -976,13 +976,15 @@ weston_pointer_handle_output_destroy(struct wl_listener *listener, void *data)
 
 WL_EXPORT void
 notify_motion(struct weston_seat *seat,
-	      uint32_t time, wl_fixed_t dx, wl_fixed_t dy)
+	      uint32_t time, double dx, double dy)
 {
 	struct weston_compositor *ec = seat->compositor;
 	struct weston_pointer *pointer = weston_seat_get_pointer(seat);
 
 	weston_compositor_wake(ec);
-	pointer->grab->interface->motion(pointer->grab, time, pointer->x + dx, pointer->y + dy);
+	pointer->grab->interface->motion(pointer->grab, time,
+					 pointer->x + wl_fixed_from_double(dx),
+					 pointer->y + wl_fixed_from_double(dy));
 }
 
 static void
@@ -1023,13 +1025,15 @@ run_modifier_bindings(struct weston_seat *seat, uint32_t old, uint32_t new)
 
 WL_EXPORT void
 notify_motion_absolute(struct weston_seat *seat,
-		       uint32_t time, wl_fixed_t x, wl_fixed_t y)
+		       uint32_t time, double x, double y)
 {
 	struct weston_compositor *ec = seat->compositor;
 	struct weston_pointer *pointer = weston_seat_get_pointer(seat);
 
 	weston_compositor_wake(ec);
-	pointer->grab->interface->motion(pointer->grab, time, x, y);
+	pointer->grab->interface->motion(pointer->grab, time,
+					 wl_fixed_from_double(x),
+					 wl_fixed_from_double(y));
 }
 
 WL_EXPORT void
@@ -1080,12 +1084,13 @@ notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
 
 WL_EXPORT void
 notify_axis(struct weston_seat *seat, uint32_t time, uint32_t axis,
-	    wl_fixed_t value)
+	    double double_val)
 {
 	struct weston_compositor *compositor = seat->compositor;
 	struct weston_pointer *pointer = weston_seat_get_pointer(seat);
 	struct wl_resource *resource;
 	struct wl_list *resource_list;
+	wl_fixed_t value = wl_fixed_from_double(double_val);
 
 	weston_compositor_wake(compositor);
 
@@ -1408,12 +1413,13 @@ notify_key(struct weston_seat *seat, uint32_t time, uint32_t key,
 
 WL_EXPORT void
 notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
-		     wl_fixed_t x, wl_fixed_t y)
+		     double x, double y)
 {
 	struct weston_pointer *pointer = weston_seat_get_pointer(seat);
 
 	if (output) {
-		weston_pointer_move(pointer, x, y);
+		weston_pointer_move(pointer, wl_fixed_from_double(x),
+				    wl_fixed_from_double(y));
 	} else {
 		/* FIXME: We should call weston_pointer_set_focus(seat,
 		 * NULL) here, but somehow that breaks re-entry... */
@@ -1541,13 +1547,15 @@ weston_touch_set_focus(struct weston_touch *touch, struct weston_view *view)
  */
 WL_EXPORT void
 notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
-             wl_fixed_t x, wl_fixed_t y, int touch_type)
+             double double_x, double double_y, int touch_type)
 {
 	struct weston_compositor *ec = seat->compositor;
 	struct weston_touch *touch = weston_seat_get_touch(seat);
 	struct weston_touch_grab *grab = touch->grab;
 	struct weston_view *ev;
 	wl_fixed_t sx, sy;
+	wl_fixed_t x = wl_fixed_from_double(double_x);
+	wl_fixed_t y = wl_fixed_from_double(double_y);
 
 	/* Update grab's global coordinates. */
 	if (touch_id == touch->grab_touch_id && touch_type != WL_TOUCH_UP) {
diff --git a/src/libinput-device.c b/src/libinput-device.c
index 69dcbf8..13440df 100644
--- a/src/libinput-device.c
+++ b/src/libinput-device.c
@@ -86,14 +86,11 @@ handle_pointer_motion(struct libinput_device *libinput_device,
 {
 	struct evdev_device *device =
 		libinput_device_get_user_data(libinput_device);
-	wl_fixed_t dx, dy;
 
-	dx = wl_fixed_from_double(libinput_event_pointer_get_dx(pointer_event));
-	dy = wl_fixed_from_double(libinput_event_pointer_get_dy(pointer_event));
 	notify_motion(device->seat,
 		      libinput_event_pointer_get_time(pointer_event),
-		      dx,
-		      dy);
+		      libinput_event_pointer_get_dx(pointer_event),
+		      libinput_event_pointer_get_dy(pointer_event));
 }
 
 static void
@@ -105,7 +102,7 @@ handle_pointer_motion_absolute(
 		libinput_device_get_user_data(libinput_device);
 	struct weston_output *output = device->output;
 	uint32_t time;
-	wl_fixed_t x, y;
+	double x, y;
 	uint32_t width, height;
 
 	if (!output)
@@ -115,12 +112,10 @@ handle_pointer_motion_absolute(
 	width = device->output->current_mode->width;
 	height = device->output->current_mode->height;
 
-	x = wl_fixed_from_double(
-		libinput_event_pointer_get_absolute_x_transformed(pointer_event,
-								  width));
-	y = wl_fixed_from_double(
-		libinput_event_pointer_get_absolute_y_transformed(pointer_event,
-								  height));
+	x = libinput_event_pointer_get_absolute_x_transformed(pointer_event,
+							      width);
+	y = libinput_event_pointer_get_absolute_y_transformed(pointer_event,
+							      height);
 
 	weston_output_transform_coordinate(device->output, x, y, &x, &y);
 	notify_motion_absolute(device->seat, time, x, y);
@@ -203,7 +198,7 @@ handle_pointer_axis(struct libinput_device *libinput_device,
 		notify_axis(device->seat,
 			    libinput_event_pointer_get_time(pointer_event),
 			    WL_POINTER_AXIS_VERTICAL_SCROLL,
-			    wl_fixed_from_double(value));
+			    value);
 	}
 
 	axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
@@ -212,7 +207,7 @@ handle_pointer_axis(struct libinput_device *libinput_device,
 		notify_axis(device->seat,
 			    libinput_event_pointer_get_time(pointer_event),
 			    WL_POINTER_AXIS_HORIZONTAL_SCROLL,
-			    wl_fixed_from_double(value));
+			    value);
 	}
 }
 
@@ -223,8 +218,8 @@ handle_touch_with_coords(struct libinput_device *libinput_device,
 {
 	struct evdev_device *device =
 		libinput_device_get_user_data(libinput_device);
-	wl_fixed_t x;
-	wl_fixed_t y;
+	double x;
+	double y;
 	uint32_t width, height;
 	uint32_t time;
 	int32_t slot;
@@ -237,10 +232,8 @@ handle_touch_with_coords(struct libinput_device *libinput_device,
 
 	width = device->output->current_mode->width;
 	height = device->output->current_mode->height;
-	x = wl_fixed_from_double(
-		libinput_event_touch_get_x_transformed(touch_event, width));
-	y = wl_fixed_from_double(
-		libinput_event_touch_get_y_transformed(touch_event, height));
+	x =  libinput_event_touch_get_x_transformed(touch_event, width);
+	y =  libinput_event_touch_get_y_transformed(touch_event, height);
 
 	weston_output_transform_coordinate(device->output,
 					   x, y, &x, &y);
diff --git a/src/screen-share.c b/src/screen-share.c
index d961c89..b38c394 100644
--- a/src/screen-share.c
+++ b/src/screen-share.c
@@ -142,7 +142,8 @@ ss_seat_handle_motion(void *data, struct wl_pointer *pointer,
 	/* No transformation of input position is required here because we are
 	 * always receiving the input in the same coordinates as the output. */
 
-	notify_motion_absolute(&seat->base, time, x, y);
+	notify_motion_absolute(&seat->base, time,
+			       wl_fixed_to_double(x), wl_fixed_to_double(y));
 }
 
 static void
@@ -161,7 +162,7 @@ ss_seat_handle_axis(void *data, struct wl_pointer *pointer,
 {
 	struct ss_seat *seat = data;
 
-	notify_axis(&seat->base, time, axis, value);
+	notify_axis(&seat->base, time, axis, wl_fixed_to_double(value));
 }
 
 static const struct wl_pointer_listener ss_seat_pointer_listener = {
diff --git a/tests/weston-test.c b/tests/weston-test.c
index b593f1e..c82cdbe 100644
--- a/tests/weston-test.c
+++ b/tests/weston-test.c
@@ -147,8 +147,8 @@ move_pointer(struct wl_client *client, struct wl_resource *resource,
 	struct weston_pointer *pointer = weston_seat_get_pointer(seat);
 
 	notify_motion(seat, 100,
-		      wl_fixed_from_int(x) - pointer->x,
-		      wl_fixed_from_int(y) - pointer->y);
+		      x - wl_fixed_to_double(pointer->x),
+		      y - wl_fixed_to_double(pointer->y));
 
 	notify_pointer_position(test, resource);
 }
-- 
2.6.1

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to