Hi, On 09/03/2014 05:50 AM, Peter Hutterer wrote: > On Tue, Sep 02, 2014 at 04:34:49PM +0200, Hans de Goede wrote: >> 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; > > tbh, I prefer uint32_t for flags.
Me too, and that was my intention, but something are the 'u', I'll re-add it in the next version :) >> + } 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); > > instead of passing the threshold every time, could we not set that once > during init the struct scroll above? it would allow for a hypothetical > custom scroll thresholds based on the device. Good idea, will do. Regards, Hans _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel