diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2016-01-18 16:38:22 +1000 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2016-01-19 12:33:26 +0800 |
commit | 87743e93036c661b7d46a3ebb2a1a16233064004 (patch) | |
tree | 557f0d9fd43ec95f09393a61ebc0a2616a53b851 /src/libinput-device.c | |
parent | 89b6a4931ef40e4524fec9bfc05627be9a974758 (diff) | |
download | weston-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.c | 128 |
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; } |