summaryrefslogtreecommitdiff
path: root/src/libinput-device.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2016-01-18 16:38:22 +1000
committerJonas Ådahl <jadahl@gmail.com>2016-01-19 12:33:26 +0800
commit87743e93036c661b7d46a3ebb2a1a16233064004 (patch)
tree557f0d9fd43ec95f09393a61ebc0a2616a53b851 /src/libinput-device.c
parent89b6a4931ef40e4524fec9bfc05627be9a974758 (diff)
downloadweston-87743e93036c661b7d46a3ebb2a1a16233064004.tar.gz
Support axis source, axis discrete, frame and axis stop events
[jonas: only send focus wl_pointer.frame if resource supports it] Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Jonas Ådahl <jadahl@gmail.com> Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
Diffstat (limited to 'src/libinput-device.c')
-rw-r--r--src/libinput-device.c128
1 files changed, 96 insertions, 32 deletions
diff --git a/src/libinput-device.c b/src/libinput-device.c
index 9860d6e6..99b2916f 100644
--- a/src/libinput-device.c
+++ b/src/libinput-device.c
@@ -80,7 +80,7 @@ handle_keyboard_key(struct libinput_device *libinput_device,
STATE_UPDATE_AUTOMATIC);
}
-static void
+static bool
handle_pointer_motion(struct libinput_device *libinput_device,
struct libinput_event_pointer *pointer_event)
{
@@ -97,9 +97,11 @@ handle_pointer_motion(struct libinput_device *libinput_device,
notify_motion(device->seat,
libinput_event_pointer_get_time(pointer_event),
&event);
+
+ return true;
}
-static void
+static bool
handle_pointer_motion_absolute(
struct libinput_device *libinput_device,
struct libinput_event_pointer *pointer_event)
@@ -112,7 +114,7 @@ handle_pointer_motion_absolute(
uint32_t width, height;
if (!output)
- return;
+ return false;
time = libinput_event_pointer_get_time(pointer_event);
width = device->output->current_mode->width;
@@ -127,9 +129,11 @@ handle_pointer_motion_absolute(
weston_output_transform_coordinate(device->output, x, y, &x, &y);
notify_motion_absolute(device->seat, time, x, y);
+
+ return true;
}
-static void
+static bool
handle_pointer_button(struct libinput_device *libinput_device,
struct libinput_event_pointer *pointer_event)
{
@@ -145,21 +149,21 @@ handle_pointer_button(struct libinput_device *libinput_device,
seat_button_count != 1) ||
(button_state == LIBINPUT_BUTTON_STATE_RELEASED &&
seat_button_count != 0))
- return;
+ return false;
notify_button(device->seat,
libinput_event_pointer_get_time(pointer_event),
libinput_event_pointer_get_button(pointer_event),
libinput_event_pointer_get_button_state(pointer_event));
+ return true;
}
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;
+ double value = 0.0;
source = libinput_event_pointer_get_axis_source(pointer_event);
/* libinput < 0.8 sent wheel click events with value 10. Since 0.8
@@ -178,48 +182,101 @@ normalize_scroll(struct libinput_event_pointer *pointer_event,
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
+static int32_t
+get_axis_discrete(struct libinput_event_pointer *pointer_event,
+ enum libinput_pointer_axis axis)
+{
+ enum libinput_pointer_axis_source source;
+
+ source = libinput_event_pointer_get_axis_source(pointer_event);
+
+ if (source != LIBINPUT_POINTER_AXIS_SOURCE_WHEEL)
+ return 0;
+
+ return libinput_event_pointer_get_axis_value_discrete(pointer_event,
+ axis);
+}
+
+static bool
handle_pointer_axis(struct libinput_device *libinput_device,
struct libinput_event_pointer *pointer_event)
{
+ static int warned;
struct evdev_device *device =
libinput_device_get_user_data(libinput_device);
- double value;
+ double vert, horiz;
+ int32_t vert_discrete, horiz_discrete;
enum libinput_pointer_axis axis;
struct weston_pointer_axis_event weston_event;
+ enum libinput_pointer_axis_source source;
+ uint32_t wl_axis_source;
+ bool has_vert, has_horiz;
+
+ has_vert = libinput_event_pointer_has_axis(pointer_event,
+ LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
+ has_horiz = libinput_event_pointer_has_axis(pointer_event,
+ LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
+
+ if (!has_vert && !has_horiz)
+ return false;
+
+ source = libinput_event_pointer_get_axis_source(pointer_event);
+ switch (source) {
+ case LIBINPUT_POINTER_AXIS_SOURCE_WHEEL:
+ wl_axis_source = WL_POINTER_AXIS_SOURCE_WHEEL;
+ break;
+ case LIBINPUT_POINTER_AXIS_SOURCE_FINGER:
+ wl_axis_source = WL_POINTER_AXIS_SOURCE_FINGER;
+ break;
+ case LIBINPUT_POINTER_AXIS_SOURCE_CONTINUOUS:
+ wl_axis_source = WL_POINTER_AXIS_SOURCE_CONTINUOUS;
+ break;
+ default:
+ if (warned < 5) {
+ weston_log("Unknown scroll source %d.\n", source);
+ warned++;
+ }
+ return false;
+ }
+
+ notify_axis_source(device->seat, wl_axis_source);
+
+ if (has_vert) {
+ axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
+ vert_discrete = get_axis_discrete(pointer_event, axis);
+ vert = normalize_scroll(pointer_event, axis);
- axis = LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL;
- if (libinput_event_pointer_has_axis(pointer_event, axis)) {
- value = normalize_scroll(pointer_event, axis);
- weston_event.value = wl_fixed_from_double(value);
weston_event.axis = WL_POINTER_AXIS_VERTICAL_SCROLL;
+ weston_event.value = wl_fixed_from_double(vert);
+ weston_event.discrete = vert_discrete;
+ weston_event.has_discrete = (vert_discrete != 0);
+
notify_axis(device->seat,
libinput_event_pointer_get_time(pointer_event),
&weston_event);
}
- axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
- if (libinput_event_pointer_has_axis(pointer_event, axis)) {
- value = normalize_scroll(pointer_event, axis);
- weston_event.value = wl_fixed_from_double(value);
+ if (has_horiz) {
+ axis = LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL;
+ horiz_discrete = get_axis_discrete(pointer_event, axis);
+ horiz = normalize_scroll(pointer_event, axis);
+
weston_event.axis = WL_POINTER_AXIS_HORIZONTAL_SCROLL;
+ weston_event.value = wl_fixed_from_double(horiz);
+ weston_event.discrete = horiz_discrete;
+ weston_event.has_discrete = (horiz_discrete != 0);
+
notify_axis(device->seat,
libinput_event_pointer_get_time(pointer_event),
&weston_event);
}
+
+ return true;
}
static void
@@ -296,7 +353,10 @@ evdev_device_process_event(struct libinput_event *event)
{
struct libinput_device *libinput_device =
libinput_event_get_device(event);
+ struct evdev_device *device =
+ libinput_device_get_user_data(libinput_device);
int handled = 1;
+ bool need_frame = false;
switch (libinput_event_get_type(event)) {
case LIBINPUT_EVENT_KEYBOARD_KEY:
@@ -304,21 +364,22 @@ evdev_device_process_event(struct libinput_event *event)
libinput_event_get_keyboard_event(event));
break;
case LIBINPUT_EVENT_POINTER_MOTION:
- handle_pointer_motion(libinput_device,
+ need_frame = handle_pointer_motion(libinput_device,
libinput_event_get_pointer_event(event));
break;
case LIBINPUT_EVENT_POINTER_MOTION_ABSOLUTE:
- handle_pointer_motion_absolute(
- libinput_device,
- libinput_event_get_pointer_event(event));
+ need_frame = handle_pointer_motion_absolute(
+ libinput_device,
+ libinput_event_get_pointer_event(event));
break;
case LIBINPUT_EVENT_POINTER_BUTTON:
- handle_pointer_button(libinput_device,
+ need_frame = handle_pointer_button(libinput_device,
libinput_event_get_pointer_event(event));
break;
case LIBINPUT_EVENT_POINTER_AXIS:
- handle_pointer_axis(libinput_device,
- libinput_event_get_pointer_event(event));
+ need_frame = handle_pointer_axis(
+ libinput_device,
+ libinput_event_get_pointer_event(event));
break;
case LIBINPUT_EVENT_TOUCH_DOWN:
handle_touch_down(libinput_device,
@@ -342,6 +403,9 @@ evdev_device_process_event(struct libinput_event *event)
libinput_event_get_type(event));
}
+ if (need_frame)
+ notify_pointer_frame(device->seat);
+
return handled;
}