2 #include "e_mod_main.h"
6 _e_gesture_swipe_cancel(void)
8 E_Gesture_Event_Swipe *swipes = &gesture->gesture_events.swipes;
10 if (swipes->start_timer)
12 ecore_timer_del(swipes->start_timer);
13 swipes->start_timer = NULL;
15 if (swipes->done_timer)
17 ecore_timer_del(swipes->done_timer);
18 swipes->done_timer = NULL;
21 swipes->enabled_finger = 0x0;
22 swipes->direction = E_GESTURE_DIRECTION_NONE;
24 gesture->gesture_filter |= TIZEN_GESTURE_TYPE_SWIPE;
28 _e_gesture_is_touch_device(Ecore_Device *dev)
32 const char *identifier;
34 EINA_SAFETY_ON_NULL_RETURN_VAL(dev, EINA_FALSE);
36 identifier = ecore_device_identifier_get(dev);
37 if (!identifier) return EINA_FALSE;
39 EINA_LIST_FOREACH(gesture->touch_devices, l, data)
41 if (!strncmp(data, identifier, strlen(identifier)))
50 _e_gesture_send_swipe(int fingers, int x, int y, int direction, struct wl_client *client, struct wl_resource *res)
52 enum tizen_gesture_direction dir = 0;
53 Ecore_Event_Mouse_Button *ev_cancel;
56 case E_GESTURE_DIRECTION_DOWN:
57 dir = TIZEN_GESTURE_DIRECTION_DOWN;
59 case E_GESTURE_DIRECTION_LEFT:
60 dir = TIZEN_GESTURE_DIRECTION_LEFT;
62 case E_GESTURE_DIRECTION_UP:
63 dir = TIZEN_GESTURE_DIRECTION_UP;
65 case E_GESTURE_DIRECTION_RIGHT:
66 dir = TIZEN_GESTURE_DIRECTION_RIGHT;
70 ev_cancel = E_NEW(Ecore_Event_Mouse_Button, 1);
71 EINA_SAFETY_ON_NULL_RETURN(ev_cancel);
73 ev_cancel->timestamp = (int)(ecore_time_get()*1000);
74 ev_cancel->same_screen = 1;
76 ecore_event_add(ECORE_EVENT_MOUSE_BUTTON_CANCEL, ev_cancel, NULL, NULL);
78 GTINF("Send swipe gesture (direction: %d) to client: %p\n", dir, client);
80 tizen_gesture_send_swipe(res, fingers, TIZEN_GESTURE_MODE_DONE, x, y, dir);
81 _e_gesture_swipe_cancel();
83 gesture->gesture_events.recognized_gesture |= TIZEN_GESTURE_TYPE_SWIPE;
87 _e_gesture_process_device_add(void *event)
89 Ecore_Event_Device_Info *ev = event;
91 if (ev->clas == ECORE_DEVICE_CLASS_TOUCH)
93 gesture->touch_devices = eina_list_append(gesture->touch_devices, ev->identifier);
94 GTINF("%s(%s) device is touch device: add list\n", ev->name, ev->identifier);
100 _e_gesture_process_device_del(void *event)
102 Ecore_Event_Device_Info *ev = event;
103 Eina_List *l, *l_next;
106 if (ev->clas == ECORE_DEVICE_CLASS_TOUCH)
108 EINA_LIST_FOREACH_SAFE(gesture->touch_devices, l, l_next, data)
110 if (!strncmp(data, ev->identifier, strlen(ev->identifier)))
112 GTINF("%s(%s) device is touch device: remove list\n", ev->name, ev->identifier);
113 gesture->touch_devices = eina_list_remove(gesture->touch_devices, data);
122 _e_gesture_timer_swipe_start(void *data)
124 E_Gesture_Event_Swipe *swipes = &gesture->gesture_events.swipes;
125 int idx = gesture->gesture_events.num_pressed;
128 GTDBG("Swipe start timer is expired. Currently alived swipe fingers: 0x%x\n", swipes->enabled_finger);
130 for (i = E_GESTURE_FINGER_MAX; i > idx; i--)
132 swipes->enabled_finger &= ~(1 << i);
134 if ((swipes->direction == E_GESTURE_DIRECTION_DOWN && !swipes->fingers[idx].direction[E_GESTURE_DIRECTION_DOWN].client) ||
135 (swipes->direction == E_GESTURE_DIRECTION_LEFT && !swipes->fingers[idx].direction[E_GESTURE_DIRECTION_LEFT].client) ||
136 (swipes->direction == E_GESTURE_DIRECTION_UP && !swipes->fingers[idx].direction[E_GESTURE_DIRECTION_UP].client) ||
137 (swipes->direction == E_GESTURE_DIRECTION_RIGHT && !swipes->fingers[idx].direction[E_GESTURE_DIRECTION_RIGHT].client))
139 _e_gesture_swipe_cancel();
141 return ECORE_CALLBACK_CANCEL;
145 _e_gesture_timer_swipe_done(void *data)
147 E_Gesture_Event_Swipe *swipes = &gesture->gesture_events.swipes;
149 GTDBG("Swipe done timer is expired. Currently alived swipe fingers: 0x%x\n", swipes->enabled_finger);
151 _e_gesture_swipe_cancel();
153 return ECORE_CALLBACK_CANCEL;
157 _e_gesture_process_swipe_down(Ecore_Event_Mouse_Button *ev)
159 E_Gesture_Event_Swipe *swipes = &gesture->gesture_events.swipes;
161 unsigned int idx = ev->multi.device+1;
163 if (gesture->gesture_events.num_pressed == 1)
165 for (i = 0; i < E_GESTURE_FINGER_MAX+1; i++)
167 if (swipes->fingers[i].enabled)
169 swipes->enabled_finger |= (1 << i);
173 if (ev->y < E_GESTURE_SWIPE_START_AREA)
174 swipes->direction = E_GESTURE_DIRECTION_DOWN;
175 else if (ev->y > e_comp->h - E_GESTURE_SWIPE_START_AREA)
176 swipes->direction = E_GESTURE_DIRECTION_UP;
177 else if (ev->x < E_GESTURE_SWIPE_START_AREA)
178 swipes->direction = E_GESTURE_DIRECTION_RIGHT;
179 else if (ev->x > e_comp->w - E_GESTURE_SWIPE_START_AREA)
180 swipes->direction = E_GESTURE_DIRECTION_LEFT;
182 if (swipes->direction != E_GESTURE_DIRECTION_DOWN &&
183 !((swipes->combined_keycode == E_GESTURE_SWIPE_COMBINE_KEY) && swipes->direction == E_GESTURE_DIRECTION_RIGHT))
185 _e_gesture_swipe_cancel();
189 swipes->fingers[idx].start.x = ev->x;
190 swipes->fingers[idx].start.y = ev->y;
191 swipes->start_timer = ecore_timer_add(E_GESTURE_SWIPE_START_TIME, _e_gesture_timer_swipe_start, NULL);
192 swipes->done_timer = ecore_timer_add(E_GESTURE_SWIPE_DONE_TIME, _e_gesture_timer_swipe_done, NULL);
197 swipes->enabled_finger &= ~(1 << (gesture->gesture_events.num_pressed - 1));
198 if (swipes->start_timer == NULL)
200 _e_gesture_swipe_cancel();
206 _e_gesture_process_swipe_move(Ecore_Event_Mouse_Move *ev)
208 E_Gesture_Event_Swipe *swipes = &gesture->gesture_events.swipes;
210 unsigned int idx = ev->multi.device+1;
212 if (!(swipes->enabled_finger & (1 << idx)))
215 diff.x = ABS(swipes->fingers[idx].start.x - ev->x);
216 diff.y = ABS(swipes->fingers[idx].start.y - ev->y);
218 switch(swipes->direction)
220 case E_GESTURE_DIRECTION_DOWN:
221 if (diff.x > E_GESTURE_SWIPE_DIFF_FAIL)
223 _e_gesture_swipe_cancel();
226 if (diff.y > E_GESTURE_SWIPE_DIFF_SUCCESS)
228 _e_gesture_send_swipe(idx, swipes->fingers[idx].start.x, swipes->fingers[idx].start.y, swipes->direction, swipes->fingers[idx].direction[E_GESTURE_DIRECTION_DOWN].client, swipes->fingers[idx].direction[E_GESTURE_DIRECTION_DOWN].res);
231 case E_GESTURE_DIRECTION_LEFT:
232 if (diff.y > E_GESTURE_SWIPE_DIFF_FAIL)
234 _e_gesture_swipe_cancel();
237 if (diff.x > E_GESTURE_SWIPE_DIFF_SUCCESS)
239 _e_gesture_send_swipe(idx, swipes->fingers[idx].start.x, swipes->fingers[idx].start.y, swipes->direction, swipes->fingers[idx].direction[E_GESTURE_DIRECTION_LEFT].client, swipes->fingers[idx].direction[E_GESTURE_DIRECTION_LEFT].res);
242 case E_GESTURE_DIRECTION_UP:
243 if (diff.x > E_GESTURE_SWIPE_DIFF_FAIL)
245 _e_gesture_swipe_cancel();
248 if (diff.y > E_GESTURE_SWIPE_DIFF_SUCCESS)
250 _e_gesture_send_swipe(idx, swipes->fingers[idx].start.x, swipes->fingers[idx].start.y, swipes->direction, swipes->fingers[idx].direction[E_GESTURE_DIRECTION_UP].client, swipes->fingers[idx].direction[E_GESTURE_DIRECTION_UP].res);
253 case E_GESTURE_DIRECTION_RIGHT:
254 if (diff.y > E_GESTURE_SWIPE_DIFF_FAIL)
256 _e_gesture_swipe_cancel();
259 if (diff.x > E_GESTURE_SWIPE_DIFF_SUCCESS)
261 _e_gesture_send_swipe(idx, swipes->fingers[idx].start.x, swipes->fingers[idx].start.y, swipes->direction, swipes->fingers[idx].direction[E_GESTURE_DIRECTION_RIGHT].client, swipes->fingers[idx].direction[E_GESTURE_DIRECTION_RIGHT].res);
265 GTWRN("Invalid direction(%d)\n", swipes->direction);
271 _e_gesture_process_swipe_up(Ecore_Event_Mouse_Button *ev)
273 _e_gesture_swipe_cancel();
277 _e_gesture_process_mouse_button_down(void *event)
279 Ecore_Event_Mouse_Button *ev = event;
281 gesture->gesture_events.num_pressed++;
283 if (!gesture->grabbed_gesture)
287 if (_e_gesture_is_touch_device(ev->dev) == EINA_FALSE)
291 if (ev->multi.device > E_GESTURE_FINGER_MAX)
296 if (gesture->gesture_events.num_pressed == 1)
298 gesture->gesture_events.recognized_gesture = 0x0;
301 if (gesture->gesture_events.recognized_gesture)
306 if (gesture->gesture_events.num_pressed == 1)
308 gesture->gesture_filter = E_GESTURE_TYPE_ALL & ~gesture->grabbed_gesture;
311 if (!(gesture->gesture_filter & TIZEN_GESTURE_TYPE_SWIPE))
313 _e_gesture_process_swipe_down(ev);
320 _e_gesture_process_mouse_button_up(void *event)
322 Ecore_Event_Mouse_Button *ev = event;
324 gesture->gesture_events.num_pressed--;
326 if (!gesture->grabbed_gesture)
330 if (_e_gesture_is_touch_device(ev->dev) == EINA_FALSE)
335 if (gesture->gesture_events.recognized_gesture)
340 if (!(gesture->gesture_filter & TIZEN_GESTURE_TYPE_SWIPE))
342 _e_gesture_process_swipe_up(ev);
350 _e_gesture_process_mouse_move(void *event)
352 Ecore_Event_Mouse_Move *ev = event;
354 if (!gesture->grabbed_gesture)
358 if (_e_gesture_is_touch_device(ev->dev) == EINA_FALSE)
363 if (gesture->gesture_events.recognized_gesture)
368 if (!(gesture->gesture_filter & TIZEN_GESTURE_TYPE_SWIPE))
370 _e_gesture_process_swipe_move(ev);
377 _e_gesture_process_key_down(void *event)
379 Ecore_Event_Key *ev = event;
381 if (ev->keycode == E_GESTURE_SWIPE_COMBINE_KEY)
383 gesture->gesture_events.swipes.combined_keycode = E_GESTURE_SWIPE_COMBINE_KEY;
390 _e_gesture_process_key_up(void *event)
392 Ecore_Event_Key *ev = event;
394 if (ev->keycode == E_GESTURE_SWIPE_COMBINE_KEY)
396 gesture->gesture_events.swipes.combined_keycode = 0;
402 /* Function for checking the existing grab for a key and sending key event(s) */
404 e_gesture_process_events(void *event, int type)
406 Eina_Bool res = EINA_TRUE;
408 if (type == ECORE_EVENT_MOUSE_BUTTON_DOWN)
409 res = _e_gesture_process_mouse_button_down(event);
410 else if (type == ECORE_EVENT_MOUSE_BUTTON_UP)
411 res = _e_gesture_process_mouse_button_up(event);
412 else if (type == ECORE_EVENT_MOUSE_MOVE)
413 res = _e_gesture_process_mouse_move(event);
414 else if (type == ECORE_EVENT_KEY_DOWN)
415 res = _e_gesture_process_key_down(event);
416 else if (type == ECORE_EVENT_KEY_UP)
417 res = _e_gesture_process_key_up(event);
418 else if (type == ECORE_EVENT_DEVICE_ADD)
419 res = _e_gesture_process_device_add(event);
420 else if (type == ECORE_EVENT_DEVICE_DEL)
421 res = _e_gesture_process_device_del(event);