1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 #include <Elementary.h>
5 
6 #define TAP_NAME "tap"
7 #define DOUBLE_TAP_NAME "double_tap"
8 #define TRIPLE_TAP_NAME "triple_tap"
9 #define LONG_PRESS_NAME "long_press"
10 #define FLICK_NAME "flick"
11 #define LINE_NAME "line"
12 #define MOMENTUM_NAME "momentum"
13 #define ROTATE_NAME "rotate"
14 #define ZOOM_NAME "zoom"
15 
16 #define N_GESTURE_TYPE 9
17 #define MAX_DOUBLE_TAP 5
18 #define MAX_FLICK 5
19 #define MAX_LINE 5
20 #define MAX_LONG_PRESS 5
21 #define MAX_MOMENTUM 5
22 #define MAX_ROTATE 1
23 #define MAX_TAP 5
24 #define MAX_TRIPLE_TAP 5
25 #define MAX_ZOOM 1
26 
27 #define TB_PADDING_X 4
28 #define TB_PADDING_Y 12
29 
30 #define BX_PADDING_X 0
31 #define BX_PADDING_Y 2
32 
33 /* Define initial RGBA values for icons */
34 #define INI_R 60
35 #define INI_G 66
36 #define INI_B 64
37 #define INI_A 128
38 #define COLOR_STEP 4
39 
40 #define START_COLOR 220, 220, 200, 255
41 #define UPDATE_COLOR 255, 255, 0, 255
42 #define ABORT_COLOR 255, 0, 0, 255
43 #define END_COLOR 0, 255, 0, 255
44 
45 struct _icon_properties
46 {
47    Evas_Object *icon;
48    int r; /* current r */
49    int g;
50    int b;
51    int a;
52 
53    const char *name;
54 };
55 typedef struct _icon_properties icon_properties;
56 
57 struct _infra_data
58 {  /* Some data that is passed aroung between callbacks (replacing globals) */
59    icon_properties *icons;
60    Ecore_Timer *colortimer;
61    char buf[1024];
62    int long_press_count;
63 };
64 typedef struct _infra_data infra_data;
65 
66 static void
_infra_data_free(infra_data * infra)67 _infra_data_free(infra_data *infra)
68 {
69    if (infra)
70      {
71         if (infra->colortimer)
72           ecore_timer_del(infra->colortimer);
73 
74         if (infra->icons)
75           free(infra->icons);
76 
77         free (infra);
78      }
79 }
80 
81 static infra_data *
_infra_data_alloc(void)82 _infra_data_alloc(void)
83 {
84    infra_data *infra = malloc(sizeof(infra_data));
85    if (!infra) return NULL;
86 
87    infra->icons = calloc(N_GESTURE_TYPE, sizeof(icon_properties ));
88    infra->colortimer = NULL;
89 
90    return infra;
91 }
92 
93 static void
my_win_del(void * data,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)94 my_win_del(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
95 {  /* called when my_win_main is requested to be deleted */
96    _infra_data_free(data);
97 }
98 
99 static icon_properties *
_icon_properties_find(icon_properties * icons,char * name)100 _icon_properties_find(icon_properties *icons, char *name)
101 {
102    int n;
103 
104    for (n = 0; n < N_GESTURE_TYPE; n++)
105      if (!strcmp(icons[n].name, name))
106        return &icons[n];
107 
108    return NULL;
109 }
110 
111 static void
_icon_color_set(icon_properties * i,int r,int g,int b,int a)112 _icon_color_set(icon_properties *i, int r, int g, int b, int a)
113 {
114    i->r =  r;
115    i->g =  g;
116    i->b =  b;
117    i->a =  a;
118    evas_object_color_set(i->icon, i->r,  i->g,  i->b,  i->a);
119 }
120 
121 static Eina_Bool
_icon_color_set_cb(void * data)122 _icon_color_set_cb(void *data)
123 {
124 #define INC_COLOR(C, NC) \
125    do { \
126         if (abs(i->C - NC) < COLOR_STEP) \
127         i->C = NC; \
128         else \
129         i->C += ((i->C < NC) ? COLOR_STEP : (-COLOR_STEP)); \
130    } while (0)
131 
132    int n;
133    icon_properties *icons = data;
134    icon_properties *i;
135 
136    for (n = 0; n < N_GESTURE_TYPE; n++)
137      {
138         i = &icons[n];
139 
140         INC_COLOR(r,INI_R);
141         INC_COLOR(g,INI_G);
142         INC_COLOR(b,INI_B);
143         INC_COLOR(a,INI_A);
144 
145         /* Change Icon color */
146         evas_object_color_set(i->icon, i->r,  i->g,  i->b,  i->a);
147     }
148 
149    return ECORE_CALLBACK_RENEW;
150 }
151 
152 static void
_color_and_icon_set(infra_data * infra,char * name,int n,int max,int r,int g,int b,int a)153 _color_and_icon_set(infra_data *infra, char *name, int n, int max,
154       int r, int g, int b, int a)
155 {
156    icon_properties *i;
157    int nn = n;
158    i = _icon_properties_find(infra->icons, name);
159    if (i)
160      {
161         if (n < 1)
162           nn = 1;
163 
164         if (n > max)
165           nn = max;
166 
167         snprintf(infra->buf, sizeof(infra->buf),
168               "%s/images/g_layer/%s_%d.png", elm_app_data_dir_get(), i->name, nn);
169         elm_image_file_set(i->icon, infra->buf, NULL);
170         _icon_color_set(i, r, g, b, a);
171      }
172 }
173 
174 /* START - Callbacks for gestures */
175 static void
finger_tap_start(void * data,Efl_Canvas_Gesture * tap)176 finger_tap_start(void *data , Efl_Canvas_Gesture *tap)
177 {
178    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
179 
180    _color_and_icon_set(data, TAP_NAME, 1, MAX_TAP, START_COLOR);
181    printf("Tap Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
182 }
183 
184 static void
finger_tap_end(void * data,Efl_Canvas_Gesture * tap)185 finger_tap_end(void *data , Efl_Canvas_Gesture *tap)
186 {
187    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
188 
189    _color_and_icon_set(data, TAP_NAME, 1, MAX_TAP, END_COLOR);
190    printf("Tap Gesture ended x,y=<%d,%d> \n", pos.x, pos.y);
191 }
192 
193 static void
finger_tap_abort(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)194 finger_tap_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
195 {
196    _color_and_icon_set(data, TAP_NAME, 1, MAX_TAP, ABORT_COLOR);
197    printf("Tap Aborted\n");
198 }
199 
200 static void
finger_flick_start(void * data,Efl_Canvas_Gesture * tap)201 finger_flick_start(void *data , Efl_Canvas_Gesture *tap)
202 {
203    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
204 
205    _color_and_icon_set(data, FLICK_NAME, 1, MAX_TAP, START_COLOR);
206    printf("Flick Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
207 }
208 
209 static void
finger_flick_end(void * data,Efl_Canvas_Gesture * tap)210 finger_flick_end(void *data , Efl_Canvas_Gesture *tap)
211 {
212    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
213    double angle = efl_gesture_flick_angle_get(tap);
214 
215    _color_and_icon_set(data, FLICK_NAME, 1, MAX_TAP, END_COLOR);
216    printf("Flick Gesture ended x,y=<%d,%d> angle=<%f>\n", pos.x, pos.y, angle);
217 }
218 
219 static void
finger_flick_abort(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)220 finger_flick_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
221 {
222    _color_and_icon_set(data, FLICK_NAME, 1, MAX_TAP, ABORT_COLOR);
223    printf("Flick Aborted\n");
224 }
225 
226 static void
finger_rotate_start(void * data,Efl_Canvas_Gesture * tap)227 finger_rotate_start(void *data , Efl_Canvas_Gesture *tap)
228 {
229    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
230 
231    _color_and_icon_set(data, ROTATE_NAME, 1, MAX_TAP, START_COLOR);
232    printf("Rotate Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
233 }
234 
235 static void
finger_rotate_end(void * data,Efl_Canvas_Gesture * tap)236 finger_rotate_end(void *data , Efl_Canvas_Gesture *tap)
237 {
238    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
239    double angle = efl_gesture_rotate_angle_get(tap);
240    double radius = efl_gesture_rotate_radius_get(tap);
241 
242    _color_and_icon_set(data, ROTATE_NAME, 1, MAX_TAP, END_COLOR);
243    printf("Rotate Gesture ended x,y=<%d,%d> angle=<%g> radius=<%f>\n", pos.x, pos.y, angle, radius);
244 }
245 
246 static void
finger_rotate_abort(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)247 finger_rotate_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
248 {
249    _color_and_icon_set(data, ROTATE_NAME, 1, MAX_TAP, ABORT_COLOR);
250    printf("Rotate Aborted\n");
251 }
252 
253 static void
finger_zoom_start(void * data,Efl_Canvas_Gesture * tap)254 finger_zoom_start(void *data , Efl_Canvas_Gesture *tap)
255 {
256    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
257 
258    _color_and_icon_set(data, ZOOM_NAME, 1, MAX_TAP, START_COLOR);
259    printf("Zoom Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
260 }
261 
262 static void
finger_zoom_end(void * data,Efl_Canvas_Gesture * tap)263 finger_zoom_end(void *data , Efl_Canvas_Gesture *tap)
264 {
265    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
266    double zoom = efl_gesture_zoom_get(tap);
267    double radius = efl_gesture_zoom_radius_get(tap);
268 
269    _color_and_icon_set(data, ZOOM_NAME, 1, MAX_TAP, END_COLOR);
270    printf("Zoom Gesture ended x,y=<%d,%d> zoom=<%g> radius=<%f>\n", pos.x, pos.y, zoom, radius);
271 }
272 
273 static void
finger_zoom_abort(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)274 finger_zoom_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
275 {
276    _color_and_icon_set(data, ZOOM_NAME, 1, MAX_TAP, ABORT_COLOR);
277    printf("Zoom Aborted\n");
278 }
279 
280 static void
finger_momentum_start(void * data,Efl_Canvas_Gesture * tap)281 finger_momentum_start(void *data , Efl_Canvas_Gesture *tap)
282 {
283    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
284    unsigned int t = efl_gesture_timestamp_get(tap);
285 
286    _color_and_icon_set(data, MOMENTUM_NAME, 1, MAX_TAP, START_COLOR);
287    printf("Momentum Gesture started x,y=<%d,%d> time=<%d>\n", pos.x, pos.y, t);
288 }
289 
290 static void
finger_momentum_update(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)291 finger_momentum_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
292 {
293    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
294    Eina_Vector2 m = efl_gesture_momentum_get(tap);
295    unsigned int t = efl_gesture_timestamp_get(tap);
296 
297    _color_and_icon_set(data, MOMENTUM_NAME, 1, MAX_TAP, UPDATE_COLOR);
298    printf("Momentum Gesture updated x,y=<%d,%d> momentum=<%f %f> time=<%d>\n",
299           pos.x, pos.y, m.x, m.y, t);
300 }
301 
302 static void
finger_momentum_end(void * data,Efl_Canvas_Gesture * tap)303 finger_momentum_end(void *data , Efl_Canvas_Gesture *tap)
304 {
305    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
306    Eina_Vector2 m = efl_gesture_momentum_get(tap);
307    unsigned int t = efl_gesture_timestamp_get(tap);
308 
309    _color_and_icon_set(data, MOMENTUM_NAME, 1, MAX_TAP, END_COLOR);
310    printf("Momentum Gesture ended x,y=<%d,%d> momentum=<%f %f> time=<%d>\n",
311      pos.x, pos.y, m.x, m.y, t);
312 }
313 
314 static void
finger_momentum_abort(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)315 finger_momentum_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
316 {
317    _color_and_icon_set(data, MOMENTUM_NAME, 1, MAX_TAP, ABORT_COLOR);
318    printf("Momentum Aborted\n");
319 }
320 
321 static void
finger_triple_tap_start(void * data,Efl_Canvas_Gesture * tap)322 finger_triple_tap_start(void *data , Efl_Canvas_Gesture *tap)
323 {
324    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
325 
326    _color_and_icon_set(data, TRIPLE_TAP_NAME, 1, MAX_TAP, START_COLOR);
327    printf("Triple Tap Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
328 }
329 
330 static void
finger_triple_tap_update(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)331 finger_triple_tap_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
332 {
333    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
334 
335    _color_and_icon_set(data, TRIPLE_TAP_NAME, 1, MAX_TAP, UPDATE_COLOR);
336    printf("Triple Tap Gesture updated x,y=<%d,%d> \n", pos.x, pos.y);
337 }
338 
339 static void
finger_triple_tap_end(void * data,Efl_Canvas_Gesture * tap)340 finger_triple_tap_end(void *data , Efl_Canvas_Gesture *tap)
341 {
342    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
343 
344    _color_and_icon_set(data, TRIPLE_TAP_NAME, 1, MAX_TAP, END_COLOR);
345    printf("Triple Tap Gesture ended x,y=<%d,%d> \n", pos.x, pos.y);
346 }
347 
348 static void
finger_triple_tap_abort(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)349 finger_triple_tap_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
350 {
351    _color_and_icon_set(data, TRIPLE_TAP_NAME, 1, MAX_TAP, ABORT_COLOR);
352    printf("Triple Tap Aborted\n");
353 }
354 
355 static void
finger_double_tap_start(void * data,Efl_Canvas_Gesture * tap)356 finger_double_tap_start(void *data , Efl_Canvas_Gesture *tap)
357 {
358    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
359 
360    _color_and_icon_set(data, DOUBLE_TAP_NAME, 1, MAX_TAP, START_COLOR);
361    printf("Double Tap Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
362 }
363 
364 static void
finger_double_tap_update(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)365 finger_double_tap_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
366 {
367    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
368 
369    _color_and_icon_set(data, DOUBLE_TAP_NAME, 1, MAX_TAP, UPDATE_COLOR);
370    printf("Double Tap Gesture updated x,y=<%d,%d> \n", pos.x, pos.y);
371 }
372 
373 static void
finger_double_tap_end(void * data,Efl_Canvas_Gesture * tap)374 finger_double_tap_end(void *data , Efl_Canvas_Gesture *tap)
375 {
376    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
377 
378    _color_and_icon_set(data, DOUBLE_TAP_NAME, 1, MAX_TAP, END_COLOR);
379    printf("Double Tap Gesture ended x,y=<%d,%d> \n", pos.x, pos.y);
380 }
381 
382 static void
finger_double_tap_abort(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)383 finger_double_tap_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
384 {
385    _color_and_icon_set(data, DOUBLE_TAP_NAME, 1, MAX_TAP, ABORT_COLOR);
386    printf("Double Tap Aborted\n");
387 }
388 
389 static void
finger_long_press_start(void * data,Efl_Canvas_Gesture * tap)390 finger_long_press_start(void *data , Efl_Canvas_Gesture *tap)
391 {
392    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
393 
394    _color_and_icon_set(data, LONG_PRESS_NAME, 1, MAX_TAP, START_COLOR);
395    printf("Long Tap Gesture started x,y=<%d,%d> \n", pos.x, pos.y);
396 }
397 
398 static void
finger_long_press_update(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)399 finger_long_press_update(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
400 {
401    _color_and_icon_set(data, LONG_PRESS_NAME, 1, MAX_TAP, UPDATE_COLOR);
402    printf("Long Tap Gesture updated\n");
403 }
404 
405 static void
finger_long_press_end(void * data,Efl_Canvas_Gesture * tap)406 finger_long_press_end(void *data , Efl_Canvas_Gesture *tap)
407 {
408    Eina_Position2D pos = efl_gesture_hotspot_get(tap);
409 
410    _color_and_icon_set(data, LONG_PRESS_NAME, 1, MAX_TAP, END_COLOR);
411    printf("Long Tap Gesture ended x,y=<%d,%d> \n",pos.x, pos.y);
412 }
413 
414 static void
finger_long_press_abort(void * data,Efl_Canvas_Gesture * tap EINA_UNUSED)415 finger_long_press_abort(void *data , Efl_Canvas_Gesture *tap EINA_UNUSED)
416 {
417    _color_and_icon_set(data, LONG_PRESS_NAME, 1, MAX_TAP, ABORT_COLOR);
418    printf("Long Tap Aborted\n");
419 }
420 
421 static void
tap_gesture_cb(void * data,const Efl_Event * ev)422 tap_gesture_cb(void *data , const Efl_Event *ev)
423 {
424    Efl_Canvas_Gesture *g = ev->info;
425    switch(efl_gesture_state_get(g))
426    {
427       case EFL_GESTURE_STATE_STARTED:
428          finger_tap_start(data, g);
429          break;
430       case EFL_GESTURE_STATE_CANCELED:
431          finger_tap_abort(data, g);
432          break;
433       case EFL_GESTURE_STATE_FINISHED:
434          finger_tap_end(data, g);
435          break;
436       default:
437          break;
438    }
439 }
440 
441 static void
flick_gesture_cb(void * data,const Efl_Event * ev)442 flick_gesture_cb(void *data , const Efl_Event *ev)
443 {
444    Efl_Canvas_Gesture *g = ev->info;
445    switch(efl_gesture_state_get(g))
446    {
447       case EFL_GESTURE_STATE_STARTED:
448          finger_flick_start(data, g);
449          break;
450       case EFL_GESTURE_STATE_CANCELED:
451          finger_flick_abort(data, g);
452          break;
453       case EFL_GESTURE_STATE_FINISHED:
454          finger_flick_end(data, g);
455          break;
456       default:
457          break;
458    }
459 }
460 
461 static void
rotate_gesture_cb(void * data,const Efl_Event * ev)462 rotate_gesture_cb(void *data , const Efl_Event *ev)
463 {
464    Efl_Canvas_Gesture *g = ev->info;
465    switch(efl_gesture_state_get(g))
466    {
467       case EFL_GESTURE_STATE_STARTED:
468          finger_rotate_start(data, g);
469          break;
470       case EFL_GESTURE_STATE_CANCELED:
471          finger_rotate_abort(data, g);
472          break;
473       case EFL_GESTURE_STATE_FINISHED:
474          finger_rotate_end(data, g);
475          break;
476       default:
477          break;
478    }
479 }
480 
481 static void
zoom_gesture_cb(void * data,const Efl_Event * ev)482 zoom_gesture_cb(void *data , const Efl_Event *ev)
483 {
484    Efl_Canvas_Gesture *g = ev->info;
485    switch(efl_gesture_state_get(g))
486    {
487       case EFL_GESTURE_STATE_STARTED:
488          finger_zoom_start(data, g);
489          break;
490       case EFL_GESTURE_STATE_CANCELED:
491          finger_zoom_abort(data, g);
492          break;
493       case EFL_GESTURE_STATE_FINISHED:
494          finger_zoom_end(data, g);
495          break;
496       default:
497          break;
498    }
499 }
500 
501 static void
momentum_gesture_cb(void * data,const Efl_Event * ev)502 momentum_gesture_cb(void *data , const Efl_Event *ev)
503 {
504    Efl_Canvas_Gesture *g = ev->info;
505    switch(efl_gesture_state_get(g))
506    {
507       case EFL_GESTURE_STATE_STARTED:
508          finger_momentum_start(data, g);
509          break;
510       case EFL_GESTURE_STATE_UPDATED:
511          finger_momentum_update(data, g);
512          break;
513       case EFL_GESTURE_STATE_CANCELED:
514          finger_momentum_abort(data, g);
515          break;
516       case EFL_GESTURE_STATE_FINISHED:
517          finger_momentum_end(data, g);
518          break;
519       default:
520          break;
521    }
522 }
523 
524 static void
triple_tap_gesture_cb(void * data,const Efl_Event * ev)525 triple_tap_gesture_cb(void *data , const Efl_Event *ev)
526 {
527    Efl_Canvas_Gesture *g = ev->info;
528    switch(efl_gesture_state_get(g))
529    {
530       case EFL_GESTURE_STATE_STARTED:
531          finger_triple_tap_start(data, g);
532          break;
533       case EFL_GESTURE_STATE_UPDATED:
534          finger_triple_tap_update(data, g);
535          break;
536       case EFL_GESTURE_STATE_CANCELED:
537          finger_triple_tap_abort(data, g);
538          break;
539       case EFL_GESTURE_STATE_FINISHED:
540          finger_triple_tap_end(data, g);
541          break;
542       default:
543          break;
544    }
545 }
546 
547 static void
double_tap_gesture_cb(void * data,const Efl_Event * ev)548 double_tap_gesture_cb(void *data , const Efl_Event *ev)
549 {
550    Efl_Canvas_Gesture *g = ev->info;
551    switch(efl_gesture_state_get(g))
552    {
553       case EFL_GESTURE_STATE_STARTED:
554          finger_double_tap_start(data, g);
555          break;
556       case EFL_GESTURE_STATE_UPDATED:
557          finger_double_tap_update(data, g);
558          break;
559       case EFL_GESTURE_STATE_CANCELED:
560          finger_double_tap_abort(data, g);
561          break;
562       case EFL_GESTURE_STATE_FINISHED:
563          finger_double_tap_end(data, g);
564          break;
565       default:
566          break;
567    }
568 }
569 
570 static void
long_press_gesture_cb(void * data,const Efl_Event * ev)571 long_press_gesture_cb(void *data , const Efl_Event *ev)
572 {
573    Efl_Canvas_Gesture *g = ev->info;
574    switch(efl_gesture_state_get(g))
575    {
576       case EFL_GESTURE_STATE_STARTED:
577          finger_long_press_start(data, g);
578          break;
579       case EFL_GESTURE_STATE_UPDATED:
580          finger_long_press_update(data, g);
581          break;
582       case EFL_GESTURE_STATE_CANCELED:
583          finger_long_press_abort(data, g);
584          break;
585       case EFL_GESTURE_STATE_FINISHED:
586          finger_long_press_end(data, g);
587          break;
588       default:
589          break;
590    }
591 }
592 
593 /* END   - Callbacks for gestures */
594 
595 static Evas_Object *
create_gesture_box(Evas_Object * win,icon_properties * icons,int idx,const char * name,const char * lb_txt)596 create_gesture_box(Evas_Object *win, icon_properties *icons,
597                    int idx, const char *name, const char *lb_txt)
598 {  /* Creates a box with icon and label, later placed in a table */
599    Evas_Object *lb, *bx = elm_box_add(win);
600    char buf[1024];
601 
602    elm_box_padding_set(bx, BX_PADDING_X, BX_PADDING_Y);
603    icons[idx].icon = elm_icon_add(win);
604    icons[idx].name = name;
605    snprintf(buf, sizeof(buf), "%s/images/g_layer/%s_1.png",
606          elm_app_data_dir_get(), icons[idx].name);
607    elm_image_file_set(icons[idx].icon, buf, NULL);
608    elm_image_resizable_set(icons[idx].icon, EINA_FALSE, EINA_FALSE);
609    evas_object_size_hint_align_set(icons[idx].icon, 0.5, 0.5);
610    _icon_color_set(&icons[idx], INI_R, INI_G, INI_B, INI_A);
611    elm_box_pack_end(bx, icons[idx].icon);
612    evas_object_show(icons[idx].icon);
613 
614    lb = elm_label_add(win);
615    elm_object_text_set(lb, lb_txt);
616    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
617    evas_object_size_hint_align_set(lb, 0.5, 0.5);
618    elm_box_pack_end(bx, lb);
619    evas_object_show(lb);
620    evas_object_show(bx);
621 
622    return bx;
623 }
624 
625 void
_tb_resize(void * data,Evas * e EINA_UNUSED,Evas_Object * obj,void * event_info EINA_UNUSED)626 _tb_resize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
627 {
628    int w,h;
629 
630    evas_object_geometry_get(obj, NULL, NULL, &w, &h);
631    evas_object_resize(data, w, h);
632    evas_object_color_set(data, 0, 0, 0, 0);
633    evas_object_show(data);
634 }
635 
636 void
test_gesture_framework(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)637 test_gesture_framework(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
638       void *event_info EINA_UNUSED)
639 {
640    Evas_Object *win, *tb, *lb, *bx;
641    Evas_Object *r, *target; /* Gesture layer transparent object */
642 
643    infra_data *infra = _infra_data_alloc();
644 
645    win = elm_win_util_standard_add("gesture-layer2", "Gesture (EO)");
646    elm_win_autodel_set(win, EINA_TRUE);
647    evas_object_smart_callback_add(win, "delete,request", my_win_del, infra);
648 
649    /* START - Building icons table */
650    bx = elm_box_add(win);
651    tb = elm_table_add(win);
652    elm_box_pack_end(bx, tb);
653    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
654    evas_object_size_hint_align_set(tb, 0.5, 0.5);
655    elm_win_resize_object_add(win, bx);
656    evas_object_show(tb);
657    evas_object_show(bx);
658 
659    target = evas_object_rectangle_add(evas_object_evas_get(win));
660    evas_object_event_callback_add(win, EVAS_CALLBACK_RESIZE, _tb_resize, target);
661 
662    /* Box of Tap icon and label */
663    bx = create_gesture_box(win, infra->icons, 0, TAP_NAME, "Tap");
664    elm_table_pack(tb, bx, 0, 0, 1, 1);
665 
666    /* Box of Double Tap icon and label */
667    bx = create_gesture_box(win, infra->icons, 1, DOUBLE_TAP_NAME, "Double Tap");
668    elm_table_pack(tb, bx, 1, 0, 1, 1);
669 
670    /* Box of Triple Tap icon and label */
671    bx = create_gesture_box(win, infra->icons, 2, TRIPLE_TAP_NAME, "Triple Tap");
672    elm_table_pack(tb, bx, 2, 0, 1, 1);
673 
674    /* Box of Long Tap icon and label */
675    bx = create_gesture_box(win, infra->icons, 3, LONG_PRESS_NAME, "Long Tap");
676    elm_table_pack(tb, bx, 3, 0, 1, 1);
677 
678    /* Box of Momentum icon and label */
679    bx = create_gesture_box(win, infra->icons, 4, MOMENTUM_NAME, "Momentum");
680    elm_table_pack(tb, bx, 0, 2, 1, 1);
681 
682    /* Box of Line icon and label */
683    bx = create_gesture_box(win, infra->icons, 5, LINE_NAME, "Line");
684    elm_table_pack(tb, bx, 1, 2, 1, 1);
685 
686    /* Box of Flick icon and label */
687    bx = create_gesture_box(win, infra->icons, 6, FLICK_NAME, "Flick");
688    elm_table_pack(tb, bx, 2, 2, 1, 1);
689 
690    /* Box of Zoom icon and label */
691    bx = create_gesture_box(win, infra->icons, 7, ZOOM_NAME, "Zoom");
692    elm_table_pack(tb, bx, 0, 3, 1, 1);
693 
694    /* Box of Rotate icon and label */
695    bx = create_gesture_box(win, infra->icons, 8, ROTATE_NAME, "Rotate");
696    elm_table_pack(tb, bx, 1, 3, 1, 1);
697 
698    /* Legend of gestures - states */
699    lb = elm_label_add(win);
700    elm_object_text_set(lb, "<b>Gesture States</b>");
701    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
702    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
703    elm_table_pack(tb, lb, 0, 6, 4, 2);
704    evas_object_show(lb);
705 
706    r = evas_object_rectangle_add(evas_object_evas_get(win));
707    evas_object_resize(r, 64, 64);
708    evas_object_color_set(r, INI_R, INI_G, INI_B, INI_A);
709    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
710    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
711    elm_table_pack(tb, r, 0, 7, 1, 1);
712    evas_object_show(r);
713 
714    lb = elm_label_add(win);
715    elm_object_text_set(lb, "Not Started");
716    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
717    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
718    elm_table_pack(tb, lb, 1, 7, 3, 1);
719    evas_object_show(lb);
720 
721    r = evas_object_rectangle_add(evas_object_evas_get(win));
722    evas_object_resize(r, 64, 64);
723    evas_object_color_set(r, START_COLOR);
724    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
725    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
726    elm_table_pack(tb, r, 0, 8, 1, 1);
727    evas_object_show(r);
728 
729    lb = elm_label_add(win);
730    elm_object_text_set(lb, "Gesture START");
731    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
732    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
733    elm_table_pack(tb, lb, 1, 8, 3, 1);
734    evas_object_show(lb);
735 
736    r = evas_object_rectangle_add(evas_object_evas_get(win));
737    evas_object_resize(r, 64, 64);
738    evas_object_color_set(r, UPDATE_COLOR);
739    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
740    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
741    elm_table_pack(tb, r, 0, 9, 1, 1);
742    evas_object_show(r);
743 
744    lb = elm_label_add(win);
745    elm_object_text_set(lb, "Gesture UPDATE");
746    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
747    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
748    elm_table_pack(tb, lb, 1, 9, 3, 1);
749    evas_object_show(lb);
750 
751    r = evas_object_rectangle_add(evas_object_evas_get(win));
752    evas_object_resize(r, 64, 64);
753    evas_object_color_set(r, END_COLOR);
754    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
755    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
756    elm_table_pack(tb, r, 0, 10, 1, 1);
757    evas_object_show(r);
758 
759    lb = elm_label_add(win);
760    elm_object_text_set(lb, "Gesture END");
761    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
762    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
763    elm_table_pack(tb, lb, 1, 10, 3, 1);
764    evas_object_show(lb);
765 
766    r = evas_object_rectangle_add(evas_object_evas_get(win));
767    evas_object_resize(r, 64, 64);
768    evas_object_color_set(r, ABORT_COLOR);
769    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
770    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
771    elm_table_pack(tb, r, 0, 11, 1, 1);
772    evas_object_show(r);
773 
774    lb = elm_label_add(win);
775    elm_object_text_set(lb, "Gesture ABORT");
776    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
777    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
778    elm_table_pack(tb, lb, 1, 11, 3, 1);
779 
780    elm_table_padding_set(tb, TB_PADDING_X, TB_PADDING_Y);
781    evas_object_show(lb);
782    /* END   - Building icons table */
783 
784    // LISTEN FOR GESTURES
785    efl_event_callback_add(target, EFL_EVENT_GESTURE_TAP, tap_gesture_cb, infra);
786    efl_event_callback_add(target, EFL_EVENT_GESTURE_LONG_PRESS, long_press_gesture_cb, infra);
787    efl_event_callback_add(target, EFL_EVENT_GESTURE_DOUBLE_TAP, double_tap_gesture_cb, infra);
788    efl_event_callback_add(target, EFL_EVENT_GESTURE_TRIPLE_TAP, triple_tap_gesture_cb, infra);
789    efl_event_callback_add(target, EFL_EVENT_GESTURE_MOMENTUM, momentum_gesture_cb, infra);
790    efl_event_callback_add(target, EFL_EVENT_GESTURE_FLICK, flick_gesture_cb, infra);
791    efl_event_callback_add(target, EFL_EVENT_GESTURE_ROTATE, rotate_gesture_cb, infra);
792    efl_event_callback_add(target, EFL_EVENT_GESTURE_ZOOM, zoom_gesture_cb, infra);
793 
794    /* Update color state 20 times a second */
795    infra->colortimer = ecore_timer_add(0.05, _icon_color_set_cb, infra->icons);
796 
797    evas_object_show(win);
798 }
799