2 #include "e_mod_main.h"
5 #ifdef _E_GESTURE_DEBUG_
7 _e_gesture_event_type_print(int type)
9 if (type == ECORE_EVENT_KEY_DOWN) return "KeyDown";
10 else if (type == ECORE_EVENT_KEY_UP) return "KeyUp";
11 else if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN) return "MouseDown";
12 else if (type == ECORE_EVENT_MOUSE_BUTTON_UP) return "MouseUp";
13 else if (type == ECORE_EVENT_MOUSE_MOVE) return "MouseMove";
14 else return "Unknown";
18 _e_gesture_event_print(void)
21 E_Gesture_Event_Info *data;
24 EINA_LIST_FOREACH(gesture->event_queue, l, data)
26 GTERR("[%d]%s event is queue\n", ++c, _e_gesture_event_type_print(data->type));
29 #endif //_E_GESTURE_DEBUG_
31 static void _e_gesture_send_edge_drag(int fingers, int x, int y, int edge, int mode);
34 _e_gesture_event_queue(int type, void *event)
36 E_Gesture_Event_Info *e_info = NULL;
37 e_info = E_NEW(E_Gesture_Event_Info, 1);
38 EINA_SAFETY_ON_NULL_RETURN(e_info);
40 if (type == ECORE_EVENT_KEY_DOWN ||
41 type == ECORE_EVENT_KEY_UP)
43 e_info->event = E_NEW(Ecore_Event_Key, 1);
46 memcpy(e_info->event, event, sizeof(Ecore_Event_Key));
48 else if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN ||
49 type == ECORE_EVENT_MOUSE_BUTTON_UP)
51 e_info->event = E_NEW(Ecore_Event_Mouse_Button, 1);
54 memcpy(e_info->event, event, sizeof(Ecore_Event_Mouse_Button));
56 else if (type == ECORE_EVENT_MOUSE_MOVE)
58 e_info->event = E_NEW(Ecore_Event_Mouse_Move, 1);
61 memcpy(e_info->event, event, sizeof(Ecore_Event_Mouse_Move));
66 gesture->event_queue = eina_list_append(gesture->event_queue, e_info);
73 E_FREE(e_info->event);
78 _e_gesture_event_flush(void)
80 Eina_List *l, *l_next;
81 E_Gesture_Event_Info *data;
83 if (gesture->event_state == E_GESTURE_EVENT_STATE_IGNORE ||
84 gesture->gesture_events.recognized_gesture) return;
85 if (gesture->gesture_filter != E_GESTURE_TYPE_ALL) return;
87 gesture->event_state = E_GESTURE_EVENT_STATE_PROPAGATE;
89 EINA_LIST_FOREACH_SAFE(gesture->event_queue, l, l_next, data)
91 if (data->type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
93 if (!e_devicemgr_is_blocking_event(ECORE_DEVICE_CLASS_TOUCH))
94 ecore_event_evas_mouse_button_down(NULL, ECORE_EVENT_MOUSE_BUTTON_DOWN, data->event);
96 else if (data->type == ECORE_EVENT_MOUSE_BUTTON_UP)
98 if (!e_devicemgr_is_blocking_event(ECORE_DEVICE_CLASS_TOUCH))
99 ecore_event_evas_mouse_button_up(NULL, ECORE_EVENT_MOUSE_BUTTON_UP, data->event);
101 else if (data->type == ECORE_EVENT_MOUSE_MOVE)
103 if (!e_devicemgr_is_blocking_event(ECORE_DEVICE_CLASS_TOUCH))
104 ecore_event_evas_mouse_move(NULL, ECORE_EVENT_MOUSE_MOVE, data->event);
106 else if (data->type == ECORE_EVENT_KEY_DOWN)
108 if (!e_devicemgr_is_blocking_event(ECORE_DEVICE_CLASS_KEYBOARD))
109 ecore_event_evas_key_down(NULL, ECORE_EVENT_KEY_DOWN, data->event);
111 else if (data->type == ECORE_EVENT_KEY_UP)
113 if (!e_devicemgr_is_blocking_event(ECORE_DEVICE_CLASS_KEYBOARD))
114 ecore_event_evas_key_up(NULL, ECORE_EVENT_KEY_UP, data->event);
118 gesture->event_queue = eina_list_remove_list(gesture->event_queue, l);
123 _e_gesture_event_drop(void)
125 Eina_List *l, *l_next;
126 E_Gesture_Event_Info *data;
128 gesture->event_state = E_GESTURE_EVENT_STATE_IGNORE;
130 EINA_LIST_FOREACH_SAFE(gesture->event_queue, l, l_next, data)
134 gesture->event_queue = eina_list_remove_list(gesture->event_queue, l);
139 _e_gesture_util_center_axis_get(int num_finger, int *x, int *y)
142 int calc_x = 0, calc_y = 0;
151 for (i = 1; i <= num_finger; i++)
153 calc_x += gesture->gesture_events.base_point[i].axis.x;
154 calc_y += gesture->gesture_events.base_point[i].axis.y;
157 calc_x = (int)(calc_x / num_finger);
158 calc_y = (int)(calc_y / num_finger);
165 _e_gesture_util_distance_get(int x1, int y1, int x2, int y2)
169 distance = sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
175 _e_gesture_util_distances_get(int num_finger)
177 int i, cx = 0, cy = 0;
178 double distance = 0.0;
180 _e_gesture_util_center_axis_get(num_finger, &cx, &cy);
182 for (i = 1; i <= num_finger; i++)
184 distance += _e_gesture_util_distance_get(cx, cy,
185 gesture->gesture_events.base_point[i].axis.x,
186 gesture->gesture_events.base_point[i].axis.y);
193 _e_gesture_util_angle_get(int x1, int y1, int x2, int y2)
195 double angle, xx, yy;
200 angle = atan2(yy, xx);
201 if ((x1 > x2) && (y1 > y2)) angle = angle + M_PI_2;
202 else if ((x2 > x1) && (y2 > y1)) angle = angle + M_PI_2;
204 angle = RAD2DEG(angle);
209 _e_gesture_util_rect_get(int finger, int *x1, int *y1, int *x2, int *y2)
213 *x1 = *x2 = gesture->gesture_events.base_point[1].axis.x;
214 *y1 = *y2 = gesture->gesture_events.base_point[1].axis.y;
216 for (i = 2; i < finger + 1; i++)
218 if (gesture->gesture_events.base_point[i].axis.x < *x1)
219 *x1 = gesture->gesture_events.base_point[i].axis.x;
220 else if (gesture->gesture_events.base_point[i].axis.x > *x2)
221 *x2 = gesture->gesture_events.base_point[i].axis.x;
223 if (gesture->gesture_events.base_point[i].axis.y < *y1)
224 *y1 = gesture->gesture_events.base_point[i].axis.y;
225 else if (gesture->gesture_events.base_point[i].axis.y > *y2)
226 *y2 = gesture->gesture_events.base_point[i].axis.y;
231 _e_gesture_util_rect_center_axis_get(Rect rect, int *cx, int *cy)
233 *cx = (int)((rect.x1 + rect.x2) / 2);
234 *cy = (int)((rect.y1 + rect.y2) / 2);
237 static struct wl_resource *
238 _e_gesture_util_eclient_surface_get(E_Client *ec)
240 if (!ec) return NULL;
241 if (e_object_is_del(E_OBJECT(ec))) return NULL;
242 if (!ec->comp_data) return NULL;
244 return ec->comp_data->surface;
248 _e_gesture_edge_swipe_cancel(void)
250 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
252 if (edge_swipes->start_timer)
254 ecore_timer_del(edge_swipes->start_timer);
255 edge_swipes->start_timer = NULL;
257 if (edge_swipes->done_timer)
259 ecore_timer_del(edge_swipes->done_timer);
260 edge_swipes->done_timer = NULL;
263 edge_swipes->base.enabled_finger = 0x0;
264 edge_swipes->base.edge = E_GESTURE_EDGE_NONE;
266 gesture->gesture_filter |= E_GESTURE_TYPE_EDGE_SWIPE;
267 gesture->gesture_events.recognized_gesture &= ~E_GESTURE_TYPE_EDGE_SWIPE;
271 _e_gesture_keyevent_free(void *data EINA_UNUSED, void *ev)
273 Ecore_Event_Key *e = ev;
275 eina_stringshare_del(e->keyname);
276 eina_stringshare_del(e->key);
277 eina_stringshare_del(e->compose);
279 if (e->dev) ecore_device_unref(e->dev);
284 /* Optional: This function is currently used to generate back key.
285 * But how about change this function to generate every key?
286 * _e_gesture_send_key(char *keyname, Eina_Bool pressed)
289 _e_gesture_send_back_key(Eina_Bool pressed)
292 E_Gesture_Conf_Edd *conf = gesture->config->conf;
293 E_Keyrouter_Event_Data *key_data;
295 ev = E_NEW(Ecore_Event_Key, 1);
296 EINA_SAFETY_ON_NULL_RETURN(ev);
297 key_data = E_NEW(E_Keyrouter_Event_Data, 1);
298 EINA_SAFETY_ON_NULL_GOTO(key_data, failed);
300 ev->key = (char *)eina_stringshare_add("XF86Back");
301 ev->keyname = (char *)eina_stringshare_add(ev->key);
302 ev->compose = (char *)eina_stringshare_add(ev->key);
303 ev->timestamp = e_util_timestamp_get();
305 ev->keycode = conf->edge_swipe.back_key;
306 ev->dev = ecore_device_ref(gesture->device.kbd_device);
307 ev->window = e_comp->ee_win;
310 if (!e_input_thread_mode_get())
312 ecore_event_add(pressed ? ECORE_EVENT_KEY_DOWN : ECORE_EVENT_KEY_UP, ev, _e_gesture_keyevent_free, NULL);
316 E_Input_Event_Source *input_event_source = e_input_event_source_get();
317 if (input_event_source)
318 e_input_event_add(input_event_source, pressed ? ECORE_EVENT_KEY_DOWN : ECORE_EVENT_KEY_UP, ev, _e_gesture_keyevent_free, NULL);
320 _e_gesture_keyevent_free(NULL, ev);
330 _e_gesture_send_touch_cancel(void)
332 Ecore_Event_Mouse_Button *ev_cancel;
334 ev_cancel = E_NEW(Ecore_Event_Mouse_Button, 1);
335 EINA_SAFETY_ON_NULL_RETURN(ev_cancel);
337 ev_cancel->timestamp = e_util_timestamp_get();
338 ev_cancel->same_screen = 1;
340 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_CANCEL, ev_cancel, NULL, NULL);
344 _e_gesture_send_edge_swipe(int fingers, int x, int y, int edge)
346 E_Gesture_Conf_Edd *conf = gesture->config->conf;
348 E_Gesture_Event_Edge_Finger_Edge *edata;
349 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
351 E_Event_Gesture_Edge_Swipe *ev_swipe;
353 if (gesture->gesture_events.event_keep)
355 _e_gesture_event_drop();
358 _e_gesture_send_touch_cancel();
360 if (conf->edge_swipe.default_enable_back &&
361 edge == E_GESTURE_EDGE_TOP)
363 _e_gesture_send_back_key(EINA_TRUE);
364 _e_gesture_send_back_key(EINA_FALSE);
368 if (edge == E_GESTURE_EDGE_TOP ||
369 edge == E_GESTURE_EDGE_BOTTOM)
373 else if (edge == E_GESTURE_EDGE_RIGHT ||
374 edge == E_GESTURE_EDGE_LEFT)
379 EINA_LIST_FOREACH(edge_swipes->base.fingers[fingers].edge[edge], l, edata)
381 if (bp >= edata->sp && bp <= edata->ep)
383 GTINF("Send edge_swipe gesture (fingers: %d, edge: %d) to client: %p\n", fingers, edge, edata->client);
384 if (edata->client == E_GESTURE_SERVER_CLIENT)
386 ev_swipe = E_NEW(E_Event_Gesture_Edge_Swipe, 1);
387 EINA_SAFETY_ON_NULL_RETURN(ev_swipe);
389 ev_swipe->mode = E_GESTURE_MODE_DONE;
390 ev_swipe->edge = edge;
391 ev_swipe->fingers = fingers;
394 ecore_event_add(E_EVENT_GESTURE_EDGE_SWIPE, ev_swipe, NULL, NULL);
397 tizen_gesture_send_edge_swipe(edata->res, E_GESTURE_MODE_DONE, fingers, x, y, edge);
403 _e_gesture_edge_swipe_cancel();
406 static E_Gesture_Event_State
407 _e_gesture_process_device_add(void *event)
409 return e_gesture_device_add(event);
412 static E_Gesture_Event_State
413 _e_gesture_process_device_del(void *event)
415 return e_gesture_device_del(event);
419 _e_gesture_event_edge_check(E_Gesture_Event_Edge_Finger *fingers, int type, unsigned int edge)
421 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
422 E_Gesture_Conf_Edd *conf = gesture->config->conf;
424 E_Gesture_Event_Edge_Finger_Edge *edata;
427 if (type == E_GESTURE_TYPE_EDGE_SWIPE)
429 if ((conf->edge_swipe.default_enable_back) &&
430 (edge == E_GESTURE_EDGE_TOP ||
431 ((edge_swipes->combined_keycode == conf->edge_swipe.compose_key) &&
432 (edge_swipes->base.edge == E_GESTURE_EDGE_LEFT))))
438 coords.x = fingers->start.x;
439 coords.y = fingers->start.y;
441 EINA_LIST_FOREACH(fingers->edge[edge], l, edata)
443 if (edge == E_GESTURE_EDGE_TOP ||
444 edge == E_GESTURE_EDGE_BOTTOM)
446 if ((coords.x >= edata->sp) &&
447 (coords.x <= edata->ep))
452 else if ((edge == E_GESTURE_EDGE_LEFT) ||
453 (edge == E_GESTURE_EDGE_RIGHT))
455 if (coords.y >= edata->sp &&
456 coords.y <= edata->ep)
467 _e_gesture_timer_edge_swipe_start(void *data)
469 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
470 int idx = gesture->gesture_events.num_pressed;
473 GTINF("Edge_Swipe start timer is expired. Currently alived edge_swipe fingers: 0x%x\n", edge_swipes->base.enabled_finger);
475 for (i = E_GESTURE_FINGER_MAX; i > idx; i--)
477 edge_swipes->base.enabled_finger &= ~(1 << i);
479 if ((edge_swipes->base.enabled_finger == 0x0) ||
480 (_e_gesture_event_edge_check(&edge_swipes->base.fingers[idx], E_GESTURE_TYPE_EDGE_SWIPE, edge_swipes->base.edge) == EINA_FALSE))
482 _e_gesture_edge_swipe_cancel();
483 if (gesture->gesture_events.event_keep)
484 _e_gesture_event_flush();
486 return ECORE_CALLBACK_CANCEL;
490 _e_gesture_timer_edge_swipe_done(void *data)
492 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
494 GTDBG("Edge_Swipe done timer is expired. Currently alived edge_swipe fingers: 0x%x\n", edge_swipes->base.enabled_finger);
496 _e_gesture_edge_swipe_cancel();
497 if (gesture->gesture_events.event_keep)
498 _e_gesture_event_flush();
500 return ECORE_CALLBACK_CANCEL;
504 _e_gesture_process_edge_swipe_down(Ecore_Event_Mouse_Button *ev)
506 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
507 E_Gesture_Conf_Edd *conf = gesture->config->conf;
509 unsigned int idx = ev->multi.device+1;
511 if (!edge_swipes->base.activation.active)
513 _e_gesture_edge_swipe_cancel();
517 if (gesture->gesture_events.recognized_gesture)
518 _e_gesture_edge_swipe_cancel();
520 if (gesture->gesture_events.num_pressed == 1)
522 for (i = 1; i < E_GESTURE_FINGER_MAX+1; i++)
524 if (edge_swipes->base.fingers[i].enabled)
526 edge_swipes->base.enabled_finger |= (1 << i);
530 if (ev->y < conf->edge_swipe.area_offset)
531 edge_swipes->base.edge = E_GESTURE_EDGE_TOP;
532 else if (ev->y > e_comp->h - conf->edge_swipe.area_offset)
533 edge_swipes->base.edge = E_GESTURE_EDGE_BOTTOM;
534 else if (ev->x < conf->edge_swipe.area_offset)
535 edge_swipes->base.edge = E_GESTURE_EDGE_LEFT;
536 else if (ev->x > e_comp->w - conf->edge_swipe.area_offset)
537 edge_swipes->base.edge = E_GESTURE_EDGE_RIGHT;
539 if (!((1 << (edge_swipes->base.edge)) & edge_swipes->base.enabled_edge))
540 edge_swipes->base.edge = E_GESTURE_EDGE_NONE;
542 if (edge_swipes->base.edge != E_GESTURE_EDGE_NONE)
544 edge_swipes->base.fingers[idx].start.x = ev->x;
545 edge_swipes->base.fingers[idx].start.y = ev->y;
546 edge_swipes->start_timer = ecore_timer_add(conf->edge_swipe.time_begin, _e_gesture_timer_edge_swipe_start, NULL);
547 edge_swipes->done_timer = ecore_timer_add(conf->edge_swipe.time_done, _e_gesture_timer_edge_swipe_done, NULL);
551 _e_gesture_edge_swipe_cancel();
552 if (gesture->gesture_events.event_keep)
553 _e_gesture_event_flush();
558 edge_swipes->base.fingers[idx].start.x = ev->x;
559 edge_swipes->base.fingers[idx].start.y = ev->y;
560 edge_swipes->base.enabled_finger &= ~(1 << (gesture->gesture_events.num_pressed - 1));
561 if (edge_swipes->start_timer == NULL)
563 _e_gesture_edge_swipe_cancel();
564 if (gesture->gesture_events.event_keep)
565 _e_gesture_event_flush();
571 _e_gesture_process_edge_swipe_move(Ecore_Event_Mouse_Move *ev)
573 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
574 E_Gesture_Conf_Edd *conf = gesture->config->conf;
576 unsigned int idx = ev->multi.device+1;
578 if (!edge_swipes->base.activation.active)
580 _e_gesture_edge_swipe_cancel();
584 if (!(edge_swipes->base.enabled_finger & (1 << idx)))
587 diff.x = ABS(edge_swipes->base.fingers[idx].start.x - ev->x);
588 diff.y = ABS(edge_swipes->base.fingers[idx].start.y - ev->y);
590 switch(edge_swipes->base.edge)
592 case E_GESTURE_EDGE_TOP:
593 case E_GESTURE_EDGE_BOTTOM:
594 if (diff.x > conf->edge_swipe.min_length)
596 _e_gesture_edge_swipe_cancel();
597 if (gesture->gesture_events.event_keep)
598 _e_gesture_event_flush();
601 if (diff.y > conf->edge_swipe.max_length)
603 _e_gesture_send_edge_swipe(idx, edge_swipes->base.fingers[idx].start.x, edge_swipes->base.fingers[idx].start.y, edge_swipes->base.edge);
606 case E_GESTURE_EDGE_LEFT:
607 case E_GESTURE_EDGE_RIGHT:
608 if (diff.y > conf->edge_swipe.min_length)
610 _e_gesture_edge_swipe_cancel();
611 if (gesture->gesture_events.event_keep)
612 _e_gesture_event_flush();
615 if (diff.x > conf->edge_swipe.max_length)
617 _e_gesture_send_edge_swipe(idx, edge_swipes->base.fingers[idx].start.x, edge_swipes->base.fingers[idx].start.y, edge_swipes->base.edge);
621 GTWRN("Invalid edge(%d)\n", edge_swipes->base.edge);
627 _e_gesture_process_edge_swipe_up(Ecore_Event_Mouse_Button *ev)
629 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
631 if (!edge_swipes->base.activation.active)
633 _e_gesture_edge_swipe_cancel();
636 _e_gesture_edge_swipe_cancel();
637 if (gesture->gesture_events.event_keep)
638 _e_gesture_event_flush();
642 _e_gesture_edge_drag_cancel(void)
644 E_Gesture_Event_Edge_Drag *edge_drags = &gesture->gesture_events.edge_drags;
645 Coords current_point = {0, };
647 if (gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_EDGE_DRAG)
649 _e_gesture_util_center_axis_get(edge_drags->idx, ¤t_point.x, ¤t_point.y);
650 _e_gesture_send_edge_drag(edge_drags->idx, current_point.x, current_point.y, edge_drags->base.edge, E_GESTURE_MODE_END);
653 if (edge_drags->start_timer)
655 ecore_timer_del(edge_drags->start_timer);
656 edge_drags->start_timer = NULL;
659 edge_drags->base.enabled_finger = 0x0;
660 edge_drags->base.edge = E_GESTURE_EDGE_NONE;
661 edge_drags->start_point.x = edge_drags->center_point.x = 0;
662 edge_drags->start_point.y = edge_drags->center_point.y = 0;
665 gesture->gesture_filter |= E_GESTURE_TYPE_EDGE_DRAG;
666 gesture->gesture_events.recognized_gesture &= ~E_GESTURE_TYPE_EDGE_DRAG;
670 _e_gesture_send_edge_drag(int fingers, int x, int y, int edge, int mode)
673 E_Gesture_Event_Edge_Finger_Edge *edata;
674 E_Gesture_Event_Edge_Drag *edge_drags = &gesture->gesture_events.edge_drags;
676 E_Event_Gesture_Edge_Drag *ev_drag;
678 if (gesture->gesture_events.event_keep)
680 _e_gesture_event_drop();
683 _e_gesture_send_touch_cancel();
685 if (edge == E_GESTURE_EDGE_TOP ||
686 edge == E_GESTURE_EDGE_BOTTOM)
688 bp = edge_drags->start_point.x;
690 else if (edge == E_GESTURE_EDGE_RIGHT ||
691 edge == E_GESTURE_EDGE_LEFT)
693 bp = edge_drags->start_point.y;
696 EINA_LIST_FOREACH(edge_drags->base.fingers[fingers].edge[edge], l, edata)
698 if (bp >= edata->sp && bp <= edata->ep)
700 GTINF("Send edge drag gesture (fingers: %d, edge: %d) to client: %p\n", fingers, edge, edata->client);
701 if (edata->client == E_GESTURE_SERVER_CLIENT)
703 ev_drag = E_NEW(E_Event_Gesture_Edge_Drag, 1);
704 EINA_SAFETY_ON_NULL_RETURN(ev_drag);
706 ev_drag->mode = E_GESTURE_MODE_DONE;
707 ev_drag->edge = edge;
708 ev_drag->fingers = fingers;
711 ecore_event_add(E_EVENT_GESTURE_EDGE_DRAG, ev_drag, NULL, NULL);
714 tizen_gesture_send_edge_drag(edata->res, mode, fingers, x, y, edge);
719 gesture->gesture_events.recognized_gesture |= E_GESTURE_TYPE_EDGE_DRAG;
723 _e_gesture_timer_edge_drag_start(void *data)
725 E_Gesture_Event_Edge_Drag *edge_drags = &gesture->gesture_events.edge_drags;
726 int idx = gesture->gesture_events.num_pressed;
728 Coords start_point = {0, };
730 for (i = E_GESTURE_FINGER_MAX; i > idx; i--)
732 edge_drags->base.enabled_finger &= ~(1 << i);
735 if ((edge_drags->base.enabled_finger == 0x0) ||
736 (_e_gesture_event_edge_check(&edge_drags->base.fingers[idx], E_GESTURE_TYPE_EDGE_DRAG, edge_drags->base.edge) == EINA_FALSE))
738 _e_gesture_edge_drag_cancel();
739 if (gesture->gesture_events.event_keep)
740 _e_gesture_event_flush();
744 _e_gesture_util_center_axis_get(idx, &start_point.x, &start_point.y);
745 edge_drags->start_point.x = edge_drags->center_point.x = start_point.x;
746 edge_drags->start_point.y = edge_drags->center_point.y = start_point.y;
747 edge_drags->idx = idx;
748 _e_gesture_send_edge_drag(edge_drags->idx, edge_drags->center_point.x, edge_drags->center_point.y, edge_drags->base.edge, E_GESTURE_MODE_BEGIN);
751 ecore_timer_del(edge_drags->start_timer);
752 edge_drags->start_timer = NULL;
753 return ECORE_CALLBACK_CANCEL;
757 _e_gesture_process_edge_drag_down(Ecore_Event_Mouse_Button *ev)
759 E_Gesture_Event_Edge_Drag *edge_drags = &gesture->gesture_events.edge_drags;
760 E_Gesture_Conf_Edd *conf = gesture->config->conf;
762 unsigned int idx = ev->multi.device+1;
764 if (!edge_drags->base.activation.active)
766 _e_gesture_edge_drag_cancel();
770 if (gesture->gesture_events.recognized_gesture)
771 _e_gesture_edge_drag_cancel();
773 if (gesture->gesture_events.num_pressed == 1)
775 for (i = 1; i < E_GESTURE_FINGER_MAX+1; i++)
777 if (edge_drags->base.fingers[i].enabled)
779 edge_drags->base.enabled_finger |= (1 << i);
783 if (ev->y < conf->edge_drag.area_offset)
784 edge_drags->base.edge = E_GESTURE_EDGE_TOP;
785 else if (ev->y > e_comp->h - conf->edge_drag.area_offset)
786 edge_drags->base.edge = E_GESTURE_EDGE_BOTTOM;
787 else if (ev->x < conf->edge_drag.area_offset)
788 edge_drags->base.edge = E_GESTURE_EDGE_LEFT;
789 else if (ev->x > e_comp->w - conf->edge_drag.area_offset)
790 edge_drags->base.edge = E_GESTURE_EDGE_RIGHT;
792 if (!((1 << (edge_drags->base.edge)) & edge_drags->base.enabled_edge))
793 edge_drags->base.edge = E_GESTURE_EDGE_NONE;
795 if (edge_drags->base.edge != E_GESTURE_EDGE_NONE)
797 edge_drags->base.fingers[idx].start.x = ev->x;
798 edge_drags->base.fingers[idx].start.y = ev->y;
799 edge_drags->start_timer = ecore_timer_add(conf->edge_drag.time_begin, _e_gesture_timer_edge_drag_start, NULL);
803 _e_gesture_edge_drag_cancel();
804 if (gesture->gesture_events.event_keep)
805 _e_gesture_event_flush();
810 edge_drags->base.fingers[idx].start.x = ev->x;
811 edge_drags->base.fingers[idx].start.y = ev->y;
812 edge_drags->base.enabled_finger &= ~(1 << (gesture->gesture_events.num_pressed - 1));
813 if (edge_drags->start_timer == NULL)
815 _e_gesture_edge_drag_cancel();
816 if (gesture->gesture_events.event_keep)
817 _e_gesture_event_flush();
823 _e_gesture_process_edge_drag_move(Ecore_Event_Mouse_Move *ev)
825 E_Gesture_Event_Edge_Drag *edge_drags = &gesture->gesture_events.edge_drags;
826 E_Gesture_Conf_Edd *conf = gesture->config->conf;
828 Coords current_point = {0, };
829 unsigned int idx = ev->multi.device+1;
831 if (!edge_drags->base.activation.active)
833 _e_gesture_edge_drag_cancel();
837 if (!(edge_drags->base.enabled_finger & (1 << idx)))
840 if (edge_drags->start_timer) return;
842 _e_gesture_util_center_axis_get(gesture->gesture_events.num_pressed, ¤t_point.x, ¤t_point.y);
843 distance = _e_gesture_util_distance_get(edge_drags->center_point.x, edge_drags->center_point.y, current_point.x, current_point.y);
844 if (distance < (double)conf->edge_drag.diff_length)
849 edge_drags->center_point.x = current_point.x;
850 edge_drags->center_point.y = current_point.y;
852 _e_gesture_send_edge_drag(edge_drags->idx,
853 edge_drags->center_point.x, edge_drags->center_point.y,
854 edge_drags->base.edge, E_GESTURE_MODE_UPDATE);
858 _e_gesture_process_edge_drag_up(Ecore_Event_Mouse_Button *ev)
860 E_Gesture_Event_Edge_Drag *edge_drags = &gesture->gesture_events.edge_drags;
862 if (!edge_drags->base.activation.active)
864 _e_gesture_edge_drag_cancel();
867 _e_gesture_edge_drag_cancel();
868 if (gesture->gesture_events.event_keep)
869 _e_gesture_event_flush();
874 _e_gesture_pan_send(int mode, int fingers, int cx, int cy, struct wl_resource *res, struct wl_client *client)
876 E_Event_Gesture_Pan *ev_pan;
878 if (mode == E_GESTURE_MODE_BEGIN)
880 _e_gesture_send_touch_cancel();
883 GTINF("Send pan gesture %d fingers. (%d, %d) to client: %p, mode: %d\n", fingers, cx, cy, client, mode);
884 if (client == E_GESTURE_SERVER_CLIENT)
886 ev_pan = E_NEW(E_Event_Gesture_Pan, 1);
887 EINA_SAFETY_ON_NULL_RETURN(ev_pan);
890 ev_pan->fingers = fingers;
894 ecore_event_add(E_EVENT_GESTURE_PAN, ev_pan, NULL, NULL);
897 gesture->gesture_events.recognized_gesture |= E_GESTURE_TYPE_PAN;
901 _e_gesture_pan_cancel(void)
903 E_Gesture_Event_Pan *pans = &gesture->gesture_events.pans;
904 Coords cur_point = {0,};
906 if (pans->start_timer)
908 ecore_timer_del(pans->start_timer);
909 pans->start_timer = NULL;
911 if (pans->move_timer)
913 ecore_timer_del(pans->move_timer);
914 pans->move_timer = NULL;
917 if (pans->state == E_GESTURE_PANPINCH_STATE_MOVING)
919 _e_gesture_util_center_axis_get(pans->num_pan_fingers, &cur_point.x, &cur_point.y);
920 _e_gesture_pan_send(E_GESTURE_MODE_END, pans->num_pan_fingers, cur_point.x, cur_point.y,
921 pans->fingers[pans->num_pan_fingers].res,
922 pans->fingers[pans->num_pan_fingers].client);
925 gesture->gesture_filter |= E_GESTURE_TYPE_PAN;
926 pans->state = E_GESTURE_PANPINCH_STATE_DONE;
930 _e_gesture_timer_pan_start(void *data)
932 E_Gesture_Event_Pan *pans = &gesture->gesture_events.pans;
933 int num_pressed = gesture->gesture_events.num_pressed;
936 if (pans->fingers[num_pressed].client)
938 for (i = 1; i <= num_pressed; i++)
940 pans->start_point.x += gesture->gesture_events.base_point[i].axis.x;
941 pans->start_point.y += gesture->gesture_events.base_point[i].axis.y;
943 pans->center_point.x = pans->start_point.x = (int)(pans->start_point.x / num_pressed);
944 pans->center_point.y = pans->start_point.y = (int)(pans->start_point.y / num_pressed);
945 pans->state = E_GESTURE_PANPINCH_STATE_START;
949 _e_gesture_pan_cancel();
951 return ECORE_CALLBACK_CANCEL;
955 _e_gesture_process_pan_down(Ecore_Event_Mouse_Button *ev)
957 E_Gesture_Event_Pan *pans = &gesture->gesture_events.pans;
959 if (!pans->activation.active)
961 _e_gesture_pan_cancel();
965 if (gesture->gesture_events.recognized_gesture &&
966 !((gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PAN) ||
967 (gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PINCH)))
968 _e_gesture_pan_cancel();
970 if (gesture->gesture_events.num_pressed == 1)
972 pans->state = E_GESTURE_PANPINCH_STATE_READY;
973 if (pans->start_timer) ecore_timer_del(pans->start_timer);
974 pans->start_timer = ecore_timer_add(E_GESTURE_PAN_START_TIME, _e_gesture_timer_pan_start, NULL);
979 _e_gesture_process_pan_move(Ecore_Event_Mouse_Move *ev)
981 E_Gesture_Event_Pan *pans = &gesture->gesture_events.pans;
982 Coords cur_point = {0,};
983 int idx, diff_x, diff_y, mode;
985 if (!pans->activation.active)
987 _e_gesture_pan_cancel();
991 if (gesture->gesture_events.recognized_gesture &&
992 !((gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PAN) ||
993 (gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PINCH)))
994 _e_gesture_pan_cancel();
996 idx = gesture->gesture_events.num_pressed;
997 if (idx <= 0) return;
998 if (pans->state == E_GESTURE_PANPINCH_STATE_READY) return;
1000 _e_gesture_util_center_axis_get(gesture->gesture_events.num_pressed, &cur_point.x, &cur_point.y);
1002 diff_x = cur_point.x - pans->center_point.x;
1003 diff_y = cur_point.y - pans->center_point.y;
1005 if ((ABS(diff_x) > E_GESTURE_PAN_MOVING_RANGE) || (ABS(diff_y) > E_GESTURE_PAN_MOVING_RANGE))
1007 switch (pans->state)
1009 case E_GESTURE_PANPINCH_STATE_START:
1010 mode = E_GESTURE_MODE_BEGIN;
1011 pans->state = E_GESTURE_PANPINCH_STATE_MOVING;
1012 pans->num_pan_fingers = idx;
1014 case E_GESTURE_PANPINCH_STATE_MOVING:
1015 mode = E_GESTURE_MODE_UPDATE;
1021 if (ABS(diff_x) > E_GESTURE_PAN_MOVING_RANGE) pans->center_point.x = cur_point.x;
1022 if (ABS(diff_y) > E_GESTURE_PAN_MOVING_RANGE) pans->center_point.y = cur_point.y;
1024 _e_gesture_pan_send(mode, idx, cur_point.x, cur_point.y, pans->fingers[idx].res, pans->fingers[idx].client);
1026 if (mode == E_GESTURE_MODE_BEGIN)
1027 mode = E_GESTURE_MODE_UPDATE;
1032 _e_gesture_process_pan_up(Ecore_Event_Mouse_Button *ev)
1034 //E_Gesture_Event_Pan *pans = &gesture->gesture_events.pans;
1036 _e_gesture_pan_cancel();
1040 _e_gesture_pinch_send(int mode, int fingers, double distance, double angle, int cx, int cy, struct wl_resource *res, struct wl_client *client)
1042 E_Event_Gesture_Pinch *ev_pinch;
1044 if (mode == E_GESTURE_MODE_BEGIN)
1046 _e_gesture_send_touch_cancel();
1049 GTINF("Send pinch gesture (fingers: %d, distance: %lf, angle: %lf, cx: %d, cy: %d) to client: %p, mode: %d\n", fingers, distance, angle, cx, cy, client, mode);
1050 if (client == E_GESTURE_SERVER_CLIENT)
1052 ev_pinch = E_NEW(E_Event_Gesture_Pinch, 1);
1053 EINA_SAFETY_ON_NULL_RETURN(ev_pinch);
1055 ev_pinch->mode = mode;
1056 ev_pinch->fingers = fingers;
1057 ev_pinch->distance = distance;
1058 ev_pinch->angle = angle;
1062 ecore_event_add(E_EVENT_GESTURE_PINCH, ev_pinch, NULL, NULL);
1065 gesture->gesture_events.recognized_gesture |= E_GESTURE_TYPE_PINCH;
1069 _e_gesture_pinch_cancel(void)
1071 E_Gesture_Event_Pinch *pinchs = &gesture->gesture_events.pinchs;
1073 if (pinchs->start_timer)
1075 ecore_timer_del(pinchs->start_timer);
1076 pinchs->start_timer = NULL;
1078 if (pinchs->move_timer)
1080 ecore_timer_del(pinchs->move_timer);
1081 pinchs->move_timer = NULL;
1084 if (pinchs->state == E_GESTURE_PANPINCH_STATE_MOVING)
1085 _e_gesture_pinch_send(E_GESTURE_MODE_END, pinchs->num_pinch_fingers, 0.0, 0.0, 0, 0,
1086 pinchs->fingers[pinchs->num_pinch_fingers].res,
1087 pinchs->fingers[pinchs->num_pinch_fingers].client);
1089 gesture->gesture_filter |= E_GESTURE_TYPE_PINCH;
1090 pinchs->state = E_GESTURE_PANPINCH_STATE_DONE;
1094 _e_gesture_timer_pinch_start(void *data)
1096 E_Gesture_Event_Pinch *pinch = &gesture->gesture_events.pinchs;
1097 int num_pressed = gesture->gesture_events.num_pressed;
1099 if (pinch->fingers[num_pressed].client)
1101 pinch->distance = _e_gesture_util_distances_get(num_pressed);
1102 pinch->state = E_GESTURE_PANPINCH_STATE_START;
1106 _e_gesture_pinch_cancel();
1108 return ECORE_CALLBACK_CANCEL;
1112 _e_gesture_process_pinch_down(Ecore_Event_Mouse_Button *ev)
1114 E_Gesture_Event_Pinch *pinch = &gesture->gesture_events.pinchs;
1116 if (!pinch->activation.active)
1118 _e_gesture_pinch_cancel();
1122 if (gesture->gesture_events.recognized_gesture &&
1123 !((gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PAN) ||
1124 (gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PINCH)))
1125 _e_gesture_pinch_cancel();
1127 if (gesture->gesture_events.num_pressed == 1)
1129 pinch->state = E_GESTURE_PANPINCH_STATE_READY;
1130 if (pinch->start_timer) ecore_timer_del(pinch->start_timer);
1131 pinch->start_timer = ecore_timer_add(E_GESTURE_PAN_START_TIME, _e_gesture_timer_pinch_start, NULL);
1136 _e_gesture_process_pinch_move(Ecore_Event_Mouse_Move *ev)
1138 E_Gesture_Event_Pinch *pinch = &gesture->gesture_events.pinchs;
1139 int idx, mode, cx = 0, cy = 0;
1140 double current_distance = 0.0, diff = 0.0, angle = 0.0;
1142 if (!pinch->activation.active)
1144 _e_gesture_pinch_cancel();
1148 if (gesture->gesture_events.recognized_gesture &&
1149 !((gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PAN) ||
1150 (gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PINCH)))
1151 _e_gesture_pan_cancel();
1153 idx = gesture->gesture_events.num_pressed;
1154 if (idx <= 0) return;
1155 if (pinch->state == E_GESTURE_PANPINCH_STATE_READY) return;
1157 current_distance = _e_gesture_util_distances_get(idx);
1158 diff = current_distance - pinch->distance;
1160 if (ABS(diff) > E_GESTURE_PINCH_MOVING_DISTANCE_RANGE)
1162 pinch->distance = current_distance;
1163 switch (pinch->state)
1165 case E_GESTURE_PANPINCH_STATE_START:
1166 mode = E_GESTURE_MODE_BEGIN;
1167 pinch->state = E_GESTURE_PANPINCH_STATE_MOVING;
1168 pinch->num_pinch_fingers = idx;
1170 case E_GESTURE_PANPINCH_STATE_MOVING:
1171 mode = E_GESTURE_MODE_UPDATE;
1177 if (idx == 2) angle = _e_gesture_util_angle_get(gesture->gesture_events.base_point[1].axis.x,
1178 gesture->gesture_events.base_point[1].axis.y,
1179 gesture->gesture_events.base_point[2].axis.x,
1180 gesture->gesture_events.base_point[2].axis.y);
1183 _e_gesture_util_center_axis_get(idx, &cx, &cy);
1185 _e_gesture_pinch_send(mode, idx, pinch->distance, angle, cx, cy, pinch->fingers[idx].res, pinch->fingers[idx].client);
1190 _e_gesture_process_pinch_up(Ecore_Event_Mouse_Button *ev)
1192 //E_Gesture_Event_Pinch *pinch = &gesture->gesture_events.pinchs;
1194 _e_gesture_pinch_cancel();
1199 e_gesture_util_tap_max_fingers_get(void)
1201 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1203 unsigned int max = 0;
1205 for (i = 0; i < E_GESTURE_FINGER_MAX +1; i++)
1207 if (taps->fingers[i].enabled) max = i;
1214 e_gesture_util_tap_max_repeats_get(unsigned int fingers)
1216 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1217 E_Gesture_Conf_Edd *conf = gesture->config->conf;
1219 unsigned int max = 0;
1221 for (i = 0; i < conf->tap.repeats_max + 1; i++)
1223 if (taps->fingers[fingers].repeats[i].client) max = i;
1230 _e_gesture_tap_cancel(void)
1232 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1234 if (taps->start_timer)
1236 ecore_timer_del(taps->start_timer);
1237 taps->start_timer = NULL;
1239 if (taps->done_timer)
1241 ecore_timer_del(taps->done_timer);
1242 taps->done_timer = NULL;
1244 if (taps->interval_timer)
1246 ecore_timer_del(taps->interval_timer);
1247 taps->interval_timer = NULL;
1251 taps->enabled_finger = 0;
1252 taps->current_finger = 0;
1253 taps->state = E_GESTURE_TAP_STATE_READY;
1254 taps->base_rect.x1 = 0;
1255 taps->base_rect.y1 = 0;
1256 taps->base_rect.x2 = 0;
1257 taps->base_rect.y2 = 0;
1258 gesture->gesture_filter |= E_GESTURE_TYPE_TAP;
1259 _e_gesture_event_flush();
1260 gesture->gesture_events.recognized_gesture &= ~E_GESTURE_TYPE_TAP;
1264 _e_gesture_send_tap(int fingers, int repeats, int cx, int cy,
1265 struct wl_client *client, struct wl_resource *res)
1267 E_Event_Gesture_Tap *ev_tap;
1269 GTINF("Send Tap gesture. %d fingers %d repeats to client (%p) with cx=%d and cy=%d\n",
1270 fingers, repeats, client, cx, cy);
1271 if (client == E_GESTURE_SERVER_CLIENT)
1273 ev_tap = E_NEW(E_Event_Gesture_Tap, 1);
1274 EINA_SAFETY_ON_NULL_RETURN(ev_tap);
1276 ev_tap->mode = E_GESTURE_MODE_DONE;
1277 ev_tap->fingers = fingers;
1278 ev_tap->repeats = repeats;
1282 ecore_event_add(E_EVENT_GESTURE_TAP, ev_tap, NULL, NULL);
1285 tizen_gesture_send_tap(res, E_GESTURE_MODE_DONE, fingers, repeats);
1286 _e_gesture_event_drop();
1287 gesture->gesture_events.recognized_gesture |= E_GESTURE_TYPE_TAP;
1289 _e_gesture_tap_cancel();
1293 _e_gesture_timer_tap_start(void *data)
1295 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1297 if (taps->fingers[taps->enabled_finger].enabled)
1299 taps->state = E_GESTURE_TAP_STATE_PROCESS;
1303 _e_gesture_tap_cancel();
1306 taps->start_timer = NULL;
1307 return ECORE_CALLBACK_CANCEL;
1311 _e_gesture_timer_tap_done(void *data)
1313 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1315 if (gesture->gesture_events.num_pressed)
1317 _e_gesture_tap_cancel();
1320 taps->done_timer = NULL;
1321 return ECORE_CALLBACK_CANCEL;
1325 _e_gesture_timer_tap_interval(void *data)
1327 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1328 Coords cur_point = {0,};
1330 if (taps->fingers[taps->enabled_finger].repeats[taps->repeats].client)
1332 _e_gesture_util_rect_center_axis_get(taps->base_rect, &cur_point.x, &cur_point.y);
1333 _e_gesture_send_tap(taps->enabled_finger, taps->repeats,
1334 cur_point.x, cur_point.y,
1335 taps->fingers[taps->enabled_finger].repeats[taps->repeats].client,
1336 taps->fingers[taps->enabled_finger].repeats[taps->repeats].res);
1337 gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
1338 gesture->gesture_events.recognized_gesture &= ~E_GESTURE_TYPE_TAP;
1339 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
1343 /* All fingers are released. */
1344 gesture->gesture_filter = E_GESTURE_TYPE_ALL;
1345 _e_gesture_tap_cancel();
1347 gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
1348 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
1351 taps->interval_timer = NULL;
1352 return ECORE_CALLBACK_CANCEL;
1356 _e_gesture_tap_start(void)
1358 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1359 E_Gesture_Conf_Edd *conf = gesture->config->conf;
1361 taps->state = E_GESTURE_TAP_STATE_START;
1362 if (!taps->start_timer)
1364 taps->start_timer = ecore_timer_add(conf->tap.time_start, _e_gesture_timer_tap_start, NULL);
1366 if (!taps->done_timer)
1368 taps->done_timer = ecore_timer_add(conf->tap.time_done, _e_gesture_timer_tap_done, NULL);
1373 _e_gesture_tap_done(void)
1375 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1376 E_Gesture_Conf_Edd *conf = gesture->config->conf;
1378 if (taps->repeats >= conf->tap.repeats_max)
1379 _e_gesture_tap_cancel();
1381 if (!taps->fingers[taps->enabled_finger].enabled)
1382 _e_gesture_tap_cancel();
1384 if (!(gesture->gesture_filter & E_GESTURE_TYPE_TAP) &&
1385 gesture->gesture_events.num_pressed == 0)
1387 taps->state = E_GESTURE_TAP_STATE_WAIT;
1389 if (taps->done_timer)
1391 ecore_timer_del(taps->done_timer);
1392 taps->done_timer = NULL;
1394 taps->current_finger = 0;
1395 if (taps->repeats == taps->fingers[taps->enabled_finger].max_repeats)
1397 ecore_timer_del(taps->interval_timer);
1398 _e_gesture_timer_tap_interval(NULL);
1402 if (!taps->interval_timer)
1404 taps->interval_timer = ecore_timer_add(conf->tap.time_interval, _e_gesture_timer_tap_interval, NULL);
1411 _e_gesture_tap_condition_check(E_Gesture_Event_Tap *taps)
1413 if (!taps->activation.active)
1415 _e_gesture_tap_cancel();
1419 if (gesture->gesture_events.recognized_gesture)
1420 _e_gesture_tap_cancel();
1426 _e_gesture_process_tap_down(Ecore_Event_Mouse_Button *ev)
1428 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1430 if (!_e_gesture_tap_condition_check(taps))
1435 if (taps->enabled_finger < gesture->gesture_events.num_pressed)
1436 taps->enabled_finger = gesture->gesture_events.num_pressed;
1438 taps->current_finger++;
1440 if (taps->enabled_finger > taps->max_fingers)
1441 _e_gesture_tap_cancel();
1443 if (taps->state == E_GESTURE_TAP_STATE_READY ||
1444 taps->state == E_GESTURE_TAP_STATE_START ||
1445 taps->state == E_GESTURE_TAP_STATE_PROCESS)
1447 _e_gesture_util_rect_get(taps->enabled_finger, &taps->base_rect.x1, &taps->base_rect.y1, &taps->base_rect.x2, &taps->base_rect.y2);
1450 switch (taps->state)
1452 case E_GESTURE_TAP_STATE_NONE:
1455 case E_GESTURE_TAP_STATE_READY:
1456 _e_gesture_tap_start();
1459 case E_GESTURE_TAP_STATE_START:
1462 case E_GESTURE_TAP_STATE_PROCESS:
1463 _e_gesture_tap_cancel();
1466 case E_GESTURE_TAP_STATE_WAIT:
1467 if (taps->interval_timer)
1469 ecore_timer_del(taps->interval_timer);
1470 taps->interval_timer = NULL;
1472 _e_gesture_tap_start();
1475 case E_GESTURE_TAP_STATE_DONE:
1484 _e_gesture_process_tap_move(Ecore_Event_Mouse_Move *ev)
1486 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1487 E_Gesture_Conf_Edd *conf = gesture->config->conf;
1488 Rect current_rect = {0, };
1489 int xx1, yy1, xx2, yy2;
1491 if (!_e_gesture_tap_condition_check(taps))
1496 _e_gesture_util_rect_get(taps->enabled_finger, ¤t_rect.x1, ¤t_rect.y1, ¤t_rect.x2, ¤t_rect.y2);
1498 xx1 = taps->base_rect.x1 - current_rect.x1;
1499 yy1 = taps->base_rect.y1 - current_rect.y1;
1500 xx2 = taps->base_rect.x2 - current_rect.x2;
1501 yy2 = taps->base_rect.y2 - current_rect.y2;
1503 if (ABS(xx1) > conf->tap.moving_range ||
1504 ABS(yy1) > conf->tap.moving_range ||
1505 ABS(xx2) > conf->tap.moving_range ||
1506 ABS(yy2) > conf->tap.moving_range)
1508 GTDBG("%d finger moving too large diff: (%d, %d)(%d, %d)\n", ev->multi.device, xx1, yy1, xx2, yy2);
1509 _e_gesture_tap_cancel();
1514 _e_gesture_process_tap_up(Ecore_Event_Mouse_Button *ev)
1516 E_Gesture_Event_Tap *taps = &gesture->gesture_events.taps;
1518 if (!_e_gesture_tap_condition_check(taps))
1523 if (taps->enabled_finger != taps->current_finger)
1524 _e_gesture_tap_cancel();
1526 switch (taps->state)
1528 case E_GESTURE_TAP_STATE_NONE:
1531 case E_GESTURE_TAP_STATE_READY:
1532 _e_gesture_tap_cancel();
1535 case E_GESTURE_TAP_STATE_START:
1536 taps->state = E_GESTURE_TAP_STATE_PROCESS;
1537 if (taps->start_timer)
1539 ecore_timer_del(taps->start_timer);
1540 taps->start_timer = NULL;
1542 _e_gesture_tap_done();
1545 case E_GESTURE_TAP_STATE_PROCESS:
1546 _e_gesture_tap_done();
1549 case E_GESTURE_TAP_STATE_WAIT:
1550 if (taps->interval_timer)
1552 ecore_timer_del(taps->interval_timer);
1553 taps->interval_timer = NULL;
1555 _e_gesture_tap_start();
1558 case E_GESTURE_TAP_STATE_DONE:
1567 _e_gesture_process_touch_check(Ecore_Device *dev, int finger)
1569 if ((!gesture->grabbed_gesture) ||
1570 (e_gesture_is_touch_device(dev) == EINA_FALSE) ||
1571 (finger > E_GESTURE_FINGER_MAX))
1578 static E_Gesture_Event_State
1579 _e_gesture_process_mouse_button_down(void *event)
1581 Ecore_Event_Mouse_Button *ev = event;
1583 if (!_e_gesture_process_touch_check(ev->dev, ev->multi.device))
1584 return E_GESTURE_EVENT_STATE_PROPAGATE;
1586 gesture->gesture_events.base_point[ev->multi.device + 1].pressed = EINA_TRUE;
1587 gesture->gesture_events.base_point[ev->multi.device + 1].axis.x = ev->x;
1588 gesture->gesture_events.base_point[ev->multi.device + 1].axis.y = ev->y;
1590 if (gesture->gesture_events.recognized_gesture)
1592 GTINF("Mouse Down. recognized_gesture has a value (%d). return E_GESTURE_EVENT_STATE_IGNORE",
1593 gesture->gesture_events.recognized_gesture);
1594 return E_GESTURE_EVENT_STATE_IGNORE;
1597 if (gesture->gesture_events.num_pressed == 1)
1599 if (gesture->gesture_filter == E_GESTURE_TYPE_ALL)
1601 gesture->event_state = E_GESTURE_EVENT_STATE_PROPAGATE;
1605 if (!(gesture->gesture_filter & E_GESTURE_TYPE_EDGE_SWIPE))
1607 _e_gesture_process_edge_swipe_down(ev);
1609 if (!(gesture->gesture_filter & E_GESTURE_TYPE_EDGE_DRAG))
1611 _e_gesture_process_edge_drag_down(ev);
1613 if (!(gesture->gesture_filter & E_GESTURE_TYPE_PAN))
1615 _e_gesture_process_pan_down(ev);
1617 if (!(gesture->gesture_filter & E_GESTURE_TYPE_PINCH))
1619 _e_gesture_process_pinch_down(ev);
1621 if (!(gesture->gesture_filter & E_GESTURE_TYPE_TAP))
1623 _e_gesture_process_tap_down(ev);
1626 return gesture->event_state;
1629 static E_Gesture_Event_State
1630 _e_gesture_process_mouse_button_up(void *event)
1632 Ecore_Event_Mouse_Button *ev = event;
1634 if (!_e_gesture_process_touch_check(ev->dev, ev->multi.device))
1635 return E_GESTURE_EVENT_STATE_PROPAGATE;
1637 gesture->gesture_events.base_point[ev->multi.device + 1].axis.x = ev->x;
1638 gesture->gesture_events.base_point[ev->multi.device + 1].axis.y = ev->y;
1640 if (!(gesture->gesture_filter & E_GESTURE_TYPE_EDGE_SWIPE))
1642 _e_gesture_process_edge_swipe_up(ev);
1644 if (!(gesture->gesture_filter & E_GESTURE_TYPE_EDGE_DRAG))
1646 _e_gesture_process_edge_drag_up(ev);
1648 if (!(gesture->gesture_filter & E_GESTURE_TYPE_PAN))
1650 _e_gesture_process_pan_up(ev);
1652 if (!(gesture->gesture_filter & E_GESTURE_TYPE_PINCH))
1654 _e_gesture_process_pinch_up(ev);
1656 if (!(gesture->gesture_filter & E_GESTURE_TYPE_TAP))
1658 _e_gesture_process_tap_up(ev);
1661 gesture->gesture_events.base_point[ev->multi.device + 1].pressed = EINA_FALSE;
1662 gesture->gesture_events.base_point[ev->multi.device + 1].axis.x = 0;
1663 gesture->gesture_events.base_point[ev->multi.device + 1].axis.y = 0;
1665 if (gesture->gesture_events.recognized_gesture)
1667 GTINF("Mouse Up. recognized_gesture has a value (%d). return E_GESTURE_EVENT_STATE_IGNORE",
1668 gesture->gesture_events.recognized_gesture);
1669 if (gesture->gesture_events.num_pressed == 0)
1671 if (gesture->gesture_events.recognized_gesture & E_GESTURE_TYPE_PALM_COVER)
1673 gesture->event_state = gesture->prev_event_state;
1675 gesture->gesture_events.recognized_gesture = 0x0;
1677 return E_GESTURE_EVENT_STATE_IGNORE;
1680 return gesture->event_state;
1684 static E_Gesture_Event_State
1685 _e_gesture_process_mouse_move(void *event)
1687 Ecore_Event_Mouse_Move *ev = event;
1689 if (!_e_gesture_process_touch_check(ev->dev, ev->multi.device))
1690 return E_GESTURE_EVENT_STATE_PROPAGATE;
1692 if (gesture->gesture_events.num_pressed == 0)
1694 return gesture->event_state;
1697 if (gesture->gesture_events.base_point[ev->multi.device + 1].pressed != EINA_TRUE)
1699 return gesture->event_state;
1701 gesture->gesture_events.base_point[ev->multi.device + 1].axis.x = ev->x;
1702 gesture->gesture_events.base_point[ev->multi.device + 1].axis.y = ev->y;
1704 if (!(gesture->gesture_filter & E_GESTURE_TYPE_EDGE_SWIPE))
1706 _e_gesture_process_edge_swipe_move(ev);
1708 if (!(gesture->gesture_filter & E_GESTURE_TYPE_EDGE_DRAG))
1710 _e_gesture_process_edge_drag_move(ev);
1712 if (!(gesture->gesture_filter & E_GESTURE_TYPE_PAN))
1714 _e_gesture_process_pan_move(ev);
1716 if (!(gesture->gesture_filter & E_GESTURE_TYPE_PINCH))
1718 _e_gesture_process_pinch_move(ev);
1720 if (!(gesture->gesture_filter & E_GESTURE_TYPE_TAP))
1722 _e_gesture_process_tap_move(ev);
1725 return gesture->event_state;
1728 static E_Gesture_Event_State
1729 _e_gesture_process_key_down(void *event)
1731 Ecore_Event_Key *ev = event;
1732 E_Gesture_Conf_Edd *conf = gesture->config->conf;
1734 if (ev->keycode == conf->edge_swipe.compose_key)
1736 gesture->gesture_events.edge_swipes.combined_keycode = conf->edge_swipe.compose_key;
1739 return E_GESTURE_EVENT_STATE_PROPAGATE;
1742 static E_Gesture_Event_State
1743 _e_gesture_process_key_up(void *event)
1745 Ecore_Event_Key *ev = event;
1746 E_Gesture_Conf_Edd *conf = gesture->config->conf;
1748 if (ev->keycode == conf->edge_swipe.compose_key)
1750 gesture->gesture_events.edge_swipes.combined_keycode = 0;
1753 return E_GESTURE_EVENT_STATE_PROPAGATE;
1757 _e_gesture_send_palm_cover(void)
1759 Ecore_Event_Mouse_Button *ev_cancel;
1760 E_Gesture_Event_Palm_Cover *palm_covers = &gesture->gesture_events.palm_covers;
1761 int duration = 0, time;
1763 unsigned int size = 0;
1764 wl_fixed_t pressure;
1765 struct wl_resource *surface = NULL, *res = NULL, *focus_surface = NULL;
1767 E_Gesture_Select_Surface *sdata;
1768 E_Event_Gesture_Palm_Cover *ev_palm_cover;
1770 time = e_util_timestamp_get();
1772 if (gesture->event_state == E_GESTURE_EVENT_STATE_KEEP)
1774 _e_gesture_event_drop();
1776 else if (gesture->event_state == E_GESTURE_EVENT_STATE_PROPAGATE)
1778 ev_cancel = E_NEW(Ecore_Event_Mouse_Button, 1);
1779 EINA_SAFETY_ON_NULL_RETURN(ev_cancel);
1781 ev_cancel->timestamp = time;
1782 ev_cancel->same_screen = 1;
1784 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_CANCEL, ev_cancel, NULL, NULL);
1787 _e_gesture_util_center_axis_get(gesture->gesture_events.num_pressed, &cx, &cy);
1789 GTINF("Send palm_cover gesture to client: %p\n", palm_covers->client_info.client);
1791 if (palm_covers->client_info.client == E_GESTURE_SERVER_CLIENT)
1793 ev_palm_cover = E_NEW(E_Event_Gesture_Palm_Cover, 1);
1794 EINA_SAFETY_ON_NULL_RETURN(ev_palm_cover);
1796 ev_palm_cover->mode = E_GESTURE_MODE_BEGIN;
1797 ev_palm_cover->duration = duration;
1798 ev_palm_cover->cx = cx;
1799 ev_palm_cover->cy = cy;
1800 ev_palm_cover->size = size;
1801 ev_palm_cover->pressure = 0.0;
1802 ecore_event_add(E_EVENT_GESTURE_PALM_COVER, ev_palm_cover, NULL, NULL);
1804 ev_palm_cover = E_NEW(E_Event_Gesture_Palm_Cover, 1);
1805 EINA_SAFETY_ON_NULL_RETURN(ev_palm_cover);
1807 ev_palm_cover->mode = E_GESTURE_MODE_END;
1808 ev_palm_cover->duration = duration;
1809 ev_palm_cover->cx = cx;
1810 ev_palm_cover->cy = cy;
1811 ev_palm_cover->size = size;
1812 ev_palm_cover->pressure = 0.0;
1813 ecore_event_add(E_EVENT_GESTURE_PALM_COVER, ev_palm_cover, NULL, NULL);
1817 pressure = wl_fixed_from_double(0.0);
1819 focus_surface = _e_gesture_util_eclient_surface_get(e_client_focused_get());
1822 EINA_LIST_FOREACH(palm_covers->select_surface_list, l, sdata)
1824 if (focus_surface == sdata->surface)
1826 surface = sdata->surface;
1833 if (!surface || !res)
1835 res = palm_covers->client_info.res;
1841 GTWRN("Failed to find grabbed client(%p), palm_grabbed: %d\n", palm_covers->client_info.client, gesture->grabbed_gesture & E_GESTURE_TYPE_PALM_COVER);
1845 tizen_gesture_send_palm_cover(res, surface, E_GESTURE_MODE_BEGIN, duration, size, pressure, cx, cy);
1846 tizen_gesture_send_palm_cover(res, surface, E_GESTURE_MODE_END, duration, size, pressure, cx, cy);
1850 gesture->prev_event_state = gesture->event_state;
1851 gesture->event_state = E_GESTURE_EVENT_STATE_IGNORE;
1852 gesture->gesture_events.recognized_gesture |= E_GESTURE_TYPE_PALM_COVER;
1856 _e_gesture_process_palm_cover(int val)
1858 if (gesture->gesture_events.recognized_gesture)
1863 _e_gesture_send_palm_cover();
1867 _e_gesture_process_palm(int val)
1869 if (val <= 0) return;
1870 if (!gesture->grabbed_gesture) return;
1872 if (!(gesture->gesture_filter & E_GESTURE_TYPE_PALM_COVER) &&
1873 gesture->gesture_events.palm_covers.activation.active)
1875 _e_gesture_process_palm_cover(val);
1879 static E_Gesture_Event_State
1880 _e_gesture_process_axis_update(void *event)
1882 Ecore_Event_Axis_Update *ev = event;
1885 for (i = 0; i < ev->naxis; i++)
1887 if (ev->axis[i].label == ECORE_AXIS_LABEL_TOUCH_PALM)
1889 _e_gesture_process_palm((int)ev->axis[i].value);
1892 return E_GESTURE_EVENT_STATE_PROPAGATE;
1895 /* Function for checking the existing grab for a key and sending key event(s) */
1897 e_gesture_process_events(void *event, int type)
1899 E_Gesture_Event_State res = E_GESTURE_EVENT_STATE_PROPAGATE;
1900 Eina_Bool ret = EINA_TRUE;
1902 if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
1903 res = _e_gesture_process_mouse_button_down(event);
1904 else if (type == ECORE_EVENT_MOUSE_BUTTON_UP)
1905 res = _e_gesture_process_mouse_button_up(event);
1906 else if (type == ECORE_EVENT_MOUSE_MOVE)
1907 res = _e_gesture_process_mouse_move(event);
1908 else if (type == ECORE_EVENT_KEY_DOWN)
1909 res = _e_gesture_process_key_down(event);
1910 else if (type == ECORE_EVENT_KEY_UP)
1911 res = _e_gesture_process_key_up(event);
1912 else if (type == ECORE_EVENT_DEVICE_ADD)
1913 res = _e_gesture_process_device_add(event);
1914 else if (type == ECORE_EVENT_DEVICE_DEL)
1915 res = _e_gesture_process_device_del(event);
1916 else if (type == ECORE_EVENT_AXIS_UPDATE)
1917 res = _e_gesture_process_axis_update(event);
1922 case E_GESTURE_EVENT_STATE_PROPAGATE:
1925 case E_GESTURE_EVENT_STATE_KEEP:
1926 _e_gesture_event_queue(type, event);
1929 case E_GESTURE_EVENT_STATE_IGNORE:
1936 if (gesture->gesture_events.num_pressed == 0 &&
1937 type == ECORE_EVENT_MOUSE_BUTTON_UP)
1939 if (gesture->grabbed_gesture & E_GESTURE_TYPE_TAP ||
1940 ((gesture->grabbed_gesture & E_GESTURE_TYPE_EDGE_SWIPE) &&
1941 gesture->gesture_events.event_keep))
1942 gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
1943 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;