Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
 src/evdev-mt-touchpad-edge-scroll.c |  8 +++++---
 src/evdev.c                         | 27 ++++++++++++++++-----------
 src/libinput-private.h              |  8 ++++++--
 src/libinput.c                      | 12 +++++-------
 4 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/src/evdev-mt-touchpad-edge-scroll.c 
b/src/evdev-mt-touchpad-edge-scroll.c
index d33f4fd..6e24819 100644
--- a/src/evdev-mt-touchpad-edge-scroll.c
+++ b/src/evdev-mt-touchpad-edge-scroll.c
@@ -315,6 +315,7 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t 
time)
        double initial_dx, initial_dy, *initial_delta;
        struct normalized_coords normalized;
        const struct normalized_coords zero = { 0.0, 0.0 };
+       const struct discrete_coords zero_discrete = { 0.0, 0.0 };
 
        if (tp->scroll.method != LIBINPUT_CONFIG_SCROLL_EDGE)
                return 0;
@@ -331,7 +332,7 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t 
time)
                                                AS_MASK(t->scroll.direction),
                                                
LIBINPUT_POINTER_AXIS_SOURCE_FINGER,
                                                &zero,
-                                               0, 0);
+                                               &zero_discrete);
                                        t->scroll.direction = -1;
                                }
                                continue;
@@ -383,7 +384,7 @@ tp_edge_scroll_post_events(struct tp_dispatch *tp, uint64_t 
time)
                                    AS_MASK(axis),
                                    LIBINPUT_POINTER_AXIS_SOURCE_FINGER,
                                    &normalized,
-                                   0, 0);
+                                   &zero_discrete);
                t->scroll.direction = axis;
 
                tp_edge_scroll_handle_event(tp, t, SCROLL_EVENT_POSTED);
@@ -398,6 +399,7 @@ tp_edge_scroll_stop_events(struct tp_dispatch *tp, uint64_t 
time)
        struct libinput_device *device = &tp->device->base;
        struct tp_touch *t;
        const struct normalized_coords zero = { 0.0, 0.0 };
+       const struct discrete_coords zero_discrete = { 0.0, 0.0 };
 
        tp_for_each_touch(tp, t) {
                if (t->scroll.direction != -1) {
@@ -405,7 +407,7 @@ tp_edge_scroll_stop_events(struct tp_dispatch *tp, uint64_t 
time)
                                            AS_MASK(t->scroll.direction),
                                            LIBINPUT_POINTER_AXIS_SOURCE_FINGER,
                                            &zero,
-                                           0.0, 0.0);
+                                           &zero_discrete);
                        t->scroll.direction = -1;
                }
        }
diff --git a/src/evdev.c b/src/evdev.c
index cab7e85..c661af9 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -586,15 +586,16 @@ evdev_notify_axis(struct evdev_device *device,
                  uint32_t axes,
                  enum libinput_pointer_axis_source source,
                  const struct normalized_coords *delta_in,
-                 double x_discrete, double y_discrete)
+                 const struct discrete_coords *discrete_in)
 {
        struct normalized_coords delta = *delta_in;
+       struct discrete_coords discrete = *discrete_in;
 
        if (device->scroll.natural_scrolling_enabled) {
                delta.x *= -1;
                delta.y *= -1;
-               x_discrete *= -1;
-               y_discrete *= -1;
+               discrete.x *= -1;
+               discrete.y *= -1;
        }
 
        pointer_notify_axis(&device->base,
@@ -602,7 +603,7 @@ evdev_notify_axis(struct evdev_device *device,
                            axes,
                            source,
                            &delta,
-                           x_discrete, y_discrete);
+                           &discrete);
 }
 
 static inline void
@@ -610,6 +611,7 @@ evdev_process_relative(struct evdev_device *device,
                       struct input_event *e, uint64_t time)
 {
        struct normalized_coords wheel_degrees = { 0.0, 0.0 };
+       struct discrete_coords discrete = { 0.0, 0.0 };
 
        switch (e->code) {
        case REL_X:
@@ -628,26 +630,26 @@ evdev_process_relative(struct evdev_device *device,
                evdev_flush_pending_event(device, time);
                wheel_degrees.y = -1 * e->value *
                                        device->scroll.wheel_click_angle;
+               discrete.y = -1 * e->value;
                evdev_notify_axis(
                        device,
                        time,
                        AS_MASK(LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL),
                        LIBINPUT_POINTER_AXIS_SOURCE_WHEEL,
                        &wheel_degrees,
-                       0.0,
-                       -1 * e->value);
+                       &discrete);
                break;
        case REL_HWHEEL:
                evdev_flush_pending_event(device, time);
                wheel_degrees.x = e->value * device->scroll.wheel_click_angle;
+               discrete.x = e->value;
                evdev_notify_axis(
                        device,
                        time,
                        AS_MASK(LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL),
                        LIBINPUT_POINTER_AXIS_SOURCE_WHEEL,
                        &wheel_degrees,
-                       e->value,
-                       0.0);
+                       &discrete);
                break;
        }
 }
