Expedite tb-autoalign: Added an LRM to fix rendering in \n compat mode.
[framework/uifw/expedite.git] / src / bin / ui.c
1 #include "main.h"
2
3 #define PROTO
4 #include "tests.h"
5 #undef PROTO
6
7 static double start = 0.0;
8
9 static double t_start = 0.0;
10 static double t_loop = 0.0;
11 static int    f_start = 0;
12 static int    f_loop = 0;
13 static char   data_dir[4096];
14
15 typedef struct _Menu_Item Menu_Item;
16
17 struct _Menu_Item
18 {
19    Evas_Object *o_icon;
20    char *icon;
21    char *text;
22    void (*func) (void);
23 };
24
25 static Evas_Object *o_bg = NULL;
26 static Evas_Object *o_wallpaper = NULL;
27 static Evas_Object *o_title = NULL;
28 static Evas_Object *o_byline = NULL;
29 static Evas_Object *o_menu_logo = NULL;
30 static Evas_Object *o_menu_icon = NULL;
31 static Evas_Object *o_menu_icon_sel = NULL;
32 static Evas_Object *o_menu_icon_sel2 = NULL;
33 static Evas_Object *o_menu_text_sel = NULL;
34 static Evas_Object *o_menu_title = NULL;
35 static Eina_List   *menu = NULL;
36 static int          menu_sel = 0;
37 static int          menu_active = 0;
38 static double       menu_anim = 0.0;
39 static double       menu_anim_sel = 0.0;
40
41 static double       p_fps = 0.0;
42
43 static void (*key_func) (char *key) = NULL;
44 static void (*loop_func) (double t, int f) = NULL;
45
46 static int run_all = 0;
47 static int run_test = 0;
48 static int list_test = 0;
49 static int exit_after_test = 0;
50
51 static double weights[] =
52 {
53    0.0, // no test 0
54      
55      50.4851, // test 1
56      97.3703, // test 2
57      10.0000, // test 3
58      87.3703, // ...
59      10.0000, 
60    
61      150.0000, // test 6
62      10.0000,
63      150.0000,
64      10.0000,
65      150.0000,
66    
67      10.0000, // test 11
68      150.0000,
69      10.0000,
70      10.6493, 
71      38.4818,
72    
73      40.7314, // test 16
74      32.0866,
75      21.3337,
76      21.2167,
77      71.6141,
78    
79      64.8893, // test 21
80      95.0880,
81      121.0438,
82      41.2646,
83      162.7149,
84    
85      89.1650, // test 26
86      105.3571,
87      40.9657,
88      98.4671,
89      28.4322,
90    
91      60.000, // test 31
92      75.5507,
93      51.6601,
94      135.4753,
95      38.2705,
96    
97      35.9915, // test 36
98      31.9500,
99      22.6752,
100      38.2702,
101      37.4459,
102    
103      37.2009, // test 41
104      34.5459,
105      38.5043,
106      50.0000,
107      37.0282,
108    
109      55.8886, // test 46
110      17.2535,
111      23.1457,
112      36.9874,
113      37.9336,
114    
115      17.1830, // test 51
116      20.7521,
117      29.0141,
118      131.6784,
119      13.6851,
120    
121      23.4462, // test 56
122      14.7573,
123      36.5261,
124       5.0000,
125       5.0000,
126    
127      24.3482, // test 61
128      10.4611,
129      86.0290,
130      82.0735,
131      18.6459,
132    
133      37.4608, // test 66
134      32.4417,
135      11.5449,
136       5.0000,
137      11.4172,
138    
139      13.3682, // test 71
140      10.0324,
141      10.0584,
142      10.0170,
143      5.4029,
144    
145      10.6349, // test 76
146      21.7728,
147      12.7933,
148      19.4177,
149      34.4192,
150    
151      23.9110, // test 81
152      22.8287,
153      41.2399,
154      30.1383,
155      22.0342,
156    
157      38.2952, // test 86
158      5.5560,
159      0.5000,
160      10.000, // Proxy tests
161      10.000,
162      10.000,
163    
164      0.0, // no final test - add a 0 at the end anyway to pad
165      0.0,
166      0.0,
167      0.0
168 };
169
170 static void
171 _ui_exit(void)
172 {
173    Menu_Item *mi;
174
175    EINA_LIST_FREE(menu, mi)
176      {
177         free(mi->icon);
178         free(mi->text);
179         free(mi);
180      }
181    engine_abort();
182 }
183
184 extern const char *profile;
185 extern int win_w, win_h;
186 extern const char *engine;
187 extern int loops;
188 extern int fullscreen;
189
190 static void
191 _ui_all(void)
192 {
193    Eina_List *l;
194    double fps = 0.0;
195    double wfps = 0.0;
196    int t_count = 0;
197    unsigned int i;
198    double avgw = 0.0;
199
200    evas_object_hide(o_menu_logo);
201    evas_object_hide(o_menu_title);
202    evas_object_hide(o_menu_icon);
203    evas_object_hide(o_menu_icon_sel);
204    evas_object_hide(o_menu_icon_sel2);
205    evas_object_hide(o_menu_text_sel);
206    evas_object_hide(o_title);
207    evas_object_hide(o_byline);
208    for (l = menu; l; l = l->next)
209      {
210         Menu_Item *mi;
211
212         mi = l->data;
213         if ((mi->func == about_start) ||
214             (mi->func == _ui_exit) ||
215             (mi->func == _ui_all))
216           continue;
217         if (mi->func) mi->func();
218         evas_object_hide(o_title);
219         evas_object_hide(o_byline);
220         while (p_fps == 0.0)
221           {
222              engine_loop();
223              ui_loop();
224              evas_render(evas);
225           }
226         /* This give time to delete the objects of the previous test and make
227            the result of next test more accurate. Draw back, some time is not
228            counted at all. */
229         evas_render(evas);
230         t_count++;
231         fps += p_fps;
232         wfps += (p_fps * weights[t_count]);
233         key_func("Escape");
234      }
235    for (i = 1; 
236         (i < ((sizeof(weights) / sizeof(double)) - 1)) &&
237         (weights[i] > 0.0);
238         i++)
239      avgw += weights[i];
240    avgw /= (i - 1);
241    if (t_count > 0)
242      {
243         char datestr[1024];
244         struct tm *tim;
245         time_t now;
246         
247         now = time(NULL);
248         tim = localtime(&now);
249         if (tim) strftime(datestr, sizeof(datestr), "%Y-%m-%d %H:%M:%S", tim);
250         else snprintf(datestr, sizeof(datestr), "unknown");
251 //        printf("%5.2f , EVAS SPEED\n", fps / t_count);
252         printf("%5.2f , EVAS SPEED (WEIGHTED), "
253                "tn, %i , "
254                "t, %s , "
255                "ev , %i.%i.%i.%i , "
256                "p , %s , "
257                "sz , %i , %i , "
258                "c , %i , "
259                "e , %s , "
260                "fs , %i\n"
261                ,
262                wfps / (t_count * avgw),
263 //               fps / t_count,
264                t_count,
265                datestr,
266                evas_version->major, evas_version->minor, evas_version->micro, evas_version->revision,
267                profile,
268                win_w, win_h,
269                loops,
270                engine,
271                fullscreen
272               );
273      }
274 }
275
276
277 static void
278 _ui_num(int n)
279 {
280    double fps = 0.0;
281    double wfps = 0.0;
282    int t_count = 0;
283    Menu_Item *mi;
284    unsigned int i;
285    double avgw = 0.0;
286
287    evas_object_hide(o_menu_logo);
288    evas_object_hide(o_menu_title);
289    evas_object_hide(o_menu_icon);
290    evas_object_hide(o_menu_icon_sel);
291    evas_object_hide(o_menu_icon_sel2);
292    evas_object_hide(o_menu_text_sel);
293    evas_object_hide(o_title);
294    evas_object_hide(o_byline);
295    mi = eina_list_nth(menu, n);
296    if (mi)
297      {
298         if ((mi->func == about_start) ||
299             (mi->func == _ui_exit) ||
300             (mi->func == _ui_all))
301           goto done;
302         if (mi->func) mi->func();
303         evas_object_hide(o_title);
304         evas_object_hide(o_byline);
305         while (p_fps == 0.0)
306           {
307              ui_loop();
308              engine_loop();
309              evas_render(evas);
310           }
311         /* This give time to delete the objects of the previous test and make
312            the result of next test more accurate. Draw back, some time is not
313            counted at all. */
314         evas_render(evas);
315         t_count++;
316         fps += p_fps;
317         wfps += (p_fps * weights[n]);
318         key_func("Escape");
319      }
320    done:
321    for (i = 1; i < ((sizeof(weights) / sizeof(double)) - 1); i++)
322      avgw += weights[i];
323    avgw /= (i - 1);   
324    if (t_count > 0)
325      {
326 //        printf("%5.2f , EVAS SPEED\n", fps / t_count);
327         printf("%5.2f , EVAS SPEED (WEIGHTED)\n", wfps / (t_count * avgw));
328      }
329 }
330
331 static void
332 _ui_select(void)
333 {
334    Eina_List *l;
335    int i;
336    void (*func) (void) = NULL;
337
338    evas_object_hide(o_menu_logo);
339    evas_object_hide(o_menu_title);
340    evas_object_hide(o_menu_icon);
341    evas_object_hide(o_menu_icon_sel);
342    evas_object_hide(o_menu_icon_sel2);
343    evas_object_hide(o_menu_text_sel);
344    evas_object_hide(o_title);
345    evas_object_hide(o_byline);
346    for (i = 0, l = menu; l; l = l->next, i++)
347      {
348         Menu_Item *mi;
349
350         mi = l->data;
351         evas_object_hide(mi->o_icon);
352         if (i == menu_sel)
353           func = mi->func;
354      }
355    menu_active = 0;
356    if (func) func();
357    evas_object_hide(o_title);
358    evas_object_hide(o_byline);
359 }
360
361 static void
362 _ui_key(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
363 {
364    Evas_Event_Key_Down *ev;
365
366    ev = event_info;
367    if (key_func)
368      {
369         key_func(ev->keyname);
370         return;
371      }
372    if ((!strcmp(ev->keyname, "Escape")) ||
373        (!strcmp(ev->keyname, "q")) ||
374        (!strcmp(ev->keyname, "Q")))
375      {
376         _ui_exit();
377      }
378    if (menu_active)
379      {
380         if (!strcmp(ev->keyname, "Left")) menu_sel++;
381         if (!strcmp(ev->keyname, "Right")) menu_sel--;
382         if (menu_sel < 0) menu_sel = 0;
383         else if ((unsigned int)menu_sel >= eina_list_count(menu)) menu_sel = eina_list_count(menu) - 1;
384         menu_anim_sel = menu_sel;
385         if (!strcmp(ev->keyname, "Return")) _ui_select();
386      }
387 }
388
389 static Evas_Coord down_x, down_y;
390 static int down = 0;
391 static int down_menu_sel = 0;
392
393 static void
394 _ui_mouse_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
395 {
396    Evas_Event_Mouse_Down *ev;
397
398    ev = event_info;
399    if (ev->button != 1) return;
400    if (menu_active)
401      {
402         down_x = ev->canvas.x;
403         down_y = ev->canvas.y;
404         down++;
405         down_menu_sel = menu_sel;
406      }
407    else
408      {
409      }
410 }
411
412 static void
413 _ui_mouse_up(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
414 {
415    Evas_Event_Mouse_Up *ev;
416
417    ev = event_info;
418    if (ev->button != 1) return;
419    if (menu_active)
420      {
421         Evas_Coord dx, dy;
422
423         dx = ev->canvas.x - down_x;
424         dy = ev->canvas.y - down_y;
425         if ((((dx * dx) + (dy * dy)) < (20 * 20)) &&
426             (menu_sel == down_menu_sel))
427           _ui_select();
428         down--;
429      }
430    else
431      {
432         evas_event_feed_key_down(evas, "Escape", "Escape", NULL, NULL, 0, NULL);
433         evas_event_feed_key_up(evas, "Escape", "Escape", NULL, NULL, 0, NULL);
434      }
435 }
436
437 static void
438 _ui_mouse_move(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
439 {
440    Evas_Event_Mouse_Move *ev;
441
442    ev = event_info;
443    if (!down) return;
444    if (menu_active)
445      {
446         menu_sel = down_menu_sel + ((ev->cur.canvas.x - down_x) / 25);
447         /* scroll */
448         if (menu_sel < 0) menu_sel = 0;
449         else if ((unsigned int)menu_sel >= eina_list_count(menu)) menu_sel = eina_list_count(menu) - 1;
450         menu_anim_sel = menu_sel;
451      }
452    else
453      {
454      }
455 }
456
457 static void
458 _ui_menu_item_add(char *icon, char *text, void (*func) (void))
459 {
460    Menu_Item *mi;
461
462    mi = malloc(sizeof(Menu_Item));
463    mi->o_icon = evas_object_image_add(evas);
464    evas_object_image_file_set(mi->o_icon, build_path(icon), NULL);
465    evas_object_resize(mi->o_icon, 32, 32);
466    evas_object_image_fill_set(mi->o_icon, 0, 0, 32, 32);
467    mi->icon = strdup(icon);
468    mi->text = strdup(text);
469    mi->func = func;
470    menu = eina_list_append(menu, mi);
471    evas_object_raise(o_menu_icon_sel2);
472 }
473
474 static void
475 _ui_setup(void)
476 {
477    Evas_Object *o;
478    Evas_Coord x, y, w, h;
479    time_t t0, t;
480
481    o = evas_object_rectangle_add(evas);
482    evas_object_move(o, 0, 0);
483    evas_object_resize(o, win_w, win_h);
484    evas_object_color_set(o, 0, 0, 0, 0);
485    evas_object_layer_set(o, 1000);
486    evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, _ui_key, NULL);
487    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, _ui_mouse_down, NULL);
488    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_UP, _ui_mouse_up, NULL);
489    evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_MOVE, _ui_mouse_move, NULL);
490    evas_object_focus_set(o, 1);
491    evas_object_show(o);
492    o_bg = o;
493
494    o = evas_object_rectangle_add(evas);
495    evas_object_move(o, 0, 0);
496    evas_object_resize(o, win_w, win_h);
497    evas_object_color_set(o, 255, 255, 255, 255);
498    evas_object_layer_set(o, -99);
499    evas_object_show(o);
500    o_wallpaper = o;
501
502    o = evas_object_text_add(evas);
503    evas_object_text_font_set(o, "Vera-Bold", 10);
504    evas_object_text_text_set(o, "EXPEDITE");
505    evas_object_layer_set(o, 100);
506    evas_object_color_set(o, 0, 0, 0, 100);
507    evas_object_pass_events_set(o, 1);
508    evas_object_geometry_get(o, NULL, NULL, &w, &h);
509    x = (win_w - w) / 2;
510    y = 0;
511    evas_object_move(o, x, y);
512    evas_object_show(o);
513    o_title = o;
514
515    o = evas_object_text_add(evas);
516    evas_object_text_font_set(o, "Vera", 9);
517    evas_object_text_text_set(o, "LEFT/RIGHT - select, ENTER - select, ESCAPE - exit.");
518    evas_object_layer_set(o, 100);
519    evas_object_color_set(o, 0, 0, 0, 60);
520    evas_object_pass_events_set(o, 1);
521    evas_object_geometry_get(o, NULL, NULL, &w, NULL);
522    x = (win_w - w) / 2;
523    y = h + 2;
524    evas_object_move(o, x, y);
525    evas_object_show(o);
526    o_byline = o;
527
528    o = evas_object_image_add(evas);
529    evas_object_move(o, (win_w - 120) / 2, ((win_h - 160) / 2));
530    evas_object_image_file_set(o, build_path("e-logo.png"), NULL);
531    evas_object_image_fill_set(o, 0, 0, 120, 160);
532    evas_object_resize(o, 120, 160);
533    evas_object_layer_set(o, -98);
534    evas_object_color_set(o, 255, 255, 255, 255);
535    evas_object_show(o);
536    o_menu_logo = o;
537
538    o = evas_object_image_add(evas);
539    evas_object_move(o, win_w - 128, - 128);
540    evas_object_image_fill_set(o, 0, 0, 256, 256);
541    evas_object_resize(o, 256, 256);
542    evas_object_show(o);
543    o_menu_icon = o;
544
545    o = evas_object_image_add(evas);
546    evas_object_move(o, 0, 0);
547    evas_object_image_file_set(o, build_path("icon_sel.png"), NULL);
548    evas_object_resize(o, 48, 48);
549    evas_object_image_fill_set(o, 0, 0, 48, 48);
550    o_menu_icon_sel = o;
551
552    o = evas_object_image_add(evas);
553    evas_object_move(o, 0, 0);
554    evas_object_image_file_set(o, build_path("text_sel.png"), NULL);
555    evas_object_resize(o, 96, 32);
556    evas_object_image_fill_set(o, 0, 0, 96, 32);
557    evas_object_image_border_set(o, 7, 7, 7, 7);
558    o_menu_text_sel = o;
559
560    o = evas_object_text_add(evas);
561    evas_object_text_font_set(o, "Vera", 10);
562    evas_object_text_text_set(o, "");
563    evas_object_color_set(o, 0, 0, 0, 100);
564    evas_object_pass_events_set(o, 1);
565    evas_object_geometry_get(o, NULL, NULL, &w, &h);
566    x = (win_w - w) / 2;
567    y = (win_h - h) / 2;
568    evas_object_move(o, x, y);
569    o_menu_title = o;
570
571    _ui_menu_item_add("e.png", "About", about_start);
572    _ui_menu_item_add("e.png", "All Tests", _ui_all);
573 #define UI
574 #include "tests.h"
575 #undef UI
576    _ui_menu_item_add("exit.png", "Exit", _ui_exit);
577
578 #ifndef _WIN32
579    /* make sure disk io isn't going to turn up unexpectedly */
580    sync();
581    sync();
582    sync();
583 #endif
584    /* warm up the cpu with some spinning */
585    if (run_all)
586      {
587         t0 = time(NULL);
588         for (;;)
589           {
590              t = time(NULL);
591              if (t - t0 > 2) break;
592           }
593      }
594
595    if (run_all)
596      {
597         _ui_all();
598      }
599    else if (run_test > 0)
600      {
601         _ui_num(run_test);
602      }
603    else if (list_test > 0)
604      {
605         Eina_List *l;
606         int i;
607
608         for (l = menu, i = -1; l; l = l->next, i++)
609           {
610              Menu_Item *mi;
611
612              mi = l->data;
613              if (i > 0)
614                printf("%3i - %s (Weight %0.2lf)\n", i, mi->text, weights[i]);
615           }
616      }
617    else
618      {
619         menu_active = 1;
620      }
621
622    if (exit_after_test)
623     _ui_exit();
624
625 }
626
627 void
628 ui_args(int argc, char **argv)
629 {
630    int i;
631
632    for (i = 1; i < argc; i++)
633      {
634         if (!strcmp(argv[i], "-a"))
635           {
636              run_all = 1;
637              exit_after_test = 1;
638           }
639         else if ((!strcmp(argv[i], "-t")) && (i < (argc - 1)))
640           {
641              run_test = atoi(argv[i + 1]) + 1;
642              exit_after_test = 1;
643              if (run_test < 2) run_test = 2;
644           }
645         else if (!strcmp(argv[i], "-l"))
646           {
647              list_test = 1;
648           }
649      }
650    _ui_setup();
651    start = get_time();
652 }
653
654 void
655 ui_loop(void)
656 {
657    static int first = 1;
658    static double pt = 0.0;
659    double t, t2;
660
661    evas_object_resize(o_bg, win_w, win_h);
662    evas_object_resize(o_wallpaper, win_w, win_h);
663    if (loop_func)
664      {
665         t = get_time();
666         f_loop++;
667         f_start++;
668         if ((t - t_loop) >= 1.0)
669           {
670 //           ui_fps((double)f_loop / (t - t_loop));
671              t_loop = t;
672              f_loop = 0;
673           }
674         loop_func(t - t_start, f_start);
675         return;
676      }
677    t2 = get_time();
678    if (first)
679      {
680         t = 0.1;
681         pt = t2;
682      }
683    else
684      {
685         t = t2 - pt;
686         pt = t2;
687      }
688    first = 0;
689
690    /* menu layout */
691    if (menu_active)
692      {
693         Eina_List *l;
694         int i;
695         static double tr = 0.0;
696         double tt;
697
698         tt = t;
699         tt += tr;
700         while (tt > 0.001)
701           {
702              menu_anim = (menu_anim * 0.995) + (menu_anim_sel * 0.005);
703              tt -= 0.001;
704           }
705         tr = tt;
706         for (i = 0, l = menu; l; l = l->next, i++)
707           {
708              char buf[4096];
709              Menu_Item *mi;
710              Evas_Coord x, y, w, h, tw, th;
711              Evas_Coord len;
712              double a;
713              Evas_Object *o;
714
715              mi = l->data;
716              o = mi->o_icon;
717              evas_object_geometry_get(o_menu_logo, NULL, NULL, &w, &h);
718              len = ((w * 3) + 10) / 4;
719              evas_object_geometry_get(o, NULL, NULL, &w, &h);
720              x = (win_w / 2)
721                + (sin((menu_anim - (double)i) * 0.33) * len)
722                  - (w / 2);
723              y = (win_h / 2)
724                + (cos((menu_anim - (double)i) * 0.33) * len)
725                  - (h / 2);
726              evas_object_move(o, x, y);
727              a = menu_anim - (double)i;
728              if (a < 0) a = -a;
729              a = 255 - (30 * a);
730              evas_object_color_set(o, a, a, a, a);
731              evas_object_show(o);
732
733              if (i == menu_sel)
734                {
735                   a = menu_anim - (double)i;
736                   if (a < 0) a = -a;
737                   a = 255 - (255 * a);
738
739                   o = o_menu_icon_sel;
740                   evas_object_move(o, x - ((48 - w) / 2), y - ((48 - h) / 2));
741                   evas_object_color_set(o, a, a, a, a);
742
743                   o = o_menu_title;
744                   evas_object_color_set(o, a, a, a, a);
745                   evas_object_text_text_set(o, mi->text);
746                   evas_object_geometry_get(o, NULL, NULL, &tw, &th);
747                   x = (win_w - tw) / 2;
748                   y = (win_h / 2) + len + 48;
749                   evas_object_move(o, x, y);
750
751                                  
752                   o = o_menu_text_sel;
753                   w = tw + 24;
754                   h = 28;
755                   x = x - 12;
756                   y = y + ((th - h) / 2);
757                   evas_object_move(o, x, y);
758                   evas_object_resize(o, w, h);
759                   evas_object_image_fill_set(o, 0, 0, w, h);
760                   evas_object_color_set(o, a, a, a, a);
761
762                   o = o_menu_icon;
763                   snprintf(buf, 4096, "%s%s", data_dir, mi->icon);
764                   evas_object_image_file_set(o, buf, NULL);
765                   evas_object_color_set(o, a / 2, a / 2, a / 2, a / 2);
766                }
767           }
768         evas_object_move(o_menu_logo, (win_w - 120) / 2, ((win_h - 160) / 2));
769         evas_object_show(o_menu_logo);
770         evas_object_show(o_menu_title);
771         evas_object_show(o_menu_icon);
772         evas_object_show(o_menu_icon_sel);
773         evas_object_show(o_menu_icon_sel2);
774         evas_object_show(o_menu_text_sel);
775      }
776    else
777      {
778      }
779 }
780
781 void
782 ui_menu(void)
783 {
784    evas_object_show(o_title);
785    evas_object_show(o_byline);
786    evas_object_text_text_set
787      (o_byline, "LEFT/RIGHT - select, ENTER - select, ESCAPE - exit.");
788    menu_active = 1;
789    key_func = NULL;
790    loop_func = NULL;
791 }
792
793 void
794 ui_func_set(void (*kfunc) (char *key), void (*lfunc) (double t, int f))
795 {
796    key_func = kfunc;
797    loop_func = lfunc;
798    t_loop = t_start = get_time();
799    f_loop = f_start = 0;
800    ui_fps(0.0);
801 }
802
803
804 void
805 ui_fps(double fps)
806 {
807    /*
808    char buf[256];
809
810    snprintf(buf, sizeof(buf), "ESCAPE - exit, FPS: %4.3f", fps);
811    evas_object_text_text_set(o_byline, buf);
812     */
813    p_fps = fps;
814 }