summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2014-09-18 15:51:53 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2014-09-23 10:54:23 +1000
commit9e29cda72bdf57852207eb3e3c47f03a60a4ea0d (patch)
tree1a315b33bc6c82ae887662261613365eafdef784
parentc481b47f1776549bbfde325fe68dceb0401b3f59 (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.c64
-rw-r--r--src/evdev-mt-touchpad.h5
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 {