@@ -1977,13 +1979,15 @@ evdev_post_scroll(struct evdev_device *device,
                               LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))
                event.x = 0.0;
 
-       if (event.x != 0.0 || event.y != 0.0)
+       if (event.x != 0.0 || event.y != 0.0) {
+               const struct discrete_coords zero_discrete = { 0.0, 0.0 };
                evdev_notify_axis(device,
                                  time,
                                  device->scroll.direction,
                                  source,
                                  &event,
-                                 0.0, 0.0);
+                                 &zero_discrete);
+       }
 }
 
 void
@@ -1992,6 +1996,7 @@ evdev_stop_scroll(struct evdev_device *device,
                  enum libinput_pointer_axis_source source)
 {
        const struct normalized_coords zero = { 0.0, 0.0 };
+       const struct discrete_coords zero_discrete = { 0.0, 0.0 };
 
        /* terminate scrolling with a zero scroll event */
        if (device->scroll.direction != 0)
@@ -2000,7 +2005,7 @@ evdev_stop_scroll(struct evdev_device *device,
                                    device->scroll.direction,
                                    source,
                                    &zero,
-                                   0.0, 0.0);
+                                   &zero_discrete);
 
        device->scroll.buildup.x = 0;
        device->scroll.buildup.y = 0;
diff --git a/src/libinput-private.h b/src/libinput-private.h
index 91bfc37..e39ac5e 100644
--- a/src/libinput-private.h
+++ b/src/libinput-private.h
@@ -42,6 +42,11 @@ struct normalized_coords {
        double x, y;
 };
 
+/* A discrete step pair (mouse wheels) */
+struct discrete_coords {
+       int x, y;
+};
+
 struct libinput_interface_backend {
        int (*resume)(struct libinput *libinput);
        void (*suspend)(struct libinput *libinput);
@@ -310,8 +315,7 @@ pointer_notify_axis(struct libinput_device *device,
                    uint32_t axes,
                    enum libinput_pointer_axis_source source,
                    const struct normalized_coords *delta,
-                   double x_discrete,
-                   double y_discrete);
+                   const struct discrete_coords *discrete);
 
 void
 touch_notify_touch_down(struct libinput_device *device,
diff --git a/src/libinput.c b/src/libinput.c
index 1a68069..8db6997 100644
--- a/src/libinput.c
+++ b/src/libinput.c
@@ -59,8 +59,7 @@ struct libinput_event_pointer {
        uint32_t time;
        struct normalized_coords delta;
        struct device_coords absolute;
-       double x_discrete;
-       double y_discrete;
+       struct discrete_coords discrete;
        double dx_unaccel;
        double dy_unaccel;
        uint32_t button;
@@ -428,10 +427,10 @@ libinput_event_pointer_get_axis_value_discrete(struct 
libinput_event_pointer *ev
        } else {
                switch (axis) {
                case LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL:
-                       value = event->x_discrete;
+                       value = event->discrete.x;
                        break;
                case LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL:
-                       value = event->y_discrete;
+                       value = event->discrete.y;
                        break;
                }
        }
@@ -1037,7 +1036,7 @@ pointer_notify_axis(struct libinput_device *device,
                    uint32_t axes,
                    enum libinput_pointer_axis_source source,
                    const struct normalized_coords *delta,
-                   double x_discrete, double y_discrete)
+                   const struct discrete_coords *discrete)
 {
        struct libinput_event_pointer *axis_event;
 
@@ -1050,8 +1049,7 @@ pointer_notify_axis(struct libinput_device *device,
                .delta = *delta,
                .source = source,
                .axes = axes,
-               .x_discrete = x_discrete,
-               .y_discrete = y_discrete,
+               .discrete = *discrete,
        };
 
        post_device_event(device, time,
-- 
2.1.0

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to