diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2014-09-18 15:51:53 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2014-09-23 10:54:23 +1000 |
commit | 9e29cda72bdf57852207eb3e3c47f03a60a4ea0d (patch) | |
tree | 1a315b33bc6c82ae887662261613365eafdef784 | |
parent | c481b47f1776549bbfde325fe68dceb0401b3f59 (diff) |
touchpad: hook up natural scrolling configuration
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
-rw-r--r-- | src/evdev-mt-touchpad.c | 64 | ||||
-rw-r--r-- | src/evdev-mt-touchpad.h | 5 |
2 files changed, 69 insertions, 0 deletions
diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c index 8b6f98e3..56f46ece 100644 --- a/src/evdev-mt-touchpad.c +++ b/src/evdev-mt-touchpad.c @@ -492,6 +492,12 @@ tp_post_twofinger_scroll(struct tp_dispatch *tp, uint64_t time) dy /= nchanged; tp_filter_motion(tp, &dx, &dy, time); + + if (tp->scroll.natural_scrolling_enabled) { + dx = -dx; + dy = -dy; + } + evdev_post_scroll(tp->device, time, dx, dy); } @@ -849,6 +855,61 @@ tp_init_accel(struct tp_dispatch *tp, double diagonal) } static int +tp_scroll_config_natural_has(struct libinput_device *device) +{ + return 1; +} + +static enum libinput_config_status +tp_scroll_config_natural_set(struct libinput_device *device, + int enabled) +{ + struct evdev_dispatch *dispatch; + struct tp_dispatch *tp = NULL; + + dispatch = ((struct evdev_device *) device)->dispatch; + tp = container_of(dispatch, tp, base); + + tp->scroll.natural_scrolling_enabled = enabled ? true : false; + + return LIBINPUT_CONFIG_STATUS_SUCCESS; +} + +static int +tp_scroll_config_natural_get(struct libinput_device *device) +{ + struct evdev_dispatch *dispatch; + struct tp_dispatch *tp = NULL; + + dispatch = ((struct evdev_device *) device)->dispatch; + tp = container_of(dispatch, tp, base); + + return tp->scroll.natural_scrolling_enabled ? 1 : 0; +} + +static int +tp_scroll_config_natural_get_default(struct libinput_device *device) +{ + /* could enable this on Apple touchpads. could do that, could + * very well do that... */ + return 0; +} + +static int +tp_init_scroll(struct tp_dispatch *tp) +{ + + tp->scroll.config.has = tp_scroll_config_natural_has; + tp->scroll.config.set_enabled = tp_scroll_config_natural_set; + tp->scroll.config.get_enabled = tp_scroll_config_natural_get; + tp->scroll.config.get_default_enabled = tp_scroll_config_natural_get_default; + tp->scroll.natural_scrolling_enabled = false; + tp->device->base.config.natural_scroll = &tp->scroll.config; + + return 0; +} + +static int tp_init_palmdetect(struct tp_dispatch *tp, struct evdev_device *device) { @@ -903,6 +964,9 @@ 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 784155ba..ef316f17 100644 --- a/src/evdev-mt-touchpad.h +++ b/src/evdev-mt-touchpad.h @@ -201,6 +201,11 @@ struct tp_dispatch { struct evdev_device *trackpoint; } buttons; /* physical buttons */ + struct { + struct libinput_device_config_natural_scroll config; + bool natural_scrolling_enabled; + } scroll; + enum touchpad_event queued; struct { |