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_TAP_NAME "long_tap"
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_TAP 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 MOVE_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_tap_count;
63 };
64 typedef struct _infra_data infra_data;
65 
66 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 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 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 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 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 Evas_Event_Flags
n_finger_tap_start(void * data,void * event_info)176 n_finger_tap_start(void *data , void *event_info)
177 {
178    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
179    _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, START_COLOR);
180    printf("N tap started <%p> x,y=<%d,%d> count=<%d>\n",
181          event_info, p->x, p->y, p->n);
182    return EVAS_EVENT_FLAG_ON_HOLD;
183 }
184 
185 static Evas_Event_Flags
n_finger_tap_end(void * data,void * event_info)186 n_finger_tap_end(void *data , void *event_info)
187 {
188    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
189 
190    printf("N tap ended <%p> x,y=<%d,%d> count=<%d>\n",
191          event_info, p->x, p->y, p->n);
192    _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, END_COLOR);
193    return EVAS_EVENT_FLAG_ON_HOLD;
194 }
195 
196 static Evas_Event_Flags
n_finger_tap_abort(void * data,void * event_info)197 n_finger_tap_abort(void *data , void *event_info)
198 {
199    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
200    printf("N tap abort\n");
201    _color_and_icon_set(data, TAP_NAME, p->n, MAX_TAP, ABORT_COLOR);
202    return EVAS_EVENT_FLAG_ON_HOLD;
203 }
204 
205 static Evas_Event_Flags
n_long_tap_start(void * data,void * event_info)206 n_long_tap_start(void *data , void *event_info)
207 {
208    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
209    infra_data *infra = data;
210 
211    printf("N long tap started <%p> x,y=<%d,%d> count=<%d>\n",
212          event_info, p->x, p->y, p->n);
213    _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, START_COLOR);
214    infra->long_tap_count = 0;
215    return EVAS_EVENT_FLAG_ON_HOLD;
216 }
217 
218 static Evas_Event_Flags
n_long_tap_move(void * data,void * event_info)219 n_long_tap_move(void *data , void *event_info)
220 {
221    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
222    infra_data *infra = data;
223 
224    infra->long_tap_count++;
225    _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, MOVE_COLOR);
226 
227    printf("N long tap moved <%p> x,y=<%d,%d> count=<%d>\n",
228          event_info, p->x, p->y, p->n);
229    if (infra->long_tap_count == 1)
230      printf("This is a first long tap.\n");
231 
232    return EVAS_EVENT_FLAG_ON_HOLD;
233 }
234 
235 static Evas_Event_Flags
n_long_tap_end(void * data,void * event_info)236 n_long_tap_end(void *data , void *event_info)
237 {
238    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
239 
240    printf("N long tap ended <%p> x,y=<%d,%d> count=<%d>\n",
241          event_info, p->x, p->y, p->n);
242    _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, END_COLOR);
243    return EVAS_EVENT_FLAG_ON_HOLD;
244 }
245 
246 static Evas_Event_Flags
n_long_tap_abort(void * data,void * event_info)247 n_long_tap_abort(void *data , void *event_info)
248 {
249    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
250    _color_and_icon_set(data, LONG_TAP_NAME, p->n, MAX_LONG_TAP, ABORT_COLOR);
251    printf("N long tap abort\n");
252    return EVAS_EVENT_FLAG_ON_HOLD;
253 }
254 
255 static Evas_Event_Flags
dbl_click_start(void * data,void * event_info)256 dbl_click_start(void *data , void *event_info)
257 {
258    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
259 
260    _color_and_icon_set(data,DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, START_COLOR);
261    printf("Double click started <%p> x,y=<%d,%d> count=<%d>\n",
262          event_info, p->x, p->y, p->n);
263    return EVAS_EVENT_FLAG_ON_HOLD;
264 }
265 
266 static Evas_Event_Flags
dbl_click_move(void * data,void * event_info)267 dbl_click_move(void *data , void *event_info)
268 {
269    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
270    _color_and_icon_set(data, DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, MOVE_COLOR);
271 
272    printf("Double click move <%p> x,y=<%d,%d> count=<%d>\n",
273          event_info, p->x, p->y, p->n);
274    return EVAS_EVENT_FLAG_ON_HOLD;
275 }
276 
277 static Evas_Event_Flags
dbl_click_end(void * data,void * event_info)278 dbl_click_end(void *data , void *event_info)
279 {
280    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
281    _color_and_icon_set(data, DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, END_COLOR);
282 
283    printf("Double click ended <%p> x,y=<%d,%d> count=<%d>\n",
284          event_info, p->x, p->y, p->n);
285    return EVAS_EVENT_FLAG_ON_HOLD;
286 }
287 
288 static Evas_Event_Flags
dbl_click_abort(void * data,void * event_info)289 dbl_click_abort(void *data , void *event_info)
290 {
291    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
292    _color_and_icon_set(data,DOUBLE_TAP_NAME, p->n, MAX_DOUBLE_TAP, ABORT_COLOR);
293 
294    printf("Double click abort\n");
295    return EVAS_EVENT_FLAG_ON_HOLD;
296 }
297 
298 static Evas_Event_Flags
triple_click_start(void * data,void * event_info)299 triple_click_start(void *data , void *event_info)
300 {
301    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
302    _color_and_icon_set(data,TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, START_COLOR);
303 
304    printf("Triple click started <%p> x,y=<%d,%d> count=<%d>\n",
305          event_info, p->x, p->y, p->n);
306    return EVAS_EVENT_FLAG_ON_HOLD;
307 }
308 
309 static Evas_Event_Flags
triple_click_move(void * data,void * event_info)310 triple_click_move(void *data , void *event_info)
311 {
312    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
313 
314    _color_and_icon_set(data, TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, MOVE_COLOR);
315    printf("Triple click move <%p> x,y=<%d,%d> count=<%d>\n",
316          event_info, p->x, p->y, p->n);
317    return EVAS_EVENT_FLAG_ON_HOLD;
318 }
319 
320 static Evas_Event_Flags
triple_click_end(void * data,void * event_info)321 triple_click_end(void *data , void *event_info)
322 {
323    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
324 
325    _color_and_icon_set(data, TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, END_COLOR);
326    printf("Triple click ended <%p> x,y=<%d,%d> count=<%d>\n",
327          event_info, p->x, p->y, p->n);
328    return EVAS_EVENT_FLAG_ON_HOLD;
329 }
330 
331 static Evas_Event_Flags
triple_click_abort(void * data,void * event_info)332 triple_click_abort(void *data , void *event_info)
333 {
334    Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
335    _color_and_icon_set(data,TRIPLE_TAP_NAME, p->n, MAX_TRIPLE_TAP, ABORT_COLOR);
336 
337    printf("Triple click abort\n");
338    return EVAS_EVENT_FLAG_ON_HOLD;
339 }
340 
341 static Evas_Event_Flags
momentum_start(void * data,void * event_info)342 momentum_start(void *data , void *event_info)
343 {
344    Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
345    _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, START_COLOR);
346 
347    printf("momentum started x1,y1=<%d,%d> tx,ty=<%u,%u> n=<%u>\n",
348          p->x1, p->y1, p->tx, p->ty, p->n);
349    return EVAS_EVENT_FLAG_ON_HOLD;
350 }
351 
352 static Evas_Event_Flags
momentum_end(void * data,void * event_info)353 momentum_end(void *data , void *event_info)
354 {
355    Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
356    _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, END_COLOR);
357    printf("momentum ended x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n",p->x1, p->y1, p->x2, p->y2, p->tx, p->ty, p->mx, p->my, p->n);
358    return EVAS_EVENT_FLAG_ON_HOLD;
359 }
360 
361 static Evas_Event_Flags
momentum_abort(void * data,void * event_info)362 momentum_abort(void *data , void *event_info)
363 {
364    Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
365    printf("momentum abort\n");
366    _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, ABORT_COLOR);
367    return EVAS_EVENT_FLAG_ON_HOLD;
368 }
369 
370 static Evas_Event_Flags
momentum_move(void * data,void * event_info)371 momentum_move(void *data , void *event_info)
372 {
373    Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
374    _color_and_icon_set(data, MOMENTUM_NAME, p->n, MAX_MOMENTUM, MOVE_COLOR);
375    printf("momentum move x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n", p->x1, p->y1, p->x2, p->y2, p->tx, p->ty, p->mx, p->my, p->n);
376    return EVAS_EVENT_FLAG_ON_HOLD;
377 }
378 
379 static Evas_Event_Flags
line_start(void * data,void * event_info)380 line_start(void *data , void *event_info)
381 {
382    Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
383    _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, START_COLOR);
384 
385    printf("line started x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n);
386    return EVAS_EVENT_FLAG_ON_HOLD;
387 }
388 
389 static Evas_Event_Flags
line_move(void * data,void * event_info)390 line_move(void *data , void *event_info)
391 {
392    Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
393    _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, MOVE_COLOR);
394    printf("line move x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n);
395 
396    return EVAS_EVENT_FLAG_ON_HOLD;
397 }
398 
399 static Evas_Event_Flags
line_end(void * data,void * event_info)400 line_end(void *data , void *event_info)
401 {
402    Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
403    _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, END_COLOR);
404    printf("line end x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> n=<%u>\n", p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.n);
405    return EVAS_EVENT_FLAG_ON_HOLD;
406 }
407 
408 static Evas_Event_Flags
line_abort(void * data,void * event_info)409 line_abort(void *data , void *event_info)
410 {
411    Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
412    _color_and_icon_set(data, LINE_NAME, p->momentum.n, MAX_LINE, ABORT_COLOR);
413    printf("line abort\n");
414    return EVAS_EVENT_FLAG_ON_HOLD;
415 }
416 
417 static Evas_Event_Flags
flick_start(void * data,void * event_info)418 flick_start(void *data , void *event_info)
419 {
420    Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
421    _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, START_COLOR);
422 
423    printf("flick started x1,y1=<%d,%d> tx,ty=<%u,%u> n=<%u>\n",
424          p->momentum.x1, p->momentum.y1, p->momentum.tx,
425          p->momentum.ty, p->momentum.n);
426    return EVAS_EVENT_FLAG_ON_HOLD;
427 }
428 
429 static Evas_Event_Flags
flick_end(void * data,void * event_info)430 flick_end(void *data , void *event_info)
431 {
432    Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
433    _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, END_COLOR);
434 
435    printf("flick ended x1,y1=<%d,%d> x2,y2=<%d,%d> tx,ty=<%u,%u> mx=<%d> my=<%d> n=<%u>\n",p->momentum.x1, p->momentum.y1, p->momentum.x2, p->momentum.y2, p->momentum.tx, p->momentum.ty, p->momentum.mx, p->momentum.my, p->momentum.n);
436    return EVAS_EVENT_FLAG_ON_HOLD;
437 }
438 
439 static Evas_Event_Flags
flick_abort(void * data,void * event_info)440 flick_abort(void *data , void *event_info)
441 {
442    Elm_Gesture_Line_Info *p = (Elm_Gesture_Line_Info *) event_info;
443    _color_and_icon_set(data, FLICK_NAME, p->momentum.n, MAX_FLICK, ABORT_COLOR);
444    printf("flick abort\n");
445    return EVAS_EVENT_FLAG_ON_HOLD;
446 }
447 
448 static Evas_Event_Flags
zoom_start(void * data,void * event_info)449 zoom_start(void *data , void *event_info)
450 {
451    Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
452    _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, START_COLOR);
453    printf("zoom started <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
454          p->x, p->y, p->zoom, p->radius, p->momentum);
455    return EVAS_EVENT_FLAG_ON_HOLD;
456 }
457 
458 static Evas_Event_Flags
zoom_move(void * data,void * event_info)459 zoom_move(void *data , void *event_info)
460 {
461    Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
462    _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, MOVE_COLOR);
463    printf("zoom move <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
464          p->x, p->y, p->zoom, p->radius, p->momentum);
465    return EVAS_EVENT_FLAG_ON_HOLD;
466 }
467 
468 static Evas_Event_Flags
zoom_end(void * data,void * event_info)469 zoom_end(void *data , void *event_info)
470 {
471    Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
472    _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, END_COLOR);
473    printf("zoom end <%d,%d> zoom=<%f> radius=<%d> momentum=<%f>\n",
474          p->x, p->y, p->zoom, p->radius, p->momentum);
475    return EVAS_EVENT_FLAG_ON_HOLD;
476 }
477 
478 static Evas_Event_Flags
zoom_abort(void * data,void * event_info EINA_UNUSED)479 zoom_abort(void *data , void *event_info EINA_UNUSED)
480 {
481    printf("zoom abort\n");
482    _color_and_icon_set(data, ZOOM_NAME, MAX_ZOOM, MAX_ZOOM, ABORT_COLOR);
483    return EVAS_EVENT_FLAG_ON_HOLD;
484 }
485 
486 static Evas_Event_Flags
rotate_start(void * data,void * event_info)487 rotate_start(void *data , void *event_info)
488 {
489    Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
490    _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, START_COLOR);
491    printf("rotate started <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);
492    return EVAS_EVENT_FLAG_ON_HOLD;
493 }
494 
495 static Evas_Event_Flags
rotate_move(void * data,void * event_info)496 rotate_move(void *data , void *event_info)
497 {
498    Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
499    _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, MOVE_COLOR);
500    printf("rotate move <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);
501    return EVAS_EVENT_FLAG_ON_HOLD;
502 }
503 
504 static Evas_Event_Flags
rotate_end(void * data,void * event_info)505 rotate_end(void *data , void *event_info)
506 {
507    Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
508    _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, END_COLOR);
509    printf("rotate end <%d,%d> base=<%f> angle=<%f> radius=<%d> momentum=<%f>\n", p->x, p->y, p->base_angle, p->angle, p->radius, p->momentum);
510    return EVAS_EVENT_FLAG_ON_HOLD;
511 }
512 
513 static Evas_Event_Flags
rotate_abort(void * data,void * event_info EINA_UNUSED)514 rotate_abort(void *data , void *event_info EINA_UNUSED)
515 {
516    _color_and_icon_set(data, ROTATE_NAME, MAX_ROTATE, MAX_ROTATE, ABORT_COLOR);
517    printf("rotate abort\n");
518    return EVAS_EVENT_FLAG_ON_HOLD;
519 }
520 /* END   - Callbacks for gestures */
521 
create_gesture_box(Evas_Object * win,icon_properties * icons,int idx,const char * name,const char * lb_txt)522 Evas_Object *create_gesture_box(Evas_Object *win, icon_properties *icons,
523       int idx, const char *name, const char *lb_txt)
524 {  /* Creates a box with icon and label, later placed in a table */
525    Evas_Object *lb, *bx = elm_box_add(win);
526    char buf[1024];
527 
528    elm_box_padding_set(bx, BX_PADDING_X, BX_PADDING_Y);
529    icons[idx].icon = elm_icon_add(win);
530    icons[idx].name = name;
531    snprintf(buf, sizeof(buf), "%s/images/g_layer/%s_1.png",
532          elm_app_data_dir_get(), icons[idx].name);
533    elm_image_file_set(icons[idx].icon, buf, NULL);
534    elm_image_resizable_set(icons[idx].icon, EINA_FALSE, EINA_FALSE);
535    evas_object_size_hint_align_set(icons[idx].icon, 0.5, 0.5);
536    _icon_color_set(&icons[idx], INI_R, INI_G, INI_B, INI_A);
537    elm_box_pack_end(bx, icons[idx].icon);
538    evas_object_show(icons[idx].icon);
539 
540    lb = elm_label_add(win);
541    elm_object_text_set(lb, lb_txt);
542    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
543    evas_object_size_hint_align_set(lb, 0.5, 0.5);
544    elm_box_pack_end(bx, lb);
545    evas_object_show(lb);
546    evas_object_show(bx);
547 
548    return bx;
549 }
550 
551 void
test_gesture_layer2(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)552 test_gesture_layer2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
553       void *event_info EINA_UNUSED)
554 {
555    Evas_Object *win, *tb, *lb, *bx;
556    Evas_Object *r; /* Gesture layer transparent object */
557    Evas_Object *g; /* The Gesture Layer object */
558 
559    infra_data *infra = _infra_data_alloc();
560 
561    win = elm_win_util_standard_add("gesture-layer2", "Gesture Layer 2");
562    elm_win_autodel_set(win, EINA_TRUE);
563    evas_object_smart_callback_add(win, "delete,request", my_win_del, infra);
564 
565    /* START - Building icons table */
566    bx = elm_box_add(win);
567    tb = elm_table_add(win);
568    elm_box_pack_end(bx, tb);
569    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
570    evas_object_size_hint_align_set(tb, 0.5, 0.5);
571    elm_win_resize_object_add(win, bx);
572    evas_object_show(tb);
573    evas_object_show(bx);
574 
575    /* Box of Tap icon and label */
576    bx = create_gesture_box(win, infra->icons, 0, TAP_NAME, "Tap");
577    elm_table_pack(tb, bx, 0, 0, 1, 1);
578 
579    /* Box of Double Tap icon and label */
580    bx = create_gesture_box(win, infra->icons, 1, DOUBLE_TAP_NAME, "Double Tap");
581    elm_table_pack(tb, bx, 1, 0, 1, 1);
582 
583    /* Box of Triple Tap icon and label */
584    bx = create_gesture_box(win, infra->icons, 2, TRIPLE_TAP_NAME, "Triple Tap");
585    elm_table_pack(tb, bx, 2, 0, 1, 1);
586 
587    /* Box of Long Tap icon and label */
588    bx = create_gesture_box(win, infra->icons, 3, LONG_TAP_NAME, "Long Tap");
589    elm_table_pack(tb, bx, 3, 0, 1, 1);
590 
591    /* Box of Momentum icon and label */
592    bx = create_gesture_box(win, infra->icons, 4, MOMENTUM_NAME, "Momentum");
593    elm_table_pack(tb, bx, 0, 2, 1, 1);
594 
595    /* Box of Line icon and label */
596    bx = create_gesture_box(win, infra->icons, 5, LINE_NAME, "Line");
597    elm_table_pack(tb, bx, 1, 2, 1, 1);
598 
599    /* Box of Flick icon and label */
600    bx = create_gesture_box(win, infra->icons, 6, FLICK_NAME, "Flick");
601    elm_table_pack(tb, bx, 2, 2, 1, 1);
602 
603    /* Box of Zoom icon and label */
604    bx = create_gesture_box(win, infra->icons, 7, ZOOM_NAME, "Zoom");
605    elm_table_pack(tb, bx, 0, 3, 1, 1);
606 
607    /* Box of Rotate icon and label */
608    bx = create_gesture_box(win, infra->icons, 8, ROTATE_NAME, "Rotate");
609    elm_table_pack(tb, bx, 1, 3, 1, 1);
610 
611    /* Legend of gestures - states */
612    lb = elm_label_add(win);
613    elm_object_text_set(lb, "<b>Gesture States</b>");
614    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
615    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
616    elm_table_pack(tb, lb, 0, 6, 4, 2);
617    evas_object_show(lb);
618 
619    r = evas_object_rectangle_add(evas_object_evas_get(win));
620    evas_object_resize(r, 64, 64);
621    evas_object_color_set(r, INI_R, INI_G, INI_B, INI_A);
622    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
623    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
624    elm_table_pack(tb, r, 0, 7, 1, 1);
625    evas_object_show(r);
626 
627    lb = elm_label_add(win);
628    elm_object_text_set(lb, "Not Started");
629    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
630    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
631    elm_table_pack(tb, lb, 1, 7, 3, 1);
632    evas_object_show(lb);
633 
634    r = evas_object_rectangle_add(evas_object_evas_get(win));
635    evas_object_resize(r, 64, 64);
636    evas_object_color_set(r, START_COLOR);
637    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
638    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
639    elm_table_pack(tb, r, 0, 8, 1, 1);
640    evas_object_show(r);
641 
642    lb = elm_label_add(win);
643    elm_object_text_set(lb, "Gesture START");
644    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
645    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
646    elm_table_pack(tb, lb, 1, 8, 3, 1);
647    evas_object_show(lb);
648 
649    r = evas_object_rectangle_add(evas_object_evas_get(win));
650    evas_object_resize(r, 64, 64);
651    evas_object_color_set(r, MOVE_COLOR);
652    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
653    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
654    elm_table_pack(tb, r, 0, 9, 1, 1);
655    evas_object_show(r);
656 
657    lb = elm_label_add(win);
658    elm_object_text_set(lb, "Gesture MOVE");
659    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
660    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
661    elm_table_pack(tb, lb, 1, 9, 3, 1);
662    evas_object_show(lb);
663 
664    r = evas_object_rectangle_add(evas_object_evas_get(win));
665    evas_object_resize(r, 64, 64);
666    evas_object_color_set(r, END_COLOR);
667    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
668    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
669    elm_table_pack(tb, r, 0, 10, 1, 1);
670    evas_object_show(r);
671 
672    lb = elm_label_add(win);
673    elm_object_text_set(lb, "Gesture END");
674    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
675    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
676    elm_table_pack(tb, lb, 1, 10, 3, 1);
677    evas_object_show(lb);
678 
679    r = evas_object_rectangle_add(evas_object_evas_get(win));
680    evas_object_resize(r, 64, 64);
681    evas_object_color_set(r, ABORT_COLOR);
682    evas_object_size_hint_weight_set(r, EVAS_HINT_EXPAND, 0.0);
683    evas_object_size_hint_align_set(r, EVAS_HINT_FILL, EVAS_HINT_FILL);
684    elm_table_pack(tb, r, 0, 11, 1, 1);
685    evas_object_show(r);
686 
687    lb = elm_label_add(win);
688    elm_object_text_set(lb, "Gesture ABORT");
689    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
690    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);
691    elm_table_pack(tb, lb, 1, 11, 3, 1);
692 
693    elm_table_padding_set(tb, TB_PADDING_X, TB_PADDING_Y);
694    evas_object_show(lb);
695    /* END   - Building icons table */
696 
697    /* Gesture layer transparent object */
698    r = evas_object_rectangle_add(evas_object_evas_get(win));
699    evas_object_move(r, 0, 0);
700    evas_object_color_set(r, 0, 0, 0, 0);
701    elm_win_resize_object_add(win, r);
702 
703    g = elm_gesture_layer_add(win);
704    elm_gesture_layer_attach(g, r);
705    evas_object_show(r);
706 
707    /* START - Setting gestures callbacks */
708 #if 1
709    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
710          ELM_GESTURE_STATE_START, triple_click_start, infra);
711    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
712          ELM_GESTURE_STATE_MOVE, triple_click_move, infra);
713    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
714          ELM_GESTURE_STATE_END, triple_click_end, infra);
715    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TRIPLE_TAPS,
716          ELM_GESTURE_STATE_ABORT, triple_click_abort, infra);
717 #endif
718 
719 #if 1
720    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
721          ELM_GESTURE_STATE_START, dbl_click_start, infra);
722    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
723          ELM_GESTURE_STATE_MOVE, dbl_click_move, infra);
724    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
725          ELM_GESTURE_STATE_END, dbl_click_end, infra);
726    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_DOUBLE_TAPS,
727          ELM_GESTURE_STATE_ABORT, dbl_click_abort, infra);
728 #endif
729 
730 #if 1
731    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
732          ELM_GESTURE_STATE_START, n_finger_tap_start, infra);
733    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
734          ELM_GESTURE_STATE_END, n_finger_tap_end, infra);
735    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_TAPS,
736          ELM_GESTURE_STATE_ABORT, n_finger_tap_abort, infra);
737 #endif
738 
739 #if 1
740    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS,
741          ELM_GESTURE_STATE_START, n_long_tap_start, infra);
742    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS,
743          ELM_GESTURE_STATE_MOVE, n_long_tap_move, infra);
744    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS,
745          ELM_GESTURE_STATE_END, n_long_tap_end, infra);
746    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LONG_TAPS,
747          ELM_GESTURE_STATE_ABORT, n_long_tap_abort, infra);
748 #endif
749 
750 #if 1
751    elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
752          ELM_GESTURE_STATE_START, momentum_start, infra);
753    elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
754          ELM_GESTURE_STATE_END, momentum_end, infra);
755    elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
756          ELM_GESTURE_STATE_ABORT, momentum_abort, infra);
757    elm_gesture_layer_cb_set(g, ELM_GESTURE_MOMENTUM,
758          ELM_GESTURE_STATE_MOVE, momentum_move, infra);
759 #endif
760 
761 #if 1
762    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
763          ELM_GESTURE_STATE_START, line_start, infra);
764    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
765          ELM_GESTURE_STATE_MOVE, line_move, infra);
766    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
767          ELM_GESTURE_STATE_END, line_end, infra);
768    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_LINES,
769          ELM_GESTURE_STATE_ABORT, line_abort, infra);
770 #endif
771 
772 #if 1
773    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
774          ELM_GESTURE_STATE_START, flick_start, infra);
775    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
776          ELM_GESTURE_STATE_END, flick_end, infra);
777    elm_gesture_layer_cb_set(g, ELM_GESTURE_N_FLICKS,
778          ELM_GESTURE_STATE_ABORT, flick_abort, infra);
779 #endif
780 
781 #if 1
782    elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
783          ELM_GESTURE_STATE_START, zoom_start, infra);
784    elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
785          ELM_GESTURE_STATE_END, zoom_end, infra);
786    elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
787          ELM_GESTURE_STATE_ABORT, zoom_abort, infra);
788    elm_gesture_layer_cb_set(g, ELM_GESTURE_ZOOM,
789          ELM_GESTURE_STATE_MOVE, zoom_move, infra);
790    /* elm_gesture_layer_zoom_step_set(g, 0.2); */
791 #endif
792 
793 #if 1
794    elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
795          ELM_GESTURE_STATE_START, rotate_start, infra);
796    elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
797          ELM_GESTURE_STATE_END, rotate_end, infra);
798    elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
799          ELM_GESTURE_STATE_ABORT, rotate_abort, infra);
800    elm_gesture_layer_cb_set(g, ELM_GESTURE_ROTATE,
801          ELM_GESTURE_STATE_MOVE, rotate_move, infra);
802    /* elm_gesture_layer_rotate_step_set(g, 5.2); */
803 #endif
804    /* END   - Setting gestures callbacks */
805 
806    /* Update color state 20 times a second */
807    infra->colortimer = ecore_timer_add(0.05, _icon_color_set_cb, infra->icons);
808 
809    evas_object_show(win);
810 }
811