From d14883ffb11190a0d372960e09ab900cc9e143ec Mon Sep 17 00:00:00 2001 From: Taekyun Kim Date: Wed, 16 Sep 2015 14:04:40 +0900 Subject: [PATCH] pepper: Support for input grab Grab is a set of input event handlers for doing operations such as pointer driven move, resize or something like navigating between windows. Change-Id: I7b5ea467ea06e43dcd9620299724abe1a746615c --- src/lib/pepper/keyboard.c | 17 +++++++++++++++ src/lib/pepper/pepper-internal.h | 21 +++++++++++++----- src/lib/pepper/pepper.h | 47 ++++++++++++++++++++++++++++++++++++++++ src/lib/pepper/pointer.c | 21 ++++++++++++++++++ src/lib/pepper/touch.c | 17 +++++++++++++++ 5 files changed, 117 insertions(+), 6 deletions(-) diff --git a/src/lib/pepper/keyboard.c b/src/lib/pepper/keyboard.c index 3bae218..f8bddc6 100644 --- a/src/lib/pepper/keyboard.c +++ b/src/lib/pepper/keyboard.c @@ -26,6 +26,9 @@ pepper_keyboard_create(pepper_seat_t *seat) void pepper_keyboard_destroy(pepper_keyboard_t *keyboard) { + if (keyboard->grab) + keyboard->grab->cancel(keyboard, keyboard->data); + pepper_input_fini(&keyboard->input); free(keyboard); } @@ -112,3 +115,17 @@ pepper_keyboard_send_modifiers(pepper_keyboard_t *keyboard, uint32_t depressed, wl_keyboard_send_modifiers(resource, serial, depressed, latched, locked, group); } } + +PEPPER_API void +pepper_keyboard_start_grab(pepper_keyboard_t *keyboard, pepper_keyboard_grab_t *grab, void *data) +{ + keyboard->grab = grab; + keyboard->data = data; +} + +PEPPER_API void +pepper_keyboard_end_grab(pepper_keyboard_t *keyboard) +{ + /* TODO: switch back to default grab. */ + keyboard->grab = NULL; +} diff --git a/src/lib/pepper/pepper-internal.h b/src/lib/pepper/pepper-internal.h index 48b72c3..665e62f 100644 --- a/src/lib/pepper/pepper-internal.h +++ b/src/lib/pepper/pepper-internal.h @@ -233,8 +233,11 @@ pepper_input_set_focus(pepper_input_t *input, pepper_view_t *view); struct pepper_pointer { - pepper_object_t base; - pepper_input_t input; + pepper_object_t base; + pepper_input_t input; + + pepper_pointer_grab_t *grab; + void *data; }; pepper_pointer_t * @@ -248,8 +251,11 @@ pepper_pointer_bind_resource(struct wl_client *client, struct wl_resource *resou struct pepper_keyboard { - pepper_object_t base; - pepper_input_t input; + pepper_object_t base; + pepper_input_t input; + + pepper_keyboard_grab_t *grab; + void *data; }; pepper_keyboard_t * @@ -263,8 +269,11 @@ pepper_keyboard_bind_resource(struct wl_client *client, struct wl_resource *reso struct pepper_touch { - pepper_object_t base; - pepper_input_t input; + pepper_object_t base; + pepper_input_t input; + + pepper_touch_grab_t *grab; + void *data; }; pepper_touch_t * diff --git a/src/lib/pepper/pepper.h b/src/lib/pepper/pepper.h index 0fd0b99..aef2aa8 100644 --- a/src/lib/pepper/pepper.h +++ b/src/lib/pepper/pepper.h @@ -35,6 +35,10 @@ typedef void (*pepper_event_callback_t)(pepper_event_listener_t *listener, peppe typedef struct pepper_input_event pepper_input_event_t; +typedef struct pepper_pointer_grab pepper_pointer_grab_t; +typedef struct pepper_keyboard_grab pepper_keyboard_grab_t; +typedef struct pepper_touch_grab pepper_touch_grab_t; + struct pepper_output_geometry { int32_t x; @@ -283,6 +287,16 @@ PEPPER_API const char * pepper_input_device_get_property(pepper_input_device_t *device, const char *key); /* Pointer. */ +struct pepper_pointer_grab +{ + void (*focus)(pepper_pointer_t *pointer, void *data); + void (*motion)(pepper_pointer_t *pointer, void *data, uint32_t time, double x, double y); + void (*button)(pepper_pointer_t *pointer, void *data, uint32_t time, uint32_t button, + uint32_t state); + void (*axis)(pepper_pointer_t *pointer, void *data, uint32_t time, uint32_t axis, double value); + void (*cancel)(pepper_pointer_t *pointer, void *data); +}; + PEPPER_API void pepper_pointer_set_position(pepper_pointer_t *pointer, int32_t x, int32_t y); @@ -310,7 +324,19 @@ pepper_pointer_send_button(pepper_pointer_t *pointer, uint32_t time, uint32_t bu PEPPER_API void pepper_pointer_send_axis(pepper_pointer_t *pointer, uint32_t time, uint32_t axis, double value); +PEPPER_API void +pepper_pointer_start_grab(pepper_pointer_t *pointer, pepper_pointer_grab_t *grab, void *data); + +PEPPER_API void +pepper_pointer_end_grab(pepper_pointer_t *pointer); + /* Keyboard. */ +struct pepper_keyboard_grab +{ + void (*key)(pepper_keyboard_t *keyboard, void *data, uint32_t time, uint32_t key, uint32_t state); + void (*cancel)(pepper_keyboard_t *keyboard, void *data); +}; + PEPPER_API void pepper_keyboard_set_focus(pepper_keyboard_t *keyboard, pepper_view_t *focus); @@ -330,7 +356,22 @@ PEPPER_API void pepper_keyboard_send_modifiers(pepper_keyboard_t *keyboard, uint32_t depressed, uint32_t latched, uint32_t locked, uint32_t group); +PEPPER_API void +pepper_keyboard_start_grab(pepper_keyboard_t *keyboard, pepper_keyboard_grab_t *grab, void *data); + +PEPPER_API void +pepper_keyboard_end_grab(pepper_keyboard_t *keyboard); + /* Touch. */ +struct pepper_touch_grab +{ + void (*down)(pepper_touch_t *touch, uint32_t time, int32_t id, double x, double y); + void (*up)(pepper_touch_t *touch, uint32_t time, uint32_t id); + void (*motion)(pepper_touch_t *touch, uint32_t time, uint32_t id, double x, double y); + void (*frame)(pepper_touch_t *touch); + void (*cancel)(pepper_touch_t *touch); +}; + PEPPER_API void pepper_touch_set_focus(pepper_touch_t *touch, pepper_view_t *focus); @@ -352,6 +393,12 @@ pepper_touch_send_frame(pepper_touch_t *touch); PEPPER_API void pepper_touch_send_cancel(pepper_touch_t *touch); +PEPPER_API void +pepper_touch_start_grab(pepper_touch_t *touch, pepper_touch_grab_t *grab, void *data); + +PEPPER_API void +pepper_touch_end_grab(pepper_touch_t *touch); + /* Surface. */ PEPPER_API const char * pepper_surface_get_role(pepper_surface_t *surface); diff --git a/src/lib/pepper/pointer.c b/src/lib/pepper/pointer.c index f3caab5..920c802 100644 --- a/src/lib/pepper/pointer.c +++ b/src/lib/pepper/pointer.c @@ -34,6 +34,9 @@ pepper_pointer_create(pepper_seat_t *seat) void pepper_pointer_destroy(pepper_pointer_t *pointer) { + if (pointer->grab) + pointer->grab->cancel(pointer, pointer->data); + pepper_input_fini(&pointer->input); free(pointer); } @@ -137,3 +140,21 @@ pepper_pointer_send_axis(pepper_pointer_t *pointer, uint32_t time, uint32_t axis wl_resource_for_each(resource, &pointer->input.focus_resource_list) wl_pointer_send_axis(resource, time, axis, wl_fixed_from_double(value)); } + +PEPPER_API void +pepper_pointer_start_grab(pepper_pointer_t *pointer, pepper_pointer_grab_t *grab, void *data) +{ + pointer->grab = grab; + pointer->data = data; + + if (grab) + grab->focus(pointer, pointer->data); +} + +PEPPER_API void +pepper_pointer_end_grab(pepper_pointer_t *pointer) +{ + /* TODO: switch back to default grab. */ + pointer->grab = NULL; + pointer->grab->focus(pointer, NULL); +} diff --git a/src/lib/pepper/touch.c b/src/lib/pepper/touch.c index 9c1acad..eda1588 100644 --- a/src/lib/pepper/touch.c +++ b/src/lib/pepper/touch.c @@ -26,6 +26,9 @@ pepper_touch_create(pepper_seat_t *seat) void pepper_touch_destroy(pepper_touch_t *touch) { + if (touch->grab) + touch->grab->cancel(touch); + pepper_input_fini(&touch->input); free(touch); } @@ -109,3 +112,17 @@ pepper_touch_send_cancel(pepper_touch_t *touch) wl_resource_for_each(resource, &touch->input.focus_resource_list) wl_touch_send_cancel(resource); } + +PEPPER_API void +pepper_touch_start_grab(pepper_touch_t *touch, pepper_touch_grab_t *grab, void *data) +{ + touch->grab = grab; + touch->data = data; +} + +PEPPER_API void +pepper_touch_end_grab(pepper_touch_t *touch) +{ + /* TODO: switch back to default grab. */ + touch->grab = NULL; +} -- 2.7.4