So that it can be used for middle button trackpoint scrolling too.

Signed-off-by: Hans de Goede <hdego...@redhat.com>
---
 src/evdev-mt-touchpad.c | 56 +++----------------------------------------------
 src/evdev-mt-touchpad.h |  4 ----
 src/evdev.c             | 48 ++++++++++++++++++++++++++++++++++++++++++
 src/evdev.h             | 14 +++++++++++++
 4 files changed, 65 insertions(+), 57 deletions(-)

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index d831b83..059926f 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -492,47 +492,8 @@ tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t 
time)
        dy /= nchanged;
 
        tp_filter_motion(tp, &dx, &dy, time);
-
        /* Require at least five px scrolling to start */
-       if (dy <= -5.0 || dy >= 5.0)
-               tp->scroll.direction |= (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
-
-       if (dx <= -5.0 || dx >= 5.0)
-               tp->scroll.direction |= (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
-
-       if (dy != 0.0 &&
-           (tp->scroll.direction & (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))) {
-               pointer_notify_axis(&tp->device->base,
-                                   time,
-                                   LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
-                                   dy);
-       }
-
-       if (dx != 0.0 &&
-           (tp->scroll.direction & (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))) {
-               pointer_notify_axis(&tp->device->base,
-                                   time,
-                                   LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
-                                   dx);
-       }
-}
-
-static void
-tp_stop_scroll_events(struct tp_dispatch *tp, uint64_t time)
-{
-       /* terminate scrolling with a zero scroll event */
-       if (tp->scroll.direction & (1 << LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))
-               pointer_notify_axis(&tp->device->base,
-                                   time,
-                                   LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
-                                   0);
-       if (tp->scroll.direction & (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))
-               pointer_notify_axis(&tp->device->base,
-                                   time,
-                                   LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
-                                   0);
-
-       tp->scroll.direction = 0;
+       evdev_post_scroll(tp->device, time, dx, dy, 5.0);
 }
 
 static int
@@ -548,7 +509,7 @@ tp_post_scroll_events(struct tp_dispatch *tp, uint64_t time)
        }
 
        if (nfingers_down != 2) {
-               tp_stop_scroll_events(tp, time);
+               evdev_stop_scroll(tp->device, time);
                return 0;
        }
 
@@ -567,7 +528,7 @@ tp_post_events(struct tp_dispatch *tp, uint64_t time)
        consumed |= tp_post_button_events(tp, time);
 
        if (consumed) {
-               tp_stop_scroll_events(tp, time);
+               evdev_stop_scroll(tp->device, time);
                return;
        }
 
@@ -747,14 +708,6 @@ tp_init_accel(struct tp_dispatch *tp, double diagonal)
 }
 
 static int
-tp_init_scroll(struct tp_dispatch *tp)
-{
-       tp->scroll.direction = 0;
-
-       return 0;
-}
-
-static int
 tp_init_palmdetect(struct tp_dispatch *tp,
                   struct evdev_device *device)
 {
@@ -809,9 +762,6 @@ tp_init(struct tp_dispatch *tp,
        tp->hysteresis.margin_y =
                diagonal / DEFAULT_HYSTERESIS_MARGIN_DENOMINATOR;
 
-       if (tp_init_scroll(tp) != 0)
-               return -1;
-
        if (tp_init_accel(tp, diagonal) != 0)
                return -1;
 
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
index 83edf4f..be93c49 100644
--- a/src/evdev-mt-touchpad.h
+++ b/src/evdev-mt-touchpad.h
@@ -200,10 +200,6 @@ struct tp_dispatch {
                } top_area;
        } buttons;                              /* physical buttons */
 
-       struct {
-               enum libinput_pointer_axis direction;
-       } scroll;
-
        enum touchpad_event queued;
 
        struct {
diff --git a/src/evdev.c b/src/evdev.c
index e24e268..b45f7ec 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1131,6 +1131,54 @@ evdev_device_get_size(struct evdev_device *device,
        return 0;
 }
 
+void
+evdev_post_scroll(struct evdev_device *device,
+                 uint64_t time,
+                 double dx,
+                 double dy,
+                 double thresh)
+{
+       if (dy <= -thresh || dy >= thresh)
+               device->scroll.direction |= (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
+
+       if (dx <= -thresh || dx >= thresh)
+               device->scroll.direction |= (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
+
+       if (dy != 0.0 &&
+           (device->scroll.direction & (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))) {
+               pointer_notify_axis(&device->base,
+                                   time,
+                                   LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
+                                   dy);
+       }
+
+       if (dx != 0.0 &&
+           (device->scroll.direction & (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))) {
+               pointer_notify_axis(&device->base,
+                                   time,
+                                   LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
+                                   dx);
+       }
+}
+
+void
+evdev_stop_scroll(struct evdev_device *device, uint64_t time)
+{
+       /* terminate scrolling with a zero scroll event */
+       if (device->scroll.direction & (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))
+               pointer_notify_axis(&device->base,
+                                   time,
+                                   LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
+                                   0);
+       if (device->scroll.direction & (1 << 
LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))
+               pointer_notify_axis(&device->base,
+                                   time,
+                                   LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL,
+                                   0);
+
+       device->scroll.direction = 0;
+}
+
 static void
 release_pressed_keys(struct evdev_device *device)
 {
diff --git a/src/evdev.h b/src/evdev.h
index 50ca713..1cb6bea 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -89,6 +89,10 @@ struct evdev_device {
                int dx, dy;
        } rel;
 
+       struct {
+               int32_t direction;
+       } scroll;
+
        enum evdev_event_type pending_event;
        enum evdev_device_seat_capability seat_caps;
 
@@ -200,6 +204,16 @@ evdev_pointer_notify_button(struct evdev_device *device,
                            enum libinput_button_state state);
 
 void
+evdev_post_scroll(struct evdev_device *device,
+                 uint64_t time,
+                 double dx,
+                 double dy,
+                 double thresh);
+
+void
+evdev_stop_scroll(struct evdev_device *device, uint64_t time);
+
+void
 evdev_device_remove(struct evdev_device *device);
 
 void
-- 
2.1.0

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

Reply via email to