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/input.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/input.c')
-rw-r--r-- | src/input.c | 96 |
1 files changed, 90 insertions, 6 deletions
diff --git a/src/input.c b/src/input.c index 9382bb19..91813ec2 100644 --- a/src/input.c +++ b/src/input.c @@ -343,9 +343,56 @@ weston_pointer_send_axis(struct weston_pointer *pointer, return; resource_list = &pointer->focus_client->pointer_resources; + wl_resource_for_each(resource, resource_list) { + if (event->has_discrete && + wl_resource_get_version(resource) >= + WL_POINTER_AXIS_DISCRETE_SINCE_VERSION) + wl_pointer_send_axis_discrete(resource, event->axis, + event->discrete); + + if (event->value) + wl_pointer_send_axis(resource, time, + event->axis, event->value); + else if (wl_resource_get_version(resource) >= + WL_POINTER_AXIS_STOP_SINCE_VERSION) + wl_pointer_send_axis_stop(resource, time, + event->axis); + } +} + +WL_EXPORT void +weston_pointer_send_axis_source(struct weston_pointer *pointer, uint32_t source) +{ + struct wl_resource *resource; + struct wl_list *resource_list; + + resource_list = &pointer->focus_client->pointer_resources; + wl_resource_for_each(resource, resource_list) { + if (wl_resource_get_version(resource) >= + WL_POINTER_AXIS_SOURCE_SINCE_VERSION) { + wl_pointer_send_axis_source(resource, source); + } + } +} + +static void +pointer_send_frame(struct wl_resource *resource) +{ + if (wl_resource_get_version(resource) >= + WL_POINTER_FRAME_SINCE_VERSION) { + wl_pointer_send_frame(resource); + } +} + +WL_EXPORT void +weston_pointer_send_frame(struct weston_pointer *pointer) +{ + struct wl_resource *resource; + struct wl_list *resource_list; + + resource_list = &pointer->focus_client->pointer_resources; wl_resource_for_each(resource, resource_list) - wl_pointer_send_axis(resource, time, - event->axis, event->value); + pointer_send_frame(resource); } static void @@ -357,6 +404,19 @@ default_grab_pointer_axis(struct weston_pointer_grab *grab, } static void +default_grab_pointer_axis_source(struct weston_pointer_grab *grab, + uint32_t source) +{ + weston_pointer_send_axis_source(grab->pointer, source); +} + +static void +default_grab_pointer_frame(struct weston_pointer_grab *grab) +{ + weston_pointer_send_frame(grab->pointer); +} + +static void default_grab_pointer_cancel(struct weston_pointer_grab *grab) { } @@ -367,6 +427,8 @@ static const struct weston_pointer_grab_interface default_grab_pointer_motion, default_grab_pointer_button, default_grab_pointer_axis, + default_grab_pointer_axis_source, + default_grab_pointer_frame, default_grab_pointer_cancel, }; @@ -830,6 +892,7 @@ weston_pointer_set_focus(struct weston_pointer *pointer, wl_resource_for_each(resource, focus_resource_list) { wl_pointer_send_leave(resource, serial, surface_resource); + pointer_send_frame(resource); } } @@ -856,6 +919,7 @@ weston_pointer_set_focus(struct weston_pointer *pointer, serial, view->surface->resource, sx, sy); + pointer_send_frame(resource); } pointer->focus_serial = serial; @@ -1277,9 +1341,6 @@ notify_axis(struct weston_seat *seat, uint32_t time, weston_compositor_wake(compositor); - if (!event->value) - return; - if (weston_compositor_run_axis_binding(compositor, pointer, time, event)) return; @@ -1287,6 +1348,28 @@ notify_axis(struct weston_seat *seat, uint32_t time, pointer->grab->interface->axis(pointer->grab, time, event); } +WL_EXPORT void +notify_axis_source(struct weston_seat *seat, uint32_t source) +{ + struct weston_compositor *compositor = seat->compositor; + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + + weston_compositor_wake(compositor); + + pointer->grab->interface->axis_source(pointer->grab, source); +} + +WL_EXPORT void +notify_pointer_frame(struct weston_seat *seat) +{ + struct weston_compositor *compositor = seat->compositor; + struct weston_pointer *pointer = weston_seat_get_pointer(seat); + + weston_compositor_wake(compositor); + + pointer->grab->interface->frame(pointer->grab); +} + WL_EXPORT int weston_keyboard_set_locks(struct weston_keyboard *keyboard, uint32_t mask, uint32_t value) @@ -1979,6 +2062,7 @@ seat_get_pointer(struct wl_client *client, struct wl_resource *resource, pointer->focus_serial, pointer->focus->surface->resource, sx, sy); + pointer_send_frame(cr); } } @@ -2557,7 +2641,7 @@ weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec, wl_signal_init(&seat->destroy_signal); wl_signal_init(&seat->updated_caps_signal); - seat->global = wl_global_create(ec->wl_display, &wl_seat_interface, 4, + seat->global = wl_global_create(ec->wl_display, &wl_seat_interface, 5, seat, bind_seat); seat->compositor = ec; |