From 38c06c3fa8b97194dada71753a82d09fabc3513b Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Thu, 16 Mar 2017 17:02:15 +0900 Subject: [PATCH] Support API eext_gesture_event_dispatch This patch set make eext_guesture_event_dispatch of platform/core/uifw/efl-ext work(https://review.tizen.org/gerrit/#/c/127914/). Change-Id: I64a804d39ba351912a90ba1e4f00faad77d1523a --- src/Makefile.am | 3 +- src/e_dispatch_gesture_event.c | 503 +++++++++++++++++++++++++++++++++++++++++ src/e_dispatch_gesture_event.h | 6 + src/e_mod_main.c | 19 ++ 4 files changed, 530 insertions(+), 1 deletion(-) create mode 100644 src/e_dispatch_gesture_event.c create mode 100644 src/e_dispatch_gesture_event.h diff --git a/src/Makefile.am b/src/Makefile.am index 4d05810..91443ce 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,7 +8,8 @@ pkg_LTLIBRARIES = module.la module_la_SOURCES = \ e_mod_main.c \ e_screen_reader_config.c \ - e_screen_reader_gestures.c + e_screen_reader_gestures.c \ + e_dispatch_gesture_event.c module_la_LIBADD = module_la_CFLAGS = @ENLIGHTENMENT_CFLAGS@ diff --git a/src/e_dispatch_gesture_event.c b/src/e_dispatch_gesture_event.c new file mode 100644 index 0000000..7c3f00d --- /dev/null +++ b/src/e_dispatch_gesture_event.c @@ -0,0 +1,503 @@ +#include "e.h" +#include "e_screen_reader_private.h" +#include "e_dispatch_gesture_event.h" + +#define MOVE_STEP 10 +#define ZOOM_LENGTH 150 +enum +{ + TAP, + SWIPE_RIGHT, + SWIPE_LEFT, + SWIPE_UP, + SWIPE_DOWN, + ZOOM_IN, + ZOOM_OUT, +}; + +typedef struct _TouchInputSequence { + double delay; + void (*dispatch_func)(int type, int x, int y, int device); + int device; +} TouchInputSequence; + +typedef struct _TouchCommand { + int type; + int x, y; + TouchInputSequence *ts; + } TouchCommand; + +static TouchCommand tc; + +static int _move_count = -1; +static int _zw = 0; +static int _zh = 0; + +static void _dispatch_mouse_in_event(int type, int x, int y, int device); +static void _dispatch_mouse_move_event(int type, int x, int y, int device); +static void _dispatch_mouse_down_event(int type, int x, int y, int device); +static void _dispatch_mouse_up_event(int type, int x, int y, int device); +static TouchInputSequence _ts_single_tap[] = { + /* down */ + {0.0, _dispatch_mouse_in_event, 0}, + {0.0, _dispatch_mouse_move_event, 0}, + {0.0, _dispatch_mouse_down_event, 0}, + /* up */ + {0.1, _dispatch_mouse_up_event, 0}, + {-1} +}; + +static TouchInputSequence _ts_swipe[] = { + /* down */ + {0.0, _dispatch_mouse_in_event, 0}, + {0.0, _dispatch_mouse_move_event, 0}, + {0.0, _dispatch_mouse_down_event, 0}, + /* move */ + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 0}, + /* up */ + {0.1, _dispatch_mouse_up_event, 0}, + {-1} +}; + +static TouchInputSequence _ts_zoom[] = { + /* down */ + {0.0, _dispatch_mouse_in_event, 0}, + {0.0, _dispatch_mouse_move_event, 0}, + {0.0, _dispatch_mouse_down_event, 0}, + {0.0, _dispatch_mouse_move_event, 1}, + {0.0, _dispatch_mouse_down_event, 1}, + /* move */ + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + {0.01, _dispatch_mouse_move_event, 0}, + {0.01, _dispatch_mouse_move_event, 1}, + /* up */ + {0.1, _dispatch_mouse_up_event, 0}, + {0.0, _dispatch_mouse_up_event, 1}, + {-1} +}; + +static Ecore_Device * _get_device() +{ + const Eina_List *dev_list = NULL; + const Eina_List *l; + Ecore_Device *dev = NULL; + const char *identifier; + + dev_list = ecore_device_list(); + if (!dev_list) return NULL; + EINA_LIST_FOREACH(dev_list, l, dev) + { + if (!dev) continue; + identifier = ecore_device_identifier_get(dev); + if (!identifier) continue; + + //FIXME: Find right way to get device class + if (ecore_device_class_get(dev) == ECORE_DEVICE_CLASS_TOUCH) + return dev; + } + return NULL; +} + +static void _dispatch_mouse_in_event(int type, int x, int y, int device) +{ + Ecore_Event_Mouse_IO *ev; + + if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_IO)))) return; + + ev->x = x; + ev->y = y; + ev->modifiers = 0; + ev->timestamp = (int)(ecore_time_get() * 1000.0); + ev->window = e_comp->win; + ev->event_window = ev->window; + ev->event_window = 1; + ev->dev = _get_device(); + + ecore_event_add(ECORE_EVENT_MOUSE_IN, ev, NULL, NULL); +} + +static void _dispatch_mouse_move_event(int type, int x, int y, int device) +{ + Ecore_Event_Mouse_Move *ev; + + if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Move)))) return; + + switch(type) + { + case TAP: + break; + + case SWIPE_RIGHT: + _move_count++; + x += (MOVE_STEP * _move_count); + if (x > _zw) x = _zw; + break; + + case SWIPE_LEFT: + _move_count++; + x -= (MOVE_STEP * _move_count); + if (x < 0) x = 0; + break; + + case SWIPE_UP: + _move_count++; + y -= (MOVE_STEP * _move_count); + if (y < 0) y = 0; + break; + + case SWIPE_DOWN: + _move_count++; + y += (MOVE_STEP * _move_count); + if (y > _zh) y = _zh; + break; + + case ZOOM_IN: + if (device == 0) + { + _move_count++; + x -= (MOVE_STEP * _move_count); + if (x < 0) x = 0; + } + else if (device == 1) + { + x += (MOVE_STEP * _move_count); + if (x > _zw) x = _zw; + } + break; + + case ZOOM_OUT: + if (device == 0) + { + _move_count++; + x -= (ZOOM_LENGTH - (MOVE_STEP * _move_count)); + if (x < 0) x = 0; + } + else if (device == 1) + { + x += (ZOOM_LENGTH - (MOVE_STEP * _move_count)); + if (x > _zw) x = _zw; + } + break; + + default: + break; + } + + ev->timestamp = (int)(ecore_time_get() * 1000.0); + ev->x = x; + ev->y = y; + ev->root.x = x; + ev->root.y = y; + ev->modifiers = 0; + ev->multi.x = x; + ev->multi.y = y; + ev->multi.root.x = x; + ev->multi.root.y = y; + ev->multi.device = device; + ev->window = e_comp->win; + ev->event_window = ev->window; + ev->root_window = e_comp->root; + ev->same_screen = 1; + ev->dev = _get_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; + + ecore_event_add(ECORE_EVENT_MOUSE_MOVE, ev, NULL, NULL); +} + +static void _dispatch_mouse_down_event(int type, int x, int y, int device) +{ + Ecore_Event_Mouse_Button *ev; + + if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Button)))) return; + + switch(type) + { + case TAP: + break; + + case SWIPE_RIGHT: + x += (MOVE_STEP * _move_count); + if (x > _zw) x = _zw; + break; + + case SWIPE_LEFT: + x -= (MOVE_STEP * _move_count); + if (x < 0) x = 0; + break; + + case SWIPE_UP: + y -= (MOVE_STEP * _move_count); + if (y < 0) y = 0; + break; + + case SWIPE_DOWN: + y += (MOVE_STEP * _move_count); + if (y > _zh) y = _zh; + break; + + case ZOOM_IN: + if (device == 0) + { + x -= (MOVE_STEP * _move_count); + if (x < 0) x = 0; + } + else if (device == 1) + { + x += (MOVE_STEP * _move_count); + if (x > _zw) x = _zw; + } + break; + + case ZOOM_OUT: + if (device == 0) + { + x -= (ZOOM_LENGTH - (MOVE_STEP * _move_count)); + if (x < 0) x = 0; + } + else if (device == 1) + { + x += (ZOOM_LENGTH - (MOVE_STEP * _move_count)); + if (x > _zw) x = _zw; + } + break; + + default: + break; + } + + ev->buttons = 1; + ev->timestamp = (int)(ecore_time_get() * 1000.0); + ev->x = x; + ev->y = y; + ev->root.x = x; + ev->root.y = y; + ev->modifiers = 0; + ev->double_click = 0; + ev->triple_click = 0; + ev->multi.x = x; + ev->multi.y = y; + ev->multi.root.x = x; + ev->multi.root.y = y; + ev->multi.device = device; + ev->window = e_comp->win; + ev->event_window = ev->window; + ev->root_window = e_comp->root; + ev->same_screen = 1; + ev->dev = _get_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; + + ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, ev, NULL, NULL); +} + +static void _dispatch_mouse_up_event(int type, int x, int y, int device) +{ + Ecore_Event_Mouse_Button *ev; + + if (!(ev = calloc(1, sizeof(Ecore_Event_Mouse_Button)))) return; + + switch(type) + { + case TAP: + break; + + case SWIPE_RIGHT: + x += (MOVE_STEP * _move_count); + if (x > _zw) x = _zw; + break; + + case SWIPE_LEFT: + x -= (MOVE_STEP * _move_count); + if (x < 0) x = 0; + break; + + case SWIPE_UP: + y -= (MOVE_STEP * _move_count); + if (y < 0) y = 0; + break; + + case SWIPE_DOWN: + y += (MOVE_STEP * _move_count); + if (y > _zh) y = _zh; + break; + + case ZOOM_IN: + if (device == 0) + { + x -= (MOVE_STEP * _move_count); + if (x < 0) x = 0; + } + else if (device == 1) + { + x += (MOVE_STEP * _move_count); + if (x > _zw) x = _zw; + } + break; + + case ZOOM_OUT: + if (device == 0) + { + x -= (ZOOM_LENGTH - (MOVE_STEP * _move_count)); + if (x < 0) x = 0; + } + else if (device == 1) + { + x += (ZOOM_LENGTH - (MOVE_STEP * _move_count)); + if (x > _zw) x = _zw; + } + break; + + default: + break; + } + + ev->buttons = 1; + ev->timestamp = (int)(ecore_time_get() * 1000.0); + ev->x = x; + ev->y = y; + ev->root.x = x; + ev->root.y = y; + ev->modifiers = 0; + ev->double_click = 0; + ev->triple_click = 0; + ev->multi.x = x; + ev->multi.y = y; + ev->multi.root.x = x; + ev->multi.root.y = y; + ev->multi.device = device; + ev->window = e_comp->win; + ev->event_window = ev->window; + ev->root_window = e_comp->root; + ev->same_screen = 1; + ev->dev = _get_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; + + ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_UP, ev, NULL, NULL); +} + + +Eina_Bool +_touch_sequnece_timer(void *data) +{ + TouchCommand *tc = data; + + if (tc == NULL || tc->ts->delay < 0) + { + _move_count = -1; + return ECORE_CALLBACK_CANCEL; + } + + tc->ts->dispatch_func(tc->type, tc->x, tc->y, tc->ts->device); + + tc->ts++; + ecore_timer_add(tc->ts->delay, _touch_sequnece_timer, tc); + return ECORE_CALLBACK_CANCEL; +} + +void _e_dispatch_gesture_event(int type, int x, int y) +{ + E_Zone *zone; + + if (_move_count >= 0) return; + _move_count++; + + zone = e_zone_current_get(); + if (zone) + { + _zw = zone->w; + _zh = zone->h; + } + else + { + ERROR("Fail to find zone"); + _move_count = -1; + return; + } + + if (x < 0 || y < 0 || x > _zw || y > _zh) + { + ERROR("Invalid value: %d, %d", x, y); + _move_count = -1; + return; + } + + tc.type = type; + tc.x = x; + tc.y = y; + + switch(type) + { + case TAP: + tc.ts = _ts_single_tap; + break; + + case SWIPE_LEFT: + case SWIPE_RIGHT: + case SWIPE_UP: + case SWIPE_DOWN: + tc.ts = _ts_swipe; + break; + + case ZOOM_IN: + case ZOOM_OUT: + tc.ts = _ts_zoom; + break; + + default: + ERROR("Invalid type: %d", type); + _move_count = -1; + return; + } + + ecore_timer_add(tc.ts->delay, _touch_sequnece_timer, &tc); +} diff --git a/src/e_dispatch_gesture_event.h b/src/e_dispatch_gesture_event.h new file mode 100644 index 0000000..07a687b --- /dev/null +++ b/src/e_dispatch_gesture_event.h @@ -0,0 +1,6 @@ +#ifndef E_DISPATCH_GESTURE_EVENT_H_ +#define E_DISPATCH_GESTURE_EVENT_H_ + +void _e_dispatch_gesture_event(int type, int x, int y); + +#endif /* E_DISPATCH_GESTURE_EVENT_H_ */ diff --git a/src/e_mod_main.c b/src/e_mod_main.c index 9cbb5a2..c830819 100644 --- a/src/e_mod_main.c +++ b/src/e_mod_main.c @@ -4,6 +4,7 @@ #include #include #include +#include #define E_A11Y_SERVICE_BUS_NAME "org.enlightenment.wm-screen-reader" #define E_A11Y_SERVICE_NAVI_IFC_NAME "org.tizen.GestureNavigation" @@ -36,6 +37,7 @@ static Eldbus_Message *_highlighted_object_info(const Eldbus_Service_Interface * static Eldbus_Message *_is_screen_reader_support(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg); static Eldbus_Message *_is_selection_mode(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg); static Eldbus_Message *_object_needs_scroll_gesture(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg); +static Eldbus_Message *_dispatch_gesture_event(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg); static const Eldbus_Method methods[] = { { "ScreenReaderEnabled", ELDBUS_ARGS({"b", "bool"}), ELDBUS_ARGS({"b", "bool"}), @@ -56,6 +58,9 @@ static const Eldbus_Method methods[] = { { "ObjectNeedsScrollGesture", ELDBUS_ARGS({"i", "int"}, {"i", "int"}), NULL, _object_needs_scroll_gesture }, + { "DispatchGestureEvent", ELDBUS_ARGS({"i", "int"}, {"i", "int"}, {"i", "int"}), NULL, + _dispatch_gesture_event + }, { } }; @@ -328,6 +333,20 @@ _object_needs_scroll_gesture(const Eldbus_Service_Interface *iface, const Eldbus return NULL; } +static Eldbus_Message * +_dispatch_gesture_event(const Eldbus_Service_Interface *iface, const Eldbus_Message *msg) +{ + int type, x, y; + if (eldbus_message_arguments_get(msg, "iii", &type, &x, &y)) + { + _e_dispatch_gesture_event(type, x, y); + } + else + ERROR("eldbus_message_arguments_get() error\n"); + + return NULL; +} + static int _fetch_a11y_bus_address(void) { -- 2.7.4