From: JengHyun Kang Date: Wed, 20 Jan 2016 11:45:55 +0000 (+0900) Subject: ecore_input/wayland: Process extra touch events X-Git-Tag: submit/tizen/20160126.071710~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F19%2F57919%2F1;p=platform%2Fupstream%2Fefl.git ecore_input/wayland: Process extra touch events - Get touch axis information such radius_x, radius_y, angle and pressure Signed-off-by: Duna Oh Change-Id: I2fc6763fa27be3b56ea95e17c04d7ce8605aeb80 --- diff --git a/src/lib/ecore_input_evas/ecore_input_evas.c b/src/lib/ecore_input_evas/ecore_input_evas.c index f51a0112ad..b604921115 100644 --- a/src/lib/ecore_input_evas/ecore_input_evas.c +++ b/src/lib/ecore_input_evas/ecore_input_evas.c @@ -527,11 +527,49 @@ _ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press pr { ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers); if (press == ECORE_DOWN) - evas_event_feed_mouse_down(lookup->evas, e->buttons, flags, - e->timestamp, NULL); + { + if (evas_device_class_get(dev) & ECORE_DEVICE_TOUCH) + { + if (lookup->down_multi) + lookup->down_multi(lookup->window, e->multi.device, + e->x, e->y, e->multi.radius, + e->multi.radius_x, e->multi.radius_y, + e->multi.pressure, e->multi.angle, + e->multi.x, e->multi.y, flags, + e->timestamp); + else + evas_event_input_multi_down(lookup->evas, e->multi.device, + e->x, e->y, e->multi.radius, + e->multi.radius_x, e->multi.radius_y, + e->multi.pressure, e->multi.angle, + e->multi.x, e->multi.y, flags, + e->timestamp, NULL); + } + evas_event_feed_mouse_down(lookup->evas, e->buttons, flags, + e->timestamp, NULL); + } else - evas_event_feed_mouse_up(lookup->evas, e->buttons, flags, - e->timestamp, NULL); + { + if (evas_device_class_get(dev) & ECORE_DEVICE_TOUCH) + { + if (lookup->up_multi) + lookup->up_multi(lookup->window, e->multi.device, + e->x, e->y, e->multi.radius, + e->multi.radius_x, e->multi.radius_y, + e->multi.pressure, e->multi.angle, + e->multi.x, e->multi.y, flags, + e->timestamp); + else + evas_event_input_multi_up(lookup->evas, e->multi.device, + e->x, e->y, e->multi.radius, + e->multi.radius_x, e->multi.radius_y, + e->multi.pressure, e->multi.angle, + e->multi.x, e->multi.y, flags, + e->timestamp, NULL); + } + evas_event_feed_mouse_up(lookup->evas, e->buttons, flags, + e->timestamp, NULL); + } } else { @@ -591,6 +629,24 @@ ecore_event_evas_mouse_move(void *data EINA_UNUSED, int type EINA_UNUSED, void * { _ecore_event_evas_push_mouse_move(e); ecore_event_evas_modifier_lock_update(lookup->evas, e->modifiers); + + if (evas_device_class_get(dev) & ECORE_DEVICE_TOUCH) + { + if (lookup->move_multi) + lookup->move_multi(lookup->window, e->multi.device, + e->x, e->y, e->multi.radius, + e->multi.radius_x, e->multi.radius_y, + e->multi.pressure, e->multi.angle, + e->multi.x, e->multi.y, e->timestamp); + else + evas_event_input_multi_move(lookup->evas, e->multi.device, + e->x, e->y, e->multi.radius, + e->multi.radius_x, e->multi.radius_y, + e->multi.pressure, e->multi.angle, + e->multi.x, e->multi.y, e->timestamp, + NULL); + } + if (lookup->move_mouse) lookup->move_mouse(lookup->window, e->x, e->y, e->timestamp); else diff --git a/src/lib/ecore_wayland/ecore_wl_input.c b/src/lib/ecore_wayland/ecore_wl_input.c index cbe5834a9a..8ae539c59e 100644 --- a/src/lib/ecore_wayland/ecore_wl_input.c +++ b/src/lib/ecore_wayland/ecore_wl_input.c @@ -1191,6 +1191,41 @@ _ecore_wl_input_cb_keyboard_leave(void *data, struct wl_keyboard *keyboard EINA_ _ecore_wl_input_focus_out_send(input, win, input->timestamp); } +static void +_ecore_wl_input_touch_axis_process(Ecore_Wl_Input *input, int id) +{ + if (id >= ECORE_WL_TOUCH_MAX) + return; + + if (input->last_radius_x) + { + input->touch_axis[id].radius_x = input->last_radius_x; + input->last_radius_x = 0.0; + } + if (input->last_radius_y) + { + input->touch_axis[id].radius_y = input->last_radius_y; + input->last_radius_y = 0.0; + } + if (input->last_pressure) + { + input->touch_axis[id].pressure = input->last_pressure; + input->last_pressure = 0.0; + } + if (input->last_angle) + { + input->touch_axis[id].angle = input->last_angle; + input->last_angle = 0.0; + } +} + +static double +_ecore_wl_input_touch_radius_calc(double x, double y) +{ +#define PI 3.14159265358979323846 + return x*y*PI; +} + static void _ecore_wl_input_cb_touch_down(void *data, struct wl_touch *touch EINA_UNUSED, unsigned int serial, unsigned int timestamp, struct wl_surface *surface, int id, wl_fixed_t x, wl_fixed_t y) { @@ -1208,6 +1243,8 @@ _ecore_wl_input_cb_touch_down(void *data, struct wl_touch *touch EINA_UNUSED, un input->display->serial = serial; input->sx = wl_fixed_to_int(x); input->sy = wl_fixed_to_int(y); + _ecore_wl_input_touch_axis_process(input, id); + if (input->touch_focus != win) { input->touch_focus = win; @@ -1263,6 +1300,7 @@ _ecore_wl_input_cb_touch_motion(void *data, struct wl_touch *touch EINA_UNUSED, input->timestamp = timestamp; input->sx = wl_fixed_to_int(x); input->sy = wl_fixed_to_int(y); + _ecore_wl_input_touch_axis_process(input, id); _ecore_wl_input_mouse_move_send(input, input->touch_focus, timestamp, id); } @@ -1346,11 +1384,24 @@ _ecore_wl_input_mouse_move_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, uns ev->root.y = input->sy; ev->modifiers = input->modifiers; ev->multi.device = device; - ev->multi.radius = 1; - ev->multi.radius_x = 1; - ev->multi.radius_y = 1; - ev->multi.pressure = 1.0; - ev->multi.angle = 0.0; + if (device >= ECORE_WL_TOUCH_MAX) + { + ev->multi.radius = 1.0; + ev->multi.radius_x = 1.0; + ev->multi.radius_y = 1.0; + ev->multi.pressure = 1.0; + ev->multi.angle = 0.0; + } + else + { + ev->multi.radius = + _ecore_wl_input_touch_radius_calc(input->touch_axis[device].radius_x, + input->touch_axis[device].radius_y); + ev->multi.radius_x = input->touch_axis[device].radius_x; + ev->multi.radius_y = input->touch_axis[device].radius_y; + ev->multi.pressure = input->touch_axis[device].pressure; + ev->multi.angle = input->touch_axis[device].angle; + } ev->multi.x = input->sx; ev->multi.y = input->sy; ev->multi.root.x = input->sx; @@ -1527,11 +1578,24 @@ _ecore_wl_input_mouse_down_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, int } ev->multi.device = device; - ev->multi.radius = 1; - ev->multi.radius_x = 1; - ev->multi.radius_y = 1; - ev->multi.pressure = 1.0; - ev->multi.angle = 0.0; + if (device >= ECORE_WL_TOUCH_MAX) + { + ev->multi.radius = 1.0; + ev->multi.radius_x = 1.0; + ev->multi.radius_y = 1.0; + ev->multi.pressure = 1.0; + ev->multi.angle = 0.0; + } + else + { + ev->multi.radius = + _ecore_wl_input_touch_radius_calc(input->touch_axis[device].radius_x, + input->touch_axis[device].radius_y); + ev->multi.radius_x = input->touch_axis[device].radius_x; + ev->multi.radius_y = input->touch_axis[device].radius_y; + ev->multi.pressure = input->touch_axis[device].pressure; + ev->multi.angle = input->touch_axis[device].angle; + } ev->multi.x = input->sx; ev->multi.y = input->sy; ev->multi.root.x = input->sx; @@ -1613,6 +1677,13 @@ _ecore_wl_input_mouse_up_send(Ecore_Wl_Input *input, Ecore_Wl_Window *win, int d ev->multi.root.x = input->sx; ev->multi.root.y = input->sy; ev->dev_name = input->last_device_name; + if (device < ECORE_WL_TOUCH_MAX) + { + input->touch_axis[device].radius_x = 1.0; + input->touch_axis[device].radius_y = 1.0; + input->touch_axis[device].pressure = 1.0; + input->touch_axis[device].angle = 0; + } if (win) { @@ -1859,7 +1930,28 @@ _ecore_wl_input_device_cb_event_device(void *data, struct tizen_input_device *ti } static void -_ecore_wl_input_device_cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type EINA_UNUSED, wl_fixed_t value EINA_UNUSED) +_ecore_wl_input_device_cb_axis(void *data EINA_UNUSED, struct tizen_input_device *tizen_input_device EINA_UNUSED, uint32_t axis_type, wl_fixed_t value) { + Ecore_Wl_Input *input = _ecore_wl_disp->input; + double dvalue = wl_fixed_to_double(value); + + switch (axis_type) + { + case TIZEN_INPUT_DEVICE_AXIS_TYPE_RADIUS_X: + input->last_radius_x = dvalue; + break; + case TIZEN_INPUT_DEVICE_AXIS_TYPE_RADIUS_Y: + input->last_radius_y = dvalue; + break; + case TIZEN_INPUT_DEVICE_AXIS_TYPE_PRESSURE: + input->last_pressure = dvalue; + break; + case TIZEN_INPUT_DEVICE_AXIS_TYPE_ANGLE: + input->last_angle = dvalue; + break; + default: + WRN("Invalid type(%d) is ignored.\n", axis_type); + break; + } return; } diff --git a/src/lib/ecore_wayland/ecore_wl_private.h b/src/lib/ecore_wayland/ecore_wl_private.h index 706b78f35b..624b0378c9 100644 --- a/src/lib/ecore_wayland/ecore_wl_private.h +++ b/src/lib/ecore_wayland/ecore_wl_private.h @@ -62,7 +62,20 @@ extern int _ecore_wl_log_dom; # endif # define ECORE_WL_DEFAULT_CURSOR_SIZE 32 +# ifndef ECORE_WL_TOUCH_MAX +# define ECORE_WL_TOUCH_MAX 10 +# endif + typedef struct _Ecore_Wl_Display Ecore_Wl_Display; +typedef struct _Ecore_Wl_Touch_Axis Ecore_Wl_Touch_Axis; + +struct _Ecore_Wl_Touch_Axis +{ + double radius_x; + double radius_y; + double pressure; + double angle; +}; struct _Ecore_Wl_Display { @@ -264,6 +277,11 @@ struct _Ecore_Wl_Input unsigned int modifiers; unsigned int pointer_enter_serial; int sx, sy; + Ecore_Wl_Touch_Axis touch_axis[ECORE_WL_TOUCH_MAX]; + double last_radius_x; + double last_radius_y; + double last_pressure; + double last_angle; Ecore_Wl_Window *grab; unsigned int grab_button;