From 4ce294d641a7b59c5fa79b508cdd69a333902a72 Mon Sep 17 00:00:00 2001 From: Matt Roper Date: Wed, 10 Oct 2012 16:56:52 -0700 Subject: [PATCH] wayland-server: Add touch grab support Touch grabs allow the compositor to be placed into a mode where touch events temporarily bypass their default behavior and perform other operations. Wayland already supports keyboard and pointer grabs, but was lacking corresponding touch support. The default touch grab handlers here contain the client event delivery code that was previously called directly in weston. Signed-off-by: Matt Roper --- src/wayland-server.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ src/wayland-server.h | 35 +++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/src/wayland-server.c b/src/wayland-server.c index f076dcb4..41560f23 100644 --- a/src/wayland-server.c +++ b/src/wayland-server.c @@ -559,6 +559,55 @@ static const struct wl_pointer_grab_interface default_grab_button }; +static void default_grab_touch_down(struct wl_touch_grab *grab, + uint32_t time, + int touch_id, + wl_fixed_t sx, + wl_fixed_t sy) +{ + struct wl_touch *touch = grab->touch; + uint32_t serial; + + if (touch->focus_resource && touch->focus) { + serial = wl_display_next_serial(touch->focus_resource->client->display); + wl_touch_send_down(touch->focus_resource, serial, time, + &touch->focus->resource, touch_id, sx, sy); + } +} + +static void default_grab_touch_up(struct wl_touch_grab *grab, + uint32_t time, + int touch_id) +{ + struct wl_touch *touch = grab->touch; + uint32_t serial; + + if (touch->focus_resource) { + serial = wl_display_next_serial(touch->focus_resource->client->display); + wl_touch_send_up(touch->focus_resource, serial, time, touch_id); + } +} + +static void default_grab_touch_motion(struct wl_touch_grab *grab, + uint32_t time, + int touch_id, + wl_fixed_t sx, + wl_fixed_t sy) +{ + struct wl_touch *touch = grab->touch; + + if (touch->focus_resource) { + wl_touch_send_motion(touch->focus_resource, time, + touch_id, sx, sy); + } +} + +static const struct wl_touch_grab_interface default_touch_grab_interface = { + default_grab_touch_down, + default_grab_touch_up, + default_grab_touch_motion +}; + static void default_grab_key(struct wl_keyboard_grab *grab, uint32_t time, uint32_t key, uint32_t state) @@ -678,6 +727,10 @@ wl_touch_init(struct wl_touch *touch) memset(touch, 0, sizeof *touch); wl_list_init(&touch->resource_list); touch->focus_listener.notify = lose_touch_focus; + touch->default_grab.interface = &default_touch_grab_interface; + touch->default_grab.touch = touch; + touch->grab = &touch->default_grab; + wl_signal_init(&touch->focus_signal); } WL_EXPORT void @@ -902,6 +955,19 @@ wl_pointer_end_grab(struct wl_pointer *pointer) pointer->current_x, pointer->current_y); } +WL_EXPORT void +wl_touch_start_grab(struct wl_touch *touch, struct wl_touch_grab *grab) +{ + touch->grab = grab; + grab->touch = touch; +} + +WL_EXPORT void +wl_touch_end_grab(struct wl_touch *touch) +{ + touch->grab = &touch->default_grab; +} + static void registry_bind(struct wl_client *client, struct wl_resource *resource, uint32_t name, diff --git a/src/wayland-server.h b/src/wayland-server.h index 0a4dcc23..3357105d 100644 --- a/src/wayland-server.h +++ b/src/wayland-server.h @@ -226,6 +226,29 @@ struct wl_keyboard_grab { uint32_t key; }; +struct wl_touch_grab; +struct wl_touch_grab_interface { + void (*down)(struct wl_touch_grab *grab, + uint32_t time, + int touch_id, + wl_fixed_t sx, + wl_fixed_t sy); + void (*up)(struct wl_touch_grab *grab, + uint32_t time, + int touch_id); + void (*motion)(struct wl_touch_grab *grab, + uint32_t time, + int touch_id, + wl_fixed_t sx, + wl_fixed_t sy); +}; + +struct wl_touch_grab { + const struct wl_touch_grab_interface *interface; + struct wl_touch *touch; + struct wl_surface *focus; +}; + struct wl_data_offer { struct wl_resource resource; struct wl_data_source *source; @@ -301,6 +324,13 @@ struct wl_touch { struct wl_resource *focus_resource; struct wl_listener focus_listener; uint32_t focus_serial; + struct wl_signal focus_signal; + + struct wl_touch_grab *grab; + struct wl_touch_grab default_grab; + wl_fixed_t grab_x, grab_y; + uint32_t grab_serial; + uint32_t grab_time; }; struct wl_seat { @@ -410,6 +440,11 @@ void wl_touch_init(struct wl_touch *touch); void wl_touch_release(struct wl_touch *touch); +void +wl_touch_start_grab(struct wl_touch *device, + struct wl_touch_grab *grab); +void +wl_touch_end_grab(struct wl_touch *touch); void wl_data_device_set_keyboard_focus(struct wl_seat *seat);