2 #include "e_mod_main.h"
4 #include "e_service_quickpanel.h"
6 E_GesturePtr gesture = NULL;
7 E_API E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Gesture Module of Window Manager" };
9 static E_Gesture_Config_Data *_e_gesture_init(E_Module *m);
10 static void _e_gesture_init_handlers(void);
11 static void _e_gesture_wl_client_cb_destroy(struct wl_listener *l, void *data);
12 static void _e_gesture_wl_surface_cb_destroy(struct wl_listener *l, void *data);
15 _e_gesture_edge_boundary_check(E_Gesture_Event_Edge_Finger *fingers, unsigned int edge, int sp, int ep)
18 E_Gesture_Event_Edge_Finger_Edge *edata;
20 EINA_LIST_FOREACH(fingers->edge[edge], l, edata)
22 if (!(sp > edata->ep || ep < edata->sp))
30 _e_gesture_edge_grab_add(E_Gesture_Event_Edge_Finger *fingers, struct wl_client *client, struct wl_resource *res, unsigned int edge, unsigned int sp, unsigned int ep)
32 E_Gesture_Event_Edge_Finger_Edge *edata;
34 edata = E_NEW(E_Gesture_Event_Edge_Finger_Edge, 1);
35 EINA_SAFETY_ON_NULL_RETURN(edata);
37 edata->client = client;
42 fingers->edge[edge] = eina_list_append(fingers->edge[edge], edata);
46 _e_gesture_set_client_to_list(E_Gesture_Grabbed_Client *gclient, struct wl_client *client, int mode, int fingers, int edge, int repeat, int sp, int ep)
50 case E_GESTURE_TYPE_EDGE_SWIPE:
51 _e_gesture_edge_grab_add(&gclient->edge_swipe_fingers[fingers], client, NULL, edge, sp, ep);
52 gclient->edge_swipe_fingers[fingers].enabled = EINA_TRUE;
54 case E_GESTURE_TYPE_EDGE_DRAG:
55 _e_gesture_edge_grab_add(&gclient->edge_drag_fingers[fingers], client, NULL, edge, sp, ep);
56 gclient->edge_drag_fingers[fingers].enabled = EINA_TRUE;
58 case E_GESTURE_TYPE_TAP:
59 gclient->tap_fingers[fingers].repeats[repeat].client = client;
61 case E_GESTURE_TYPE_PAN:
62 gclient->pan_fingers[fingers].client = client;
64 case E_GESTURE_TYPE_PINCH:
65 gclient->pinch_fingers[fingers].client = client;
67 case E_GESTURE_TYPE_PALM_COVER:
68 gclient->palm_cover.client = client;
73 gclient->grabbed_gesture |= mode;
77 _e_gesture_util_type_to_string(unsigned int type)
81 case E_GESTURE_TYPE_EDGE_SWIPE:
83 case E_GESTURE_TYPE_TAP:
85 case E_GESTURE_TYPE_PALM_COVER:
87 case E_GESTURE_TYPE_PAN:
89 case E_GESTURE_TYPE_PINCH:
96 /* Function for registering wl_client destroy listener */
98 e_gesture_add_client_destroy_listener(struct wl_client *client, int mode, int fingers, unsigned int edge, unsigned int repeat, int sp, int ep)
100 struct wl_listener *destroy_listener = NULL;
102 E_Gesture_Grabbed_Client *grabbed_client, *data;
104 if (client == E_GESTURE_SERVER_CLIENT) return TIZEN_GESTURE_ERROR_NONE;
106 EINA_LIST_FOREACH(gesture->grab_client_list, l, data)
108 if (data->client == client)
110 _e_gesture_set_client_to_list(data, client, mode, fingers, edge, repeat, sp, ep);
112 return TIZEN_GESTURE_ERROR_NONE;
116 destroy_listener = E_NEW(struct wl_listener, 1);
117 if (!destroy_listener)
119 GTERR("Failed to allocate memory for wl_client destroy listener !\n");
120 return TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES;
123 grabbed_client = E_NEW(E_Gesture_Grabbed_Client, 1);
126 GTERR("Failed to allocate memory to save client information !\n");
127 E_FREE(destroy_listener);
128 return TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES;
131 destroy_listener->notify = _e_gesture_wl_client_cb_destroy;
132 wl_client_add_destroy_listener(client, destroy_listener);
133 grabbed_client->client = client;
134 grabbed_client->destroy_listener = destroy_listener;
135 _e_gesture_set_client_to_list(grabbed_client, client, mode, fingers, edge, repeat, sp, ep);
137 gesture->grab_client_list = eina_list_append(gesture->grab_client_list, grabbed_client);
139 return TIZEN_GESTURE_ERROR_NONE;
143 _e_gesture_edge_swipe_current_list_check(void)
146 E_Gesture_Event *gev;
148 gev = &gesture->gesture_events;
149 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
151 for (j = 0; j < E_GESTURE_EDGE_MAX+1; j++)
153 if (eina_list_count(gev->edge_swipes.base.fingers[i].edge[j]) != 0)
158 gev->edge_swipes.base.fingers[i].enabled = EINA_FALSE;
160 gesture->grabbed_gesture &= ~E_GESTURE_TYPE_EDGE_SWIPE;
161 if (gev->event_keep) gesture->event_state = E_GESTURE_EVENT_STATE_PROPAGATE;
165 _e_gesture_edge_drag_current_list_check(void)
168 E_Gesture_Event *gev;
170 gev = &gesture->gesture_events;
171 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
173 for (j = 0; j < E_GESTURE_EDGE_MAX+1; j++)
175 if (eina_list_count(gev->edge_drags.base.fingers[i].edge[j]) != 0)
180 gev->edge_drags.base.fingers[i].enabled = EINA_FALSE;
182 gesture->grabbed_gesture &= ~E_GESTURE_TYPE_EDGE_SWIPE;
183 if (gev->event_keep) gesture->event_state = E_GESTURE_EVENT_STATE_PROPAGATE;
187 _e_gesture_tap_current_list_check(void)
190 E_Gesture_Event *gev;
192 gev = &gesture->gesture_events;
194 gesture->grabbed_gesture &= ~E_GESTURE_TYPE_TAP;
195 gev->taps.state = E_GESTURE_TAP_STATE_NONE;
196 gesture->event_state = E_GESTURE_EVENT_STATE_PROPAGATE;
197 for (i = 0; i < E_GESTURE_FINGER_MAX; i++)
199 if (gev->taps.fingers[i].enabled)
201 gesture->grabbed_gesture |= E_GESTURE_TYPE_TAP;
202 gev->taps.state = E_GESTURE_TAP_STATE_READY;
203 gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
208 gev->taps.max_fingers = e_gesture_util_tap_max_fingers_get();
212 _e_gesture_pan_current_list_check(void)
215 E_Gesture_Event *gev;
217 gev = &gesture->gesture_events;
219 gesture->grabbed_gesture &= ~E_GESTURE_TYPE_PAN;
220 gev->pans.state = E_GESTURE_PANPINCH_STATE_NONE;
222 for (i = 0; i < E_GESTURE_FINGER_MAX; i++)
224 if (gev->pans.fingers[i].client)
226 gesture->grabbed_gesture |= E_GESTURE_TYPE_PAN;
227 gev->pans.state = E_GESTURE_PANPINCH_STATE_READY;
234 _e_gesture_pinch_current_list_check(void)
237 E_Gesture_Event *gev;
239 gev = &gesture->gesture_events;
241 gesture->grabbed_gesture &= ~E_GESTURE_TYPE_PINCH;
242 gev->pinchs.state = E_GESTURE_PANPINCH_STATE_NONE;
244 for (i = 0; i < E_GESTURE_FINGER_MAX; i++)
246 if (gev->pinchs.fingers[i].client)
248 gesture->grabbed_gesture |= E_GESTURE_TYPE_PINCH;
249 gev->pinchs.state = E_GESTURE_PANPINCH_STATE_READY;
256 _e_gesture_add_surface_destroy_listener(struct wl_resource *surface, int type)
258 struct wl_listener *destroy_listener = NULL;
260 struct wl_resource *surface_data;
262 EINA_SAFETY_ON_NULL_RETURN_VAL(surface, TIZEN_GESTURE_ERROR_INVALID_DATA);
263 if (type != E_GESTURE_TYPE_PALM_COVER)
264 return TIZEN_GESTURE_ERROR_INVALID_DATA;
266 EINA_LIST_FOREACH(gesture->select_surface_list, l, surface_data)
268 if (surface_data == surface)
270 return TIZEN_GESTURE_ERROR_NONE;
274 destroy_listener = E_NEW(struct wl_listener, 1);
275 if (!destroy_listener)
277 GTERR("Failed to allocate memory for wl_client destroy listener !\n");
278 return TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES;
281 destroy_listener->notify = _e_gesture_wl_surface_cb_destroy;
282 wl_resource_add_destroy_listener(surface, destroy_listener);
284 gesture->select_surface_list = eina_list_append(gesture->select_surface_list, surface);
286 return TIZEN_GESTURE_ERROR_NONE;
290 _e_gesture_remove_client_destroy_listener(struct wl_client *client, unsigned int mode, unsigned int fingers, unsigned int edge, unsigned int repeat, int sp, int ep)
292 Eina_List *l, *l_next;
293 E_Gesture_Grabbed_Client *data;
296 EINA_LIST_FOREACH_SAFE(gesture->grab_client_list, l, l_next, data)
298 if (data->client == client)
300 if ((mode & E_GESTURE_TYPE_EDGE_SWIPE) &&
301 (data->grabbed_gesture & E_GESTURE_TYPE_EDGE_SWIPE))
303 _e_gesture_set_client_to_list(data, NULL, E_GESTURE_TYPE_EDGE_SWIPE, fingers, edge, 0, sp, ep);
304 data->grabbed_gesture &= ~E_GESTURE_TYPE_EDGE_SWIPE;
305 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
307 if (data->edge_swipe_fingers[i].enabled)
309 data->grabbed_gesture |= E_GESTURE_TYPE_EDGE_SWIPE;
315 if ((mode & E_GESTURE_TYPE_TAP) &&
316 (data->grabbed_gesture & E_GESTURE_TYPE_TAP))
318 _e_gesture_set_client_to_list(data, NULL, E_GESTURE_TYPE_TAP, fingers, 0, repeat, 0, 0);
319 data->grabbed_gesture &= ~E_GESTURE_TYPE_TAP;
320 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
322 for (j = 0; j < E_GESTURE_TAP_REPEATS_MAX + 1; j++)
324 if (data->tap_fingers[i].repeats[j].client)
326 data->grabbed_gesture |= E_GESTURE_TYPE_TAP;
333 if ((mode & E_GESTURE_TYPE_PAN) &&
334 (data->grabbed_gesture & E_GESTURE_TYPE_PAN))
336 _e_gesture_set_client_to_list(data, NULL, E_GESTURE_TYPE_PAN, fingers, 0, 0, 0, 0);
337 data->grabbed_gesture &= ~E_GESTURE_TYPE_PAN;
338 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
340 if (data->pan_fingers[i].client)
342 data->grabbed_gesture |= E_GESTURE_TYPE_PAN;
348 if ((mode & E_GESTURE_TYPE_PINCH) &&
349 (data->grabbed_gesture & E_GESTURE_TYPE_PINCH))
351 _e_gesture_set_client_to_list(data, NULL, E_GESTURE_TYPE_PINCH, fingers, 0, 0, 0, 0);
352 data->grabbed_gesture &= ~E_GESTURE_TYPE_PINCH;
353 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
355 if (data->pan_fingers[i].client)
357 data->grabbed_gesture |= E_GESTURE_TYPE_PINCH;
363 if ((mode & E_GESTURE_TYPE_PALM_COVER) &&
364 (data->grabbed_gesture & E_GESTURE_TYPE_PALM_COVER))
366 _e_gesture_set_client_to_list(data, NULL, E_GESTURE_TYPE_PALM_COVER, 0, 0, 0, 0, 0);
367 data->grabbed_gesture &= ~E_GESTURE_TYPE_PALM_COVER;
370 if (!data->grabbed_gesture)
372 wl_list_remove(&data->destroy_listener->link);
373 E_FREE(data->destroy_listener);
374 gesture->grab_client_list = eina_list_remove(gesture->grab_client_list, data);
382 _e_gesture_remove_surface_destroy_listener(struct wl_resource *surface, int type)
384 Eina_List *l, *l_next;
385 struct wl_resource *surface_data;
386 struct wl_listener *destroy_listener;
388 EINA_SAFETY_ON_NULL_RETURN(surface);
389 if (type != E_GESTURE_TYPE_PALM_COVER) return;
391 EINA_LIST_FOREACH_SAFE(gesture->select_surface_list, l, l_next, surface_data)
393 if (surface_data == surface)
395 gesture->select_surface_list = eina_list_remove_list(gesture->select_surface_list, l);
400 destroy_listener = wl_resource_get_destroy_listener(surface, _e_gesture_wl_surface_cb_destroy);
401 if (destroy_listener)
403 wl_list_remove(&destroy_listener->link);
404 E_FREE(destroy_listener);
408 GTWRN("surface(%p) is not gesture selected surface\n", surface);
413 _e_gesture_edge_grabbed_client_check(struct wl_client *client)
416 E_Gesture_Event *gev;
418 E_Gesture_Event_Edge_Finger_Edge *edata;
420 gev = &gesture->gesture_events;
422 for (i = 1; i < E_GESTURE_FINGER_MAX + 1; i++)
424 for (j = 1; j < E_GESTURE_EDGE_MAX + 1; j++)
426 EINA_LIST_FOREACH(gev->edge_swipes.base.fingers[i].edge[j], l, edata)
428 if (edata->client == client) return EINA_TRUE;
436 _e_gesture_grab_edge_swipe(struct wl_client *client,
437 struct wl_resource *resource,
438 uint32_t fingers, uint32_t edge, uint32_t edge_size,
439 uint32_t start_point, uint32_t end_point)
441 E_Gesture_Event *gev;
443 int ret = TIZEN_GESTURE_ERROR_NONE;
444 E_Gesture_Conf_Edd *conf = gesture->config->conf;
446 GTINF("client %p is request grab gesture, fingers: %d, edge: 0x%x, edge_size: %d, point( %d - %d)\n", client, fingers, edge, edge_size, start_point, end_point);
447 if (fingers > E_GESTURE_FINGER_MAX)
449 GTWRN("Do not support %d fingers (max: %d)\n", fingers, E_GESTURE_FINGER_MAX);
450 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
454 gev = &gesture->gesture_events;
456 if (edge < E_GESTURE_EDGE_TOP || edge > E_GESTURE_EDGE_LEFT)
458 GTWRN("Invalid edge(%d)\n", edge);
459 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
463 if (edge_size == E_GESTURE_EDGE_SIZE_PARTIAL)
467 if (((edge == E_GESTURE_EDGE_TOP) || (edge == E_GESTURE_EDGE_BOTTOM)) &&
470 else if (((edge == E_GESTURE_EDGE_RIGHT) || (edge == E_GESTURE_EDGE_LEFT)) &&
474 else if (edge_size == E_GESTURE_EDGE_SIZE_FULL)
477 if ((edge == E_GESTURE_EDGE_TOP) || (edge == E_GESTURE_EDGE_BOTTOM))
479 else if ((edge == E_GESTURE_EDGE_RIGHT) || (edge == E_GESTURE_EDGE_LEFT))
484 GTWRN("Invalid edge_size(%d)\n", edge_size);
485 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
489 if ((conf->edge_swipe.default_enable_back) &&
490 (edge == E_GESTURE_EDGE_TOP))
492 ret = TIZEN_GESTURE_ERROR_GRABBED_ALREADY;
494 else if (_e_gesture_edge_boundary_check(&gev->edge_swipes.base.fingers[fingers], edge, sp, ep))
496 _e_gesture_edge_grab_add(&gev->edge_swipes.base.fingers[fingers], client, resource, edge, sp, ep);
498 e_gesture_add_client_destroy_listener(client, E_GESTURE_TYPE_EDGE_SWIPE, fingers, edge, 0, sp, ep);
500 gesture->grabbed_gesture |= E_GESTURE_TYPE_EDGE_SWIPE;
501 gev->edge_swipes.base.fingers[fingers].enabled = EINA_TRUE;
502 if (gev->event_keep) gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
503 gev->edge_swipes.base.enabled_edge |= (1 << edge);
505 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
507 ret = TIZEN_GESTURE_ERROR_NONE;
511 ret = TIZEN_GESTURE_ERROR_GRABBED_ALREADY;
518 _e_gesture_ungrab_edge_swipe(struct wl_client *client,
519 struct wl_resource *resource,
520 uint32_t fingers, uint32_t edge, uint32_t edge_size,
521 uint32_t start_point, uint32_t end_point)
523 E_Gesture_Event *gev;
524 int ret = TIZEN_GESTURE_ERROR_NONE;
526 Eina_List *l, *l_next;
527 E_Gesture_Event_Edge_Finger_Edge *edata;
528 Eina_Bool flag_removed = EINA_FALSE;
531 GTINF("client %p is request ungrab edge swipe gesture, fingers: %d, edge: 0x%x, edge_size: %d, (%d ~ %d)\n", client, fingers, edge, edge_size, start_point, end_point);
533 if (fingers > E_GESTURE_FINGER_MAX)
535 GTWRN("Do not support %d fingers (max: %d)\n", fingers, E_GESTURE_FINGER_MAX);
536 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
540 gev = &gesture->gesture_events;
542 if (edge_size == E_GESTURE_EDGE_SIZE_PARTIAL)
546 if (((edge == E_GESTURE_EDGE_TOP) || (edge == E_GESTURE_EDGE_BOTTOM)) &&
549 else if (((edge == E_GESTURE_EDGE_RIGHT) || (edge == E_GESTURE_EDGE_LEFT)) &&
553 else if (edge_size == E_GESTURE_EDGE_SIZE_FULL)
556 if ((edge == E_GESTURE_EDGE_TOP) || (edge == E_GESTURE_EDGE_BOTTOM))
558 else if ((edge == E_GESTURE_EDGE_RIGHT) || (edge == E_GESTURE_EDGE_LEFT))
563 GTWRN("Invalid edge_size(%d)\n", edge_size);
564 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
568 EINA_LIST_FOREACH_SAFE(gev->edge_swipes.base.fingers[fingers].edge[edge], l, l_next, edata)
570 if ((edata->client == client) && (edata->sp == sp) && (edata->ep == ep))
572 gev->edge_swipes.base.fingers[fingers].edge[edge] = eina_list_remove_list(
573 gev->edge_swipes.base.fingers[fingers].edge[edge], l);
575 flag_removed = EINA_TRUE;
581 if (!_e_gesture_edge_grabbed_client_check(client))
583 _e_gesture_remove_client_destroy_listener(client, E_GESTURE_TYPE_EDGE_SWIPE, fingers, edge, 0, sp, ep);
584 _e_gesture_edge_swipe_current_list_check();
588 gev->edge_swipes.base.enabled_edge &= ~( 1 << edge);
589 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
591 if (eina_list_count(gev->edge_swipes.base.fingers[i].edge[edge]) > 0)
593 gev->edge_swipes.base.enabled_edge |= (1 << edge);
602 _e_gesture_grab_edge_drag(struct wl_client *client,
603 struct wl_resource *resource,
604 uint32_t fingers, uint32_t edge, uint32_t edge_size,
605 uint32_t start_point, uint32_t end_point)
607 E_Gesture_Event *gev;
609 int ret = TIZEN_GESTURE_ERROR_NONE;
611 GTINF("client %p is request edge_drag grab, fingers: %d, edge: 0x%x, edge_size: %d, point( %d - %d)\n", client, fingers, edge, edge_size, start_point, end_point);
612 if (fingers > E_GESTURE_FINGER_MAX)
614 GTWRN("Do not support %d fingers (max: %d)\n", fingers, E_GESTURE_FINGER_MAX);
615 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
619 if (edge < E_GESTURE_EDGE_TOP || edge > E_GESTURE_EDGE_LEFT)
621 GTWRN("Invalid edge(%d)\n", edge);
622 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
626 if (edge_size == E_GESTURE_EDGE_SIZE_PARTIAL)
630 if (((edge == E_GESTURE_EDGE_TOP) || (edge == E_GESTURE_EDGE_BOTTOM)) &&
633 else if (((edge == E_GESTURE_EDGE_RIGHT) || (edge == E_GESTURE_EDGE_LEFT)) &&
637 else if (edge_size == E_GESTURE_EDGE_SIZE_FULL)
640 if ((edge == E_GESTURE_EDGE_TOP) || (edge == E_GESTURE_EDGE_BOTTOM))
642 else if ((edge == E_GESTURE_EDGE_RIGHT) || (edge == E_GESTURE_EDGE_LEFT))
647 GTWRN("Invalid edge_size(%d)\n", edge_size);
648 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
652 gev = &gesture->gesture_events;
654 if (_e_gesture_edge_boundary_check(&gev->edge_drags.base.fingers[fingers], edge, sp, ep))
656 _e_gesture_edge_grab_add(&gev->edge_drags.base.fingers[fingers], client, resource, edge, sp, ep);
658 e_gesture_add_client_destroy_listener(client, E_GESTURE_TYPE_EDGE_DRAG, fingers, edge, 0, sp, ep);
660 gesture->grabbed_gesture |= E_GESTURE_TYPE_EDGE_DRAG;
661 gev->edge_drags.base.fingers[fingers].enabled = EINA_TRUE;
662 if (gev->event_keep) gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
663 gev->edge_drags.base.enabled_edge |= (1 << edge);
665 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
667 ret = TIZEN_GESTURE_ERROR_NONE;
671 ret = TIZEN_GESTURE_ERROR_GRABBED_ALREADY;
679 _e_gesture_ungrab_edge_drag(struct wl_client *client,
680 struct wl_resource *resource,
681 uint32_t fingers, uint32_t edge, uint32_t edge_size,
682 uint32_t start_point, uint32_t end_point)
684 E_Gesture_Event *gev;
685 int ret = TIZEN_GESTURE_ERROR_NONE;
687 Eina_List *l, *l_next;
688 E_Gesture_Event_Edge_Finger_Edge *edata;
689 Eina_Bool flag_removed = EINA_FALSE;
692 GTINF("client %p is request ungrab edge drag gesture, fingers: %d, edge: 0x%x, edge_size: %d, (%d ~ %d)\n", client, fingers, edge, edge_size, start_point, end_point);
694 if (fingers > E_GESTURE_FINGER_MAX)
696 GTWRN("Do not support %d fingers (max: %d)\n", fingers, E_GESTURE_FINGER_MAX);
697 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
701 if (edge_size == E_GESTURE_EDGE_SIZE_PARTIAL)
705 if (((edge == E_GESTURE_EDGE_TOP) || (edge == E_GESTURE_EDGE_BOTTOM)) &&
708 else if (((edge == E_GESTURE_EDGE_RIGHT) || (edge == E_GESTURE_EDGE_LEFT)) &&
712 else if (edge_size == E_GESTURE_EDGE_SIZE_FULL)
715 if ((edge == E_GESTURE_EDGE_TOP) || (edge == E_GESTURE_EDGE_BOTTOM))
717 else if ((edge == E_GESTURE_EDGE_RIGHT) || (edge == E_GESTURE_EDGE_LEFT))
722 GTWRN("Invalid edge_size(%d)\n", edge_size);
723 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
727 gev = &gesture->gesture_events;
729 EINA_LIST_FOREACH_SAFE(gev->edge_drags.base.fingers[fingers].edge[edge], l, l_next, edata)
731 if ((edata->client == client) && (edata->sp == sp) && (edata->ep == ep))
733 gev->edge_drags.base.fingers[fingers].edge[edge] = eina_list_remove_list(
734 gev->edge_drags.base.fingers[fingers].edge[edge], l);
736 flag_removed = EINA_TRUE;
742 if (!_e_gesture_edge_grabbed_client_check(client))
744 _e_gesture_remove_client_destroy_listener(client, E_GESTURE_TYPE_EDGE_DRAG, fingers, edge, 0, sp, ep);
745 _e_gesture_edge_drag_current_list_check();
749 gev->edge_drags.base.enabled_edge &= ~( 1 << edge);
750 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
752 if (eina_list_count(gev->edge_drags.base.fingers[i].edge[edge]) > 0)
754 gev->edge_drags.base.enabled_edge |= (1 << edge);
764 _e_gesture_grab_tap(struct wl_client *client,
765 struct wl_resource *resource,
766 uint32_t fingers, uint32_t repeats)
768 E_Gesture_Event *gev;
769 int ret = TIZEN_GESTURE_ERROR_NONE;
771 GTINF("client %p requested to grab tap gesture (fingers: %d, repeats: %d)\n", client, fingers, repeats);
773 if (fingers > E_GESTURE_FINGER_MAX || repeats > E_GESTURE_TAP_REPEATS_MAX)
775 GTWRN("Not supported fingers /repeats bigger than their maximum values\n");
776 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
780 gev = &gesture->gesture_events;
782 if (gev->taps.fingers[fingers].repeats[repeats].client)
784 GTWRN("%d finger %d repeats is already grabbed by %p client\n", fingers, repeats, gev->taps.fingers[fingers].repeats[repeats].client);
785 ret = TIZEN_GESTURE_ERROR_GRABBED_ALREADY;
789 gev->taps.fingers[fingers].repeats[repeats].client = client;
790 gev->taps.fingers[fingers].repeats[repeats].res = resource;
791 gev->taps.fingers[fingers].enabled = EINA_TRUE;
793 e_gesture_add_client_destroy_listener(client, E_GESTURE_TYPE_TAP, fingers, 0, repeats, 0, 0);
795 if (gev->taps.max_fingers < fingers)
796 gev->taps.max_fingers = fingers;
797 if (gev->taps.fingers[fingers].max_repeats < repeats)
798 gev->taps.fingers[fingers].max_repeats = repeats;
800 gesture->grabbed_gesture |= E_GESTURE_TYPE_TAP;
801 gev->taps.state = E_GESTURE_TAP_STATE_READY;
802 gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
803 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
809 _e_gesture_ungrab_tap(struct wl_client *client,
810 struct wl_resource *resource,
811 uint32_t fingers, uint32_t repeats)
814 E_Gesture_Event *gev;
815 int ret = TIZEN_GESTURE_ERROR_NONE;
817 GTINF("client %p requested to ungrab tap gesture (fingers: %d, repeats: %d)\n", client, fingers, fingers);
819 if (fingers > E_GESTURE_FINGER_MAX || repeats > E_GESTURE_TAP_REPEATS_MAX)
821 GTWRN("Not supported fingers /repeats bigger than their maximum values\n");
822 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
826 gev = &gesture->gesture_events;
828 if (gev->taps.fingers[fingers].repeats[repeats].client == client)
830 gev->taps.fingers[fingers].repeats[repeats].client = NULL;
831 gev->taps.fingers[fingers].repeats[repeats].res = NULL;
834 gev->taps.fingers[fingers].enabled = EINA_FALSE;
835 for (i = 0; i < E_GESTURE_TAP_REPEATS_MAX; i++)
837 if (gev->taps.fingers[fingers].repeats[i].client)
839 gev->taps.fingers[fingers].enabled = EINA_TRUE;
843 gev->taps.fingers[fingers].max_repeats = e_gesture_util_tap_max_repeats_get(fingers);
845 _e_gesture_remove_client_destroy_listener(client, E_GESTURE_TYPE_TAP, fingers, 0, repeats, 0, 0);
846 _e_gesture_tap_current_list_check();
852 _e_gesture_grab_pan(struct wl_client *client, struct wl_resource *resource, uint32_t fingers)
854 E_Gesture_Event *gev;
855 int ret = TIZEN_GESTURE_ERROR_NONE;
857 GTINF("The client %p request to grab pan gesture, fingers: %d\n", client, fingers);
859 if (fingers > E_GESTURE_FINGER_MAX)
861 GTWRN("Do not support %d fingers (max: %d)\n", fingers, E_GESTURE_FINGER_MAX);
862 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
866 gev = &gesture->gesture_events;
868 if (gev->pans.fingers[fingers].client)
870 GTWRN("%d finger is already grabbed by %p client\n", fingers, gev->pans.fingers[fingers].client);
871 ret = TIZEN_GESTURE_ERROR_GRABBED_ALREADY;
875 e_gesture_add_client_destroy_listener(client, E_GESTURE_TYPE_PAN, fingers, 0, 0, 0, 0);
877 gev->pans.fingers[fingers].client = client;
878 gev->pans.fingers[fingers].res = resource;
879 gev->pans.state = E_GESTURE_PANPINCH_STATE_READY;
881 gesture->grabbed_gesture |= E_GESTURE_TYPE_PAN;
882 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
889 _e_gesture_ungrab_pan(struct wl_client *client, struct wl_resource *resource, uint32_t fingers)
891 E_Gesture_Event *gev;
892 int ret = TIZEN_GESTURE_ERROR_NONE;
894 GTINF("The client %p request to ungrab pan gesture, fingers: %d\n", client, fingers);
896 if (fingers > E_GESTURE_FINGER_MAX)
898 GTWRN("Do not support %d fingers (max: %d)\n", fingers, E_GESTURE_FINGER_MAX);
899 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
903 gev = &gesture->gesture_events;
905 if (gev->pans.fingers[fingers].client == client)
907 gev->pans.fingers[fingers].client = NULL;
908 gev->pans.fingers[fingers].res = NULL;
911 _e_gesture_remove_client_destroy_listener(client, E_GESTURE_TYPE_PAN, fingers, 0, 0, 0, 0);
912 _e_gesture_pan_current_list_check();
919 _e_gesture_grab_pinch(struct wl_client *client, struct wl_resource *resource, uint32_t fingers)
921 E_Gesture_Event *gev;
922 int ret = TIZEN_GESTURE_ERROR_NONE;
924 GTINF("The client %p request to grab pinch gesture, fingers: %d\n", client, fingers);
926 if (fingers > E_GESTURE_FINGER_MAX)
928 GTWRN("Do not support %d fingers (max: %d)\n", fingers, E_GESTURE_FINGER_MAX);
929 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
933 gev = &gesture->gesture_events;
935 if (gev->pinchs.fingers[fingers].client)
937 GTWRN("%d finger is already grabbed by %p client\n", fingers, gev->pinchs.fingers[fingers].client);
938 ret = TIZEN_GESTURE_ERROR_GRABBED_ALREADY;
942 e_gesture_add_client_destroy_listener(client, E_GESTURE_TYPE_PINCH, fingers, 0, 0, 0, 0);
944 gev->pinchs.fingers[fingers].client = client;
945 gev->pinchs.fingers[fingers].res = resource;
947 gev->pinchs.state = E_GESTURE_PANPINCH_STATE_READY;
948 gesture->grabbed_gesture |= E_GESTURE_TYPE_PINCH;
949 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
956 _e_gesture_ungrab_pinch(struct wl_client *client, struct wl_resource *resource, uint32_t fingers)
958 E_Gesture_Event *gev;
959 int ret = TIZEN_GESTURE_ERROR_NONE;
961 GTINF("The client %p request to ungrab pinch gesture, fingers: %d\n", client, fingers);
963 if (fingers > E_GESTURE_FINGER_MAX)
965 GTWRN("Do not support %d fingers (max: %d)\n", fingers, E_GESTURE_FINGER_MAX);
966 ret = TIZEN_GESTURE_ERROR_INVALID_DATA;
970 gev = &gesture->gesture_events;
972 if (gev->pinchs.fingers[fingers].client == client)
974 gev->pinchs.fingers[fingers].client = NULL;
975 gev->pinchs.fingers[fingers].res = NULL;
978 _e_gesture_remove_client_destroy_listener(client, E_GESTURE_TYPE_PINCH, fingers, 0, 0, 0, 0);
979 _e_gesture_pinch_current_list_check();
986 _e_gesture_grab_palm_cover(struct wl_client *client, struct wl_resource *resource)
988 E_Gesture_Event *gev;
989 int ret = TIZEN_GESTURE_ERROR_NONE;
991 gev = &gesture->gesture_events;
993 GTINF("The client %p request to grab palm hover gesture\n", client);
995 if (gev->palm_covers.client_info.client)
997 GTWRN("Palm hover is already grabbed by %p client\n", gev->palm_covers.client_info.client);
1001 e_gesture_add_client_destroy_listener(client, E_GESTURE_TYPE_PALM_COVER, 0, 0, 0, 0, 0);
1003 gev->palm_covers.client_info.client = client;
1004 gev->palm_covers.client_info.res = resource;
1006 gesture->grabbed_gesture |= E_GESTURE_TYPE_PALM_COVER;
1007 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
1014 _e_gesture_ungrab_palm_cover(struct wl_client *client, struct wl_resource *resource)
1016 E_Gesture_Event *gev;
1017 int ret = TIZEN_GESTURE_ERROR_NONE;
1019 GTINF("The client %p request to ungrab palm hover gesture\n", client);
1021 gev = &gesture->gesture_events;
1023 if (gev->palm_covers.client_info.client == client)
1025 gev->palm_covers.client_info.client = NULL;
1026 gev->palm_covers.client_info.client = NULL;
1029 _e_gesture_remove_client_destroy_listener(client, E_GESTURE_TYPE_PALM_COVER, 0, 0, 0, 0, 0);
1030 gesture->grabbed_gesture &= ~E_GESTURE_TYPE_PALM_COVER;
1031 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
1037 _e_gesture_select_palm_cover(struct wl_client *client, struct wl_resource *resource,
1038 struct wl_resource *surface)
1040 int ret = TIZEN_GESTURE_ERROR_NONE;
1042 E_Gesture_Event_Palm_Cover *palm_covers = &gesture->gesture_events.palm_covers;
1043 E_Gesture_Select_Surface *sdata;
1045 EINA_LIST_FOREACH(palm_covers->select_surface_list, l, sdata)
1047 if (sdata->surface == surface)
1049 ret = TIZEN_GESTURE_ERROR_GRABBED_ALREADY;
1054 sdata = E_NEW(E_Gesture_Select_Surface, 1);
1057 ret = TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES;
1061 sdata->surface = surface;
1062 sdata->res = resource;
1064 palm_covers->select_surface_list = eina_list_append(palm_covers->select_surface_list, sdata);
1066 _e_gesture_add_surface_destroy_listener(surface, E_GESTURE_TYPE_PALM_COVER);
1073 _e_gesture_deselect_palm_cover(struct wl_client *client, struct wl_resource *resource,
1074 struct wl_resource *surface)
1076 int ret = TIZEN_GESTURE_ERROR_NONE;
1077 Eina_List *l, *l_next;
1078 E_Gesture_Event_Palm_Cover *palm_covers = &gesture->gesture_events.palm_covers;
1079 E_Gesture_Select_Surface *sdata;
1081 EINA_LIST_FOREACH_SAFE(palm_covers->select_surface_list, l, l_next, sdata)
1083 if (sdata->surface == surface)
1085 palm_covers->select_surface_list = eina_list_remove_list(palm_covers->select_surface_list, l);
1091 _e_gesture_remove_surface_destroy_listener(surface, E_GESTURE_TYPE_PALM_COVER);
1097 _e_gesture_server_grab_edge_swipe(unsigned int fingers,
1098 unsigned int edge, unsigned int edge_size,
1099 unsigned int start_point, unsigned int end_point)
1101 int ret = TIZEN_GESTURE_ERROR_NONE;
1103 ret = _e_gesture_grab_edge_swipe(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT,
1104 fingers, edge, edge_size, start_point, end_point);
1110 _e_gesture_server_ungrab_edge_swipe(unsigned int fingers,
1111 unsigned int edge, unsigned int edge_size,
1112 unsigned int start_point, unsigned int end_point)
1114 int ret = TIZEN_GESTURE_ERROR_NONE;
1116 ret = _e_gesture_ungrab_edge_swipe(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers, edge, edge_size, start_point, end_point);
1122 _e_gesture_server_grab_edge_drag(unsigned int fingers,
1123 unsigned int edge, unsigned int edge_size,
1124 unsigned int start_point, unsigned int end_point)
1126 int ret = TIZEN_GESTURE_ERROR_NONE;
1128 ret = _e_gesture_grab_edge_drag(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers, edge, edge_size, start_point, end_point);
1134 _e_gesture_server_ungrab_edge_drag(unsigned int fingers, unsigned int edge, unsigned int edge_size,
1135 unsigned int start_point, unsigned int end_point)
1137 int ret = TIZEN_GESTURE_ERROR_NONE;
1139 ret = _e_gesture_ungrab_edge_drag(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers, edge, edge_size, start_point, end_point);
1145 _e_gesture_server_grab_tap(unsigned int fingers, unsigned int repeats)
1147 int ret = TIZEN_GESTURE_ERROR_NONE;
1149 ret = _e_gesture_grab_tap(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers, repeats);
1155 _e_gesture_server_ungrab_tap(unsigned int fingers, unsigned int repeats)
1157 int ret = TIZEN_GESTURE_ERROR_NONE;
1159 ret = _e_gesture_ungrab_tap(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers, repeats);
1165 _e_gesture_server_grab_palm_cover(void)
1167 int ret = TIZEN_GESTURE_ERROR_NONE;
1169 ret = _e_gesture_grab_palm_cover(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT);
1175 _e_gesture_server_ungrab_palm_cover(void)
1177 int ret = TIZEN_GESTURE_ERROR_NONE;
1179 ret = _e_gesture_ungrab_palm_cover(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT);
1185 _e_gesture_server_grab_pan(unsigned int fingers)
1187 int ret = TIZEN_GESTURE_ERROR_NONE;
1189 ret = _e_gesture_grab_pan(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers);
1195 _e_gesture_server_ungrab_pan(unsigned int fingers)
1197 int ret = TIZEN_GESTURE_ERROR_NONE;
1199 ret = _e_gesture_ungrab_pan(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers);
1205 _e_gesture_server_grab_pinch(unsigned int fingers)
1207 int ret = TIZEN_GESTURE_ERROR_NONE;
1209 ret = _e_gesture_grab_pinch(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers);
1215 _e_gesture_server_ungrab_pinch(unsigned int fingers)
1217 int ret = TIZEN_GESTURE_ERROR_NONE;
1219 ret = _e_gesture_ungrab_pinch(E_GESTURE_SERVER_CLIENT, E_GESTURE_SERVER_CLIENT, fingers);
1225 _e_gesture_deactivate_find_surface(Eina_List *list, struct wl_resource *surface)
1228 E_Gesture_Activate_Surface_Info *idata;
1230 EINA_LIST_FOREACH(list, l, idata)
1232 if (surface == idata->surface)
1241 _e_gesture_deactivate_list_unset(struct wl_client *client, struct wl_resource *surface, E_Gesture_Activate_Info *info, unsigned int type)
1243 Eina_List *l, *l_next;
1244 struct wl_resource *surface_data;
1248 EINA_LIST_FOREACH_SAFE(info->surfaces, l, l_next, surface_data)
1250 if (surface_data == surface)
1252 info->surfaces = eina_list_remove_list(info->surfaces, l);
1257 else if (info->client && (info->client == client))
1259 info->client = NULL;
1260 info->active = EINA_TRUE;
1264 GTWRN("Failed to unset %s deactivate. surface: %p, client: %p (already deactivated client: %p)\n", _e_gesture_util_type_to_string(type), surface, client, info->client);
1269 _e_gesture_deactivate_cb_client_listener(struct wl_listener *l, void *data)
1271 struct wl_client *client = data;
1273 _e_gesture_deactivate_list_unset(client, NULL, &gesture->gesture_events.edge_swipes.base.activation, E_GESTURE_TYPE_EDGE_SWIPE);
1274 _e_gesture_deactivate_list_unset(client, NULL, &gesture->gesture_events.taps.activation, E_GESTURE_TYPE_TAP);
1275 _e_gesture_deactivate_list_unset(client, NULL, &gesture->gesture_events.palm_covers.activation, E_GESTURE_TYPE_PALM_COVER);
1276 _e_gesture_deactivate_list_unset(client, NULL, &gesture->gesture_events.pans.activation, E_GESTURE_TYPE_PAN);
1277 _e_gesture_deactivate_list_unset(client, NULL, &gesture->gesture_events.pinchs.activation, E_GESTURE_TYPE_PINCH);
1279 wl_list_remove(&l->link);
1284 _e_gesture_deactivate_cb_surface_listener(struct wl_listener *l, void *data)
1286 struct wl_resource *surface = data;
1288 _e_gesture_deactivate_list_unset(NULL, surface, &gesture->gesture_events.edge_swipes.base.activation, E_GESTURE_TYPE_EDGE_SWIPE);
1289 _e_gesture_deactivate_list_unset(NULL, surface, &gesture->gesture_events.taps.activation, E_GESTURE_TYPE_TAP);
1290 _e_gesture_deactivate_list_unset(NULL, surface, &gesture->gesture_events.palm_covers.activation, E_GESTURE_TYPE_PALM_COVER);
1291 _e_gesture_deactivate_list_unset(NULL, surface, &gesture->gesture_events.pans.activation, E_GESTURE_TYPE_PAN);
1292 _e_gesture_deactivate_list_unset(NULL, surface, &gesture->gesture_events.pinchs.activation, E_GESTURE_TYPE_PINCH);
1294 wl_list_remove(&l->link);
1299 _e_gesture_deactivate_listener_add(struct wl_client *client, struct wl_resource * surface)
1301 struct wl_listener *destroy_listener = NULL;
1303 EINA_SAFETY_ON_FALSE_RETURN_VAL(client || surface, TIZEN_GESTURE_ERROR_INVALID_DATA);
1305 destroy_listener = E_NEW(struct wl_listener, 1);
1306 if (!destroy_listener)
1308 GTERR("Failed to allocate memory for deactivate destroy listener !\n");
1309 return TIZEN_GESTURE_ERROR_NO_SYSTEM_RESOURCES;
1314 destroy_listener->notify = _e_gesture_deactivate_cb_surface_listener;
1315 wl_resource_add_destroy_listener(surface, destroy_listener);
1319 destroy_listener->notify = _e_gesture_deactivate_cb_client_listener;
1320 wl_client_add_destroy_listener(client, destroy_listener);
1323 return TIZEN_GESTURE_ERROR_NONE;
1327 _e_gesture_deactivate_list_set(struct wl_client *client, struct wl_resource *surface, E_Gesture_Activate_Info *info, unsigned int type)
1329 int ret = TIZEN_GESTURE_ERROR_NONE;
1333 if (!_e_gesture_deactivate_find_surface(info->surfaces, surface))
1335 info->surfaces = eina_list_append(info->surfaces, surface);
1336 _e_gesture_deactivate_listener_add(client, surface);
1339 else if (!info->client)
1341 info->client = client;
1342 info->active = EINA_FALSE;
1343 _e_gesture_deactivate_listener_add(client, surface);
1347 GTWRN("Failed to deactivate %s !(request surface: %p, client: %p), already deactivated client: %p\n",
1348 _e_gesture_util_type_to_string(type), surface, client, info->client);
1349 ret = TIZEN_GESTURE_ERROR_GRABBED_ALREADY;
1356 _e_gesture_deactivate_set(struct wl_client *client,
1357 struct wl_resource *resource,
1358 struct wl_resource *surface,
1361 int ret = TIZEN_GESTURE_ERROR_NONE;
1363 if (type & E_GESTURE_TYPE_EDGE_SWIPE)
1365 ret = _e_gesture_deactivate_list_set(client, surface, &gesture->gesture_events.edge_swipes.base.activation, E_GESTURE_TYPE_EDGE_SWIPE);
1367 if (type & E_GESTURE_TYPE_TAP)
1369 ret = _e_gesture_deactivate_list_set(client, surface, &gesture->gesture_events.taps.activation, E_GESTURE_TYPE_TAP);
1371 if (type & E_GESTURE_TYPE_PALM_COVER)
1373 ret = _e_gesture_deactivate_list_set(client, surface, &gesture->gesture_events.palm_covers.activation, E_GESTURE_TYPE_PALM_COVER);
1375 if (type & E_GESTURE_TYPE_PAN)
1377 ret = _e_gesture_deactivate_list_set(client, surface, &gesture->gesture_events.pans.activation, E_GESTURE_TYPE_PAN);
1379 if (type & E_GESTURE_TYPE_PINCH)
1381 ret = _e_gesture_deactivate_list_set(client, surface, &gesture->gesture_events.pinchs.activation, E_GESTURE_TYPE_PINCH);
1388 _e_gesture_deactivate_unset(struct wl_client *client,
1389 struct wl_resource *resource,
1390 struct wl_resource *surface,
1393 int ret = TIZEN_GESTURE_ERROR_NONE;
1395 if (type & E_GESTURE_TYPE_EDGE_SWIPE)
1397 _e_gesture_deactivate_list_unset(client, surface, &gesture->gesture_events.edge_swipes.base.activation, E_GESTURE_TYPE_EDGE_SWIPE);
1399 if (type & E_GESTURE_TYPE_TAP)
1401 _e_gesture_deactivate_list_unset(client, surface, &gesture->gesture_events.taps.activation, E_GESTURE_TYPE_TAP);
1403 if (type & E_GESTURE_TYPE_PALM_COVER)
1405 _e_gesture_deactivate_list_unset(client, surface, &gesture->gesture_events.palm_covers.activation, E_GESTURE_TYPE_PALM_COVER);
1407 if (type & E_GESTURE_TYPE_PAN)
1409 _e_gesture_deactivate_list_unset(client, surface, &gesture->gesture_events.pans.activation, E_GESTURE_TYPE_PAN);
1411 if (type & E_GESTURE_TYPE_PINCH)
1413 _e_gesture_deactivate_list_unset(client, surface, &gesture->gesture_events.pinchs.activation, E_GESTURE_TYPE_PINCH);
1420 _e_gesture_cb_grab_edge_swipe(struct wl_client *client,
1421 struct wl_resource *resource,
1422 uint32_t fingers, uint32_t edge, uint32_t edge_size,
1423 uint32_t start_point, uint32_t end_point)
1425 int ret = TIZEN_GESTURE_ERROR_NONE;
1427 ret = _e_gesture_grab_edge_swipe(client, resource, fingers, edge, edge_size, start_point, end_point);
1429 tizen_gesture_send_grab_edge_swipe_notify(resource, fingers, edge, edge_size, start_point, end_point, ret);
1433 _e_gesture_cb_ungrab_edge_swipe(struct wl_client *client,
1434 struct wl_resource *resource,
1435 uint32_t fingers, uint32_t edge, uint32_t edge_size,
1436 uint32_t start_point, uint32_t end_point)
1438 int ret = TIZEN_GESTURE_ERROR_NONE;
1440 ret = _e_gesture_ungrab_edge_swipe(client, resource, fingers, edge, edge_size, start_point, end_point);
1442 tizen_gesture_send_grab_edge_swipe_notify(resource, fingers, edge, edge_size, start_point, end_point, ret);
1446 _e_gesture_cb_grab_edge_drag(struct wl_client *client,
1447 struct wl_resource *resource,
1448 uint32_t fingers, uint32_t edge, uint32_t edge_size,
1449 uint32_t start_point, uint32_t end_point)
1451 int ret = TIZEN_GESTURE_ERROR_NONE;
1453 ret = _e_gesture_grab_edge_drag(client, resource, fingers, edge, edge_size, start_point, end_point);
1455 tizen_gesture_send_grab_edge_swipe_notify(resource, fingers, edge, edge_size, start_point, end_point, ret);
1459 _e_gesture_cb_ungrab_edge_drag(struct wl_client *client,
1460 struct wl_resource *resource,
1461 uint32_t fingers, uint32_t edge, uint32_t edge_size,
1462 uint32_t start_point, uint32_t end_point)
1464 int ret = TIZEN_GESTURE_ERROR_NONE;
1466 ret = _e_gesture_ungrab_edge_drag(client, resource, fingers, edge, edge_size, start_point, end_point);
1468 tizen_gesture_send_grab_edge_swipe_notify(resource, fingers, edge, edge_size, start_point, end_point, ret);
1472 _e_gesture_cb_grab_tap(struct wl_client *client,
1473 struct wl_resource *resource,
1474 uint32_t fingers, uint32_t repeats)
1476 int ret = TIZEN_GESTURE_ERROR_NONE;
1478 ret = _e_gesture_grab_tap(client, resource, fingers, repeats);
1480 tizen_gesture_send_tap_notify(resource, fingers, repeats, ret);
1484 _e_gesture_cb_ungrab_tap(struct wl_client *client,
1485 struct wl_resource *resource,
1486 uint32_t fingers, uint32_t repeats)
1488 int ret = TIZEN_GESTURE_ERROR_NONE;
1490 ret = _e_gesture_ungrab_tap(client, resource, fingers, repeats);
1492 tizen_gesture_send_tap_notify(resource, fingers, repeats, ret);
1496 _e_gesture_cb_grab_palm_cover(struct wl_client *client,
1497 struct wl_resource *resource)
1499 int ret = TIZEN_GESTURE_ERROR_NONE;
1501 ret = _e_gesture_grab_palm_cover(client, resource);
1503 tizen_gesture_send_palm_cover_notify(resource, NULL, ret);
1507 _e_gesture_cb_ungrab_palm_cover(struct wl_client *client,
1508 struct wl_resource *resource)
1510 int ret = TIZEN_GESTURE_ERROR_NONE;
1512 ret = _e_gesture_ungrab_palm_cover(client, resource);
1514 tizen_gesture_send_palm_cover_notify(resource, NULL, ret);
1518 _e_gesture_cb_select_palm_cover(struct wl_client *client,
1519 struct wl_resource *resource,
1520 struct wl_resource *surface)
1522 int ret = TIZEN_GESTURE_ERROR_NONE;
1524 ret = _e_gesture_select_palm_cover(client, resource, surface);
1526 tizen_gesture_send_palm_cover_notify(resource, surface, ret);
1530 _e_gesture_cb_deselect_palm_cover(struct wl_client *client,
1531 struct wl_resource *resource,
1532 struct wl_resource *surface)
1534 int ret = TIZEN_GESTURE_ERROR_NONE;
1536 ret = _e_gesture_deselect_palm_cover(client, resource, surface);
1538 tizen_gesture_send_palm_cover_notify(resource, surface, ret);
1542 _e_gesture_cb_activate_set(struct wl_client *client,
1543 struct wl_resource *resource,
1544 struct wl_resource *surface,
1545 uint32_t type, uint32_t active)
1547 int ret = TIZEN_GESTURE_ERROR_NONE;
1550 ret = _e_gesture_deactivate_set(client, resource, surface, type);
1552 ret = _e_gesture_deactivate_unset(client, resource, surface, type);
1554 tizen_gesture_send_activate_notify(resource, surface, type, active, ret);
1558 _e_gesture_cb_destroy(struct wl_client *client, struct wl_resource *resource)
1560 wl_resource_destroy(resource);
1563 static const struct tizen_gesture_interface _e_gesture_implementation = {
1564 _e_gesture_cb_grab_edge_swipe,
1565 _e_gesture_cb_ungrab_edge_swipe,
1566 _e_gesture_cb_grab_edge_drag,
1567 _e_gesture_cb_ungrab_edge_drag,
1568 _e_gesture_cb_grab_tap,
1569 _e_gesture_cb_ungrab_tap,
1570 _e_gesture_cb_grab_palm_cover,
1571 _e_gesture_cb_ungrab_palm_cover,
1572 _e_gesture_cb_select_palm_cover,
1573 _e_gesture_cb_deselect_palm_cover,
1574 _e_gesture_cb_activate_set,
1575 _e_gesture_cb_destroy,
1578 /* tizen_gesture global object bind function */
1580 _e_gesture_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
1582 struct wl_resource *resource;
1584 resource = wl_resource_create(client, &tizen_gesture_interface, version, id);
1586 GTDBG("wl_resource_create(...,tizen_gesture_interface,...)\n");
1590 GTERR("Failed to create resource ! (version :%d, id:%d)\n", version, id);
1591 wl_client_post_no_memory(client);
1595 wl_resource_set_implementation(resource, &_e_gesture_implementation, NULL, NULL);
1599 _e_gesture_event_filter(void *data, void *loop_data EINA_UNUSED, int type, void *event)
1603 if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
1605 gesture->gesture_events.num_pressed++;
1607 else if (type == ECORE_EVENT_MOUSE_BUTTON_UP)
1609 gesture->gesture_events.num_pressed--;
1610 if (gesture->gesture_events.num_pressed < 0)
1611 gesture->gesture_events.num_pressed = 0;
1612 if (gesture->gesture_events.num_pressed == 0)
1614 if (!gesture->enable && gesture->enabled_window)
1616 e_gesture_event_filter_enable(EINA_TRUE);
1619 else if (gesture->enable && !gesture->enabled_window)
1621 e_gesture_event_filter_enable(EINA_FALSE);
1622 return e_gesture_process_events(event, type);
1626 if (!gesture->enable) return EINA_TRUE;
1628 return e_gesture_process_events(event, type);
1632 _e_gesture_deactivate_surface_list_check(struct wl_resource *surface, E_Gesture_Activate_Info *info)
1636 res = _e_gesture_deactivate_find_surface(info->surfaces, surface);
1638 if (res) info->active = EINA_FALSE;
1639 else info->active = EINA_TRUE;
1643 _e_gesture_deactivate_surface_check(E_Client *ec)
1645 struct wl_resource *surface;
1647 EINA_SAFETY_ON_NULL_RETURN(ec);
1648 EINA_SAFETY_ON_NULL_RETURN(ec->comp_data);
1650 surface = ec->comp_data->wl_surface;
1651 if (!surface) return;
1653 if (!gesture->gesture_events.edge_swipes.base.activation.client)
1655 _e_gesture_deactivate_surface_list_check(surface, &gesture->gesture_events.edge_swipes.base.activation);
1657 if (!gesture->gesture_events.taps.activation.client)
1659 _e_gesture_deactivate_surface_list_check(surface, &gesture->gesture_events.taps.activation);
1661 if (!gesture->gesture_events.palm_covers.activation.client)
1663 _e_gesture_deactivate_surface_list_check(surface, &gesture->gesture_events.palm_covers.activation);
1665 if (!gesture->gesture_events.pans.activation.client)
1667 _e_gesture_deactivate_surface_list_check(surface, &gesture->gesture_events.pans.activation);
1669 if (!gesture->gesture_events.pinchs.activation.client)
1671 _e_gesture_deactivate_surface_list_check(surface, &gesture->gesture_events.pinchs.activation);
1676 _e_gesture_window_gesture_disabled_change(E_Client *ec)
1678 if (ec->gesture_disable && gesture->enable)
1680 GTINF("Gesture disabled window\n");
1681 gesture->enabled_window = EINA_FALSE;
1683 else if (!ec->gesture_disable && !gesture->enable)
1685 GTINF("Gesture enabled window\n");
1686 gesture->enabled_window = EINA_TRUE;
1689 if (gesture->gesture_events.num_pressed == 0)
1691 e_gesture_event_filter_enable(gesture->enabled_window);
1696 _e_gesture_cb_client_focus_in(void *data, int type, void *event)
1699 E_Event_Client *ev = (E_Event_Client *)event;
1701 EINA_SAFETY_ON_NULL_RETURN_VAL(ev, ECORE_CALLBACK_PASS_ON);
1703 EINA_SAFETY_ON_NULL_RETURN_VAL(ec, ECORE_CALLBACK_PASS_ON);
1704 EINA_SAFETY_ON_NULL_RETURN_VAL(ec->comp_data, ECORE_CALLBACK_PASS_ON);
1706 _e_gesture_window_gesture_disabled_change(ec);
1707 _e_gesture_deactivate_surface_check(ec);
1708 e_gesture_event_deactivate_check();
1710 return ECORE_CALLBACK_PASS_ON;
1714 _e_gesture_cb_aux_hint_change(void *data EINA_UNUSED, E_Client *ec)
1717 Eina_List *list, *l;
1718 Eina_Bool res_return = EINA_FALSE;
1719 if (e_object_is_del(E_OBJECT(ec)) || !ec->comp_data) return;
1720 if (!ec->comp_data->aux_hint.changed) return;
1722 list = e_service_quickpanels_get();
1723 EINA_LIST_FOREACH(list, l, qp_ec)
1725 /* Return if the aux hint change didn't happen to the focused ec */
1726 if ((ec != qp_ec) &&
1727 (ec != e_client_focused_get()))
1729 res_return = EINA_TRUE;
1733 list = eina_list_free(list);
1735 if (res_return) return;
1737 _e_gesture_window_gesture_disabled_change(ec);
1741 _e_gesture_init_handlers(void)
1743 gesture->ef_handler = ecore_event_filter_add(NULL, _e_gesture_event_filter, NULL, NULL);
1745 gesture->handlers = eina_list_append(gesture->handlers,
1746 ecore_event_handler_add(E_EVENT_CLIENT_FOCUS_IN,
1747 _e_gesture_cb_client_focus_in, NULL));
1749 gesture->hooks = eina_list_append(gesture->hooks,
1750 e_client_hook_add(E_CLIENT_HOOK_AUX_HINT_CHANGE,
1751 _e_gesture_cb_aux_hint_change, NULL));
1755 e_gesture->edge_swipe.grab = _e_gesture_server_grab_edge_swipe;
1756 e_gesture->edge_swipe.ungrab = _e_gesture_server_ungrab_edge_swipe;
1757 e_gesture->edge_drag.grab = _e_gesture_server_grab_edge_drag;
1758 e_gesture->edge_drag.ungrab = _e_gesture_server_ungrab_edge_drag;
1759 e_gesture->tap.grab = _e_gesture_server_grab_tap;
1760 e_gesture->tap.ungrab = _e_gesture_server_ungrab_tap;
1761 e_gesture->palm_cover.grab = _e_gesture_server_grab_palm_cover;
1762 e_gesture->palm_cover.ungrab = _e_gesture_server_ungrab_palm_cover;
1763 e_gesture->pan.grab = _e_gesture_server_grab_pan;
1764 e_gesture->pan.ungrab = _e_gesture_server_ungrab_pan;
1765 e_gesture->pinch.grab = _e_gesture_server_grab_pinch;
1766 e_gesture->pinch.ungrab = _e_gesture_server_ungrab_pinch;
1771 _e_gesture_deinit_handlers(void)
1773 Ecore_Event_Handler *event_handler;
1774 E_Client_Hook *hook;
1776 ecore_event_filter_del(gesture->ef_handler);
1778 EINA_LIST_FREE(gesture->handlers, event_handler)
1780 ecore_event_handler_del(event_handler);
1783 EINA_LIST_FREE(gesture->hooks, hook)
1785 e_client_hook_del(hook);
1789 e_gesture->edge_swipe.grab = NULL;
1790 e_gesture->edge_swipe.ungrab = NULL;
1791 e_gesture->edge_drag.grab = NULL;
1792 e_gesture->edge_drag.ungrab = NULL;
1793 e_gesture->tap.grab = NULL;
1794 e_gesture->tap.ungrab = NULL;
1795 e_gesture->palm_cover.grab = NULL;
1796 e_gesture->palm_cover.ungrab = NULL;
1797 e_gesture->pan.grab = NULL;
1798 e_gesture->pan.ungrab = NULL;
1799 e_gesture->pinch.grab = NULL;
1800 e_gesture->pinch.ungrab = NULL;
1804 static E_Gesture_Config_Data *
1805 _e_gesture_init(E_Module *m)
1807 E_Gesture_Config_Data *gconfig = NULL;
1809 gesture = E_NEW(E_Gesture, 1);
1812 GTERR("Failed to allocate memory for gesture !\n");
1818 GTERR("Failed to initialize gesture module ! (e_comp == NULL)\n");
1822 /* Add filtering mechanism
1823 * FIXME: Add handlers after first gesture is grabbed
1825 _e_gesture_init_handlers();
1828 gconfig = E_NEW(E_Gesture_Config_Data, 1);
1829 EINA_SAFETY_ON_NULL_GOTO(gconfig, err);
1830 gconfig->module = m;
1832 e_gesture_conf_init(gconfig);
1833 EINA_SAFETY_ON_NULL_GOTO(gconfig->conf, err);
1834 gesture->config = gconfig;
1836 GTDBG("gesture config value\n");
1837 GTDBG("key_device_name: %s, event_keep: %d\n", gconfig->conf->key_device_name, gconfig->conf->event_keep);
1838 GTDBG("edge_swipe\n");
1839 GTDBG("\ttime_done: %lf, time_begin: %lf, area_offset: %d\n", gconfig->conf->edge_swipe.time_done,
1840 gconfig->conf->edge_swipe.time_begin,
1841 gconfig->conf->edge_swipe.area_offset);
1842 GTDBG("\tmin_length: %d, max_length: %d, compose_key: %d, back_key: %d\n", gconfig->conf->edge_swipe.min_length,
1843 gconfig->conf->edge_swipe.max_length,
1844 gconfig->conf->edge_swipe.compose_key,
1845 gconfig->conf->edge_swipe.back_key);
1847 GTDBG("\trepeats_max: %d, moving_range: %d\n", gconfig->conf->tap.repeats_max,
1848 gconfig->conf->tap.moving_range);
1849 GTDBG("\ttime_start: %lf, time_done: %lf, time_interval: %lf\n", gconfig->conf->tap.time_start,
1850 gconfig->conf->tap.time_done,
1851 gconfig->conf->tap.time_interval);
1852 GTDBG("pan time_start: %lf, moving_range: %d\n", gconfig->conf->pan.time_start, gconfig->conf->pan.moving_range);
1853 GTDBG("pinch moving_distance_range: %lf\n", gconfig->conf->pinch.moving_distance_range);
1855 gesture->global = wl_global_create(e_comp_wl->wl.disp, &tizen_gesture_interface, 2, gesture, _e_gesture_cb_bind);
1856 if (!gesture->global)
1858 GTERR("Failed to create global !\n");
1862 gesture->gesture_filter = E_GESTURE_TYPE_MAX;
1864 gesture->gesture_events.edge_swipes.base.activation.active = EINA_TRUE;
1865 gesture->gesture_events.edge_drags.base.activation.active = EINA_TRUE;
1866 gesture->gesture_events.taps.activation.active = EINA_TRUE;
1867 gesture->gesture_events.palm_covers.activation.active = EINA_TRUE;
1868 gesture->gesture_events.pans.activation.active = EINA_TRUE;
1869 gesture->gesture_events.pinchs.activation.active = EINA_TRUE;
1871 gesture->gesture_events.event_keep = gconfig->conf->event_keep;
1872 if (gconfig->conf->edge_swipe.default_enable_back)
1874 gesture->grabbed_gesture |= E_GESTURE_TYPE_EDGE_SWIPE;
1875 gesture->gesture_events.edge_swipes.base.fingers[1].enabled = EINA_TRUE;
1876 _e_gesture_edge_grab_add(&gesture->gesture_events.edge_swipes.base.fingers[1], (void *)0x1, (void *)0x1, E_GESTURE_EDGE_TOP, 0, 0);
1877 gesture->gesture_events.edge_swipes.base.enabled_edge |= (1 << E_GESTURE_EDGE_TOP);
1878 if (gesture->gesture_events.event_keep)
1880 gesture->event_state = E_GESTURE_EVENT_STATE_KEEP;
1884 e_gesture_device_keydev_set(gesture->config->conf->key_device_name);
1885 gesture->enable = EINA_TRUE;
1890 if (gconfig) e_gesture_conf_deinit(gconfig);
1891 if (gesture && gesture->ef_handler) ecore_event_filter_del(gesture->ef_handler);
1892 if (gesture) E_FREE(gesture);
1898 e_modapi_init(E_Module *m)
1900 return _e_gesture_init(m);
1904 e_modapi_shutdown(E_Module *m)
1906 Eina_List *l, *l_next;
1907 E_Gesture_Grabbed_Client *gclient;
1908 E_Gesture_Event_Info *event_info;
1909 E_Gesture_Config_Data *gconfig = m->data;
1911 e_gesture_conf_deinit(gconfig);
1912 e_gesture_device_shutdown();
1913 _e_gesture_deinit_handlers();
1915 EINA_LIST_FOREACH_SAFE(gesture->grab_client_list, l, l_next, gclient)
1917 if (gclient->destroy_listener)
1919 wl_list_remove(&gclient->destroy_listener->link);
1920 E_FREE(gclient->destroy_listener);
1923 gesture->grab_client_list = eina_list_remove_list(gesture->grab_client_list, l);
1926 EINA_LIST_FOREACH_SAFE(gesture->event_queue, l, l_next, event_info)
1928 E_FREE(event_info->event);
1930 gesture->event_queue = eina_list_remove_list(gesture->event_queue, l);
1937 e_modapi_save(E_Module *m)
1939 /* Save something to be kept */
1940 E_Gesture_Config_Data *gconfig = m->data;
1941 e_config_domain_save("module.gesture",
1948 _e_gesture_remove_client_edge_swipe(struct wl_client *client, E_Gesture_Grabbed_Client *gclient)
1952 E_Gesture_Event_Edge_Swipe *edge_swipes = &gesture->gesture_events.edge_swipes;
1953 E_Gesture_Event_Edge_Finger_Edge *edata;
1955 for (i = 0; i < E_GESTURE_FINGER_MAX + 1; i++)
1957 if (gclient->edge_swipe_fingers[i].enabled)
1959 for (j = 0; j < E_GESTURE_EDGE_MAX + 1; j++)
1961 EINA_LIST_FOREACH_SAFE(edge_swipes->base.fingers[i].edge[j], l, ll, edata)
1963 if (edata->client == client)
1965 edge_swipes->base.fingers[i].edge[j] = eina_list_remove_list(edge_swipes->base.fingers[i].edge[j], l);
1969 EINA_LIST_FOREACH_SAFE(gclient->edge_swipe_fingers[i].edge[j], l, ll, edata)
1971 if (edata->client == client)
1973 gclient->edge_swipe_fingers[i].edge[j] = eina_list_remove_list(gclient->edge_swipe_fingers[i].edge[j], l);
1983 _e_gesture_remove_client_edge_drag(struct wl_client *client, E_Gesture_Grabbed_Client *gclient)
1987 E_Gesture_Event_Edge_Drag *edge_drags = &gesture->gesture_events.edge_drags;
1988 E_Gesture_Event_Edge_Finger_Edge *edata;
1990 for (i = 0; i < E_GESTURE_FINGER_MAX + 1; i++)
1992 if (gclient->edge_drag_fingers[i].enabled)
1994 for (j = 0; j < E_GESTURE_EDGE_MAX + 1; j++)
1996 EINA_LIST_FOREACH_SAFE(edge_drags->base.fingers[i].edge[j], l, ll, edata)
1998 if (edata->client == client)
2000 edge_drags->base.fingers[i].edge[j] = eina_list_remove_list(edge_drags->base.fingers[i].edge[j], l);
2004 EINA_LIST_FOREACH_SAFE(gclient->edge_drag_fingers[i].edge[j], l, ll, edata)
2006 if (edata->client == client)
2008 gclient->edge_drag_fingers[i].edge[j] = eina_list_remove_list(gclient->edge_drag_fingers[i].edge[j], l);
2019 _e_gesture_remove_client_tap(struct wl_client *client, E_Gesture_Grabbed_Client *gclient)
2023 for (i = 0; i < E_GESTURE_FINGER_MAX + 1; i++)
2025 for (j = 0; j < E_GESTURE_TAP_REPEATS_MAX + 1; j++)
2027 if (gclient->tap_fingers[i].repeats[j].client)
2029 if (gesture->gesture_events.taps.fingers[i].repeats[j].client == client)
2031 gesture->gesture_events.taps.fingers[i].repeats[j].client = NULL;
2032 gesture->gesture_events.taps.fingers[i].repeats[j].res = NULL;
2035 gclient->tap_fingers[i].repeats[j].client = NULL;
2041 _e_gesture_remove_client_pan(struct wl_client *client, E_Gesture_Grabbed_Client *gclient)
2045 for (i = 0; i < E_GESTURE_FINGER_MAX + 1; i++)
2047 if (gclient->pan_fingers[i].client)
2049 gesture->gesture_events.pans.fingers[i].client = NULL;
2050 gesture->gesture_events.pans.fingers[i].res = NULL;
2052 gclient->pan_fingers[i].client = NULL;
2057 _e_gesture_remove_client_pinch(struct wl_client *client, E_Gesture_Grabbed_Client *gclient)
2061 for (i = 0; i < E_GESTURE_FINGER_MAX + 1; i++)
2063 if (gclient->pinch_fingers[i].client)
2065 gesture->gesture_events.pinchs.fingers[i].client = NULL;
2066 gesture->gesture_events.pinchs.fingers[i].res = NULL;
2068 gclient->pinch_fingers[i].client = NULL;
2073 _e_gesture_remove_client_palm_cover(struct wl_client *client, E_Gesture_Grabbed_Client *gclient)
2075 if (gclient->palm_cover.client)
2077 gesture->gesture_events.palm_covers.client_info.client = NULL;
2078 gesture->gesture_events.palm_covers.client_info.res = NULL;
2080 gclient->palm_cover.client = NULL;
2085 _e_gesture_wl_client_cb_destroy(struct wl_listener *l, void *data)
2087 struct wl_client *client = data;
2088 Eina_List *l_list, *l_next;
2089 E_Gesture_Grabbed_Client *client_data;
2090 unsigned int removed_gesture = 0x0;
2092 EINA_LIST_FOREACH_SAFE(gesture->grab_client_list, l_list, l_next, client_data)
2094 if (client_data->client == client)
2096 if (client_data->grabbed_gesture & E_GESTURE_TYPE_EDGE_SWIPE)
2098 _e_gesture_remove_client_edge_swipe(client, client_data);
2099 removed_gesture |= E_GESTURE_TYPE_EDGE_SWIPE;
2101 if (client_data->grabbed_gesture & E_GESTURE_TYPE_EDGE_DRAG)
2103 _e_gesture_remove_client_edge_drag(client, client_data);
2104 removed_gesture |= E_GESTURE_TYPE_EDGE_SWIPE;
2106 if (client_data->grabbed_gesture & E_GESTURE_TYPE_TAP)
2108 _e_gesture_remove_client_tap(client, client_data);
2109 removed_gesture |= E_GESTURE_TYPE_TAP;
2111 if (client_data->grabbed_gesture & E_GESTURE_TYPE_PAN)
2113 _e_gesture_remove_client_pan(client, client_data);
2114 removed_gesture |= E_GESTURE_TYPE_PAN;
2116 if (client_data->grabbed_gesture & E_GESTURE_TYPE_PINCH)
2118 _e_gesture_remove_client_pinch(client, client_data);
2119 removed_gesture |= E_GESTURE_TYPE_PINCH;
2121 if (client_data->grabbed_gesture & E_GESTURE_TYPE_PALM_COVER)
2123 _e_gesture_remove_client_palm_cover(client, client_data);
2124 removed_gesture |= E_GESTURE_TYPE_PALM_COVER;
2129 if (removed_gesture & E_GESTURE_TYPE_EDGE_SWIPE)
2130 _e_gesture_edge_swipe_current_list_check();
2131 if (removed_gesture & E_GESTURE_TYPE_EDGE_DRAG)
2132 _e_gesture_edge_drag_current_list_check();
2133 if (removed_gesture & E_GESTURE_TYPE_TAP)
2134 _e_gesture_tap_current_list_check();
2135 if (removed_gesture & E_GESTURE_TYPE_PAN)
2136 _e_gesture_pan_current_list_check();
2137 if (removed_gesture & E_GESTURE_TYPE_PINCH)
2138 _e_gesture_pinch_current_list_check();
2139 if (removed_gesture & E_GESTURE_TYPE_PALM_COVER)
2140 gesture->grabbed_gesture &= ~E_GESTURE_TYPE_PALM_COVER;
2142 wl_list_remove(&l->link);
2145 EINA_LIST_FOREACH_SAFE(gesture->grab_client_list, l_list, l_next, client_data)
2147 if (client_data->client == client)
2149 gesture->grab_client_list = eina_list_remove(gesture->grab_client_list, client_data);
2150 E_FREE(client_data);
2154 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
2158 _e_gesture_wl_surface_cb_destroy(struct wl_listener *l, void *data)
2160 struct wl_resource *surface = (struct wl_resource *)data;
2161 E_Gesture_Event_Palm_Cover *palm_covers = &gesture->gesture_events.palm_covers;
2162 Eina_List *list, *l_next;
2163 struct wl_resource *surface_data;
2164 E_Gesture_Select_Surface *sdata;
2166 EINA_LIST_FOREACH_SAFE(gesture->select_surface_list, list, l_next, surface_data)
2168 if (surface_data == surface)
2170 gesture->select_surface_list = eina_list_remove_list(gesture->select_surface_list, list);
2174 EINA_LIST_FOREACH_SAFE(palm_covers->select_surface_list, list, l_next, sdata)
2176 if (sdata->surface == surface)
2178 palm_covers->select_surface_list = eina_list_remove_list(palm_covers->select_surface_list, list);
2183 wl_list_remove(&l->link);
2188 e_gesture_event_filter_enable(Eina_Bool enabled)
2190 if (enabled && !gesture->enable)
2192 GTINF("Gestures will be enabled by for now.\n");
2193 gesture->enable = EINA_TRUE;
2195 else if (!enabled && gesture->enable)
2197 GTINF("Gestures will be enabled from now.\n");
2198 gesture->enable = EINA_FALSE;