Submitted By:            Armin K. <krejzi at email dot com>
Date:                    2015-01-16
Initial Package Version: 1.6.0
Upstream Status:         Fixed
Origin:                  Upstream
Description:             Fixes building with libinput-0.8.0

--- a/src/libinput-device.c	2014-09-17 15:41:56.000000000 +0200
+++ b/src/libinput-device.c	2015-01-16 02:43:31.425340998 +0100
@@ -126,6 +126,44 @@
 		      libinput_event_pointer_get_button_state(pointer_event));
 }
 
+static double
+normalize_scroll(struct libinput_event_pointer *pointer_event,
+		 enum libinput_pointer_axis axis)
+{
+	static int warned;
+	enum libinput_pointer_axis_source source;
+	double value;
+
+	source = libinput_event_pointer_get_axis_source(pointer_event);
+	/* libinput < 0.8 sent wheel click events with value 10. Since 0.8
+	   the value is the angle of the click in degrees. To keep
+	   backwards-compat with existing clients, we just send multiples of
+	   the click count.
+	 */
+	switch (source) {
+	case LIBINPUT_POINTER_AXIS_SOURCE_WHEEL:
+		value = 10 * libinput_event_pointer_get_axis_value_discrete(
+								   pointer_event,
+								   axis);
+		break;
+	case LIBINPUT_POINTER_AXIS_SOURCE_FINGER:
+	case LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS:
+		value = libinput_event_pointer_get_axis_value(pointer_event,
+							      axis);
+		break;
+	default:
+		value = 0;
+		if (warned < 5) {
+			weston_log("Unknown scroll source %d. Event discarded\n",
+				   source);
+			warned++;
+		}
+		break;
+	}
+
+	return value;
+}
+
 static void
 handle_pointer_axis(struct libinput_device *libinput_device,
 		    struct libinput_event_pointer *pointer_event)
@@ -133,12 +171,25 @@
 	struct evdev_device *device =
 		libinput_device_get_user_data(libinput_device);
 	double value;
+	enum libinput_pointer_axis axis;
+
+	axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
+	if (libinput_event_pointer_has_axis(pointer_event, axis)) {
+		value = normalize_scroll(pointer_event, axis);
+		notify_axis(device->seat,
+			    libinput_event_pointer_get_time(pointer_event),
+			    WL_POINTER_AXIS_VERTICAL_SCROLL,
+			    wl_fixed_from_double(value));
+	}
 
-	value = libinput_event_pointer_get_axis_value(pointer_event);
-	notify_axis(device->seat,
-		    libinput_event_pointer_get_time(pointer_event),
-		    libinput_event_pointer_get_axis(pointer_event),
-		    wl_fixed_from_double(value));
+	axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
+	if (libinput_event_pointer_has_axis(pointer_event, axis)) {
+		value = normalize_scroll(pointer_event, axis);
+		notify_axis(device->seat,
+			    libinput_event_pointer_get_time(pointer_event),
+			    WL_POINTER_AXIS_HORIZONTAL_SCROLL,
+			    wl_fixed_from_double(value));
+	}
 }
 
 static void
