elementary - deprecated elm_engine_current_get API
[framework/uifw/elementary.git] / src / bin / config.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6
7 typedef struct _Theme               Theme;
8 typedef struct _Fonts_Data          Fonts_Data;
9 typedef struct _Elm_Text_Class_Data Elm_Text_Class_Data;
10 typedef struct _Elm_Font_Size_Data  Elm_Font_Size_Data;
11
12 struct _Theme
13 {
14    const char *label;
15    const char *name;
16    const char *path;
17    Eina_Bool   in_search_path;
18 };
19
20 static const Eina_List *tsel = NULL;
21 static Eina_List *themes = NULL;
22
23 struct _Elm_Text_Class_Data
24 {
25    const char    *name;
26    const char    *desc;
27    const char    *font;
28    const char    *style;
29    Evas_Font_Size size;
30 };
31
32 struct _Elm_Font_Size_Data
33 {
34    const char    *size_str;
35    Evas_Font_Size size;
36 };
37
38 struct _Fonts_Data
39 {
40    Eina_List  *text_classes;
41
42    Eina_Hash  *font_hash;
43    Eina_List  *font_px_list;
44    Eina_List  *font_scale_list;
45
46    const char *cur_font;
47    const char *cur_style;
48    double      cur_size;
49 };
50
51 #define ELM_LIST_DISABLE(list)                         \
52   do                                                   \
53     {                                                  \
54        const Eina_List *l = elm_list_items_get(list);  \
55        if (l)                                          \
56          {                                             \
57             elm_list_item_show(eina_list_data_get(l)); \
58             elm_object_disabled_set(list, EINA_TRUE);  \
59          }                                             \
60     }                                                  \
61   while (0)
62
63 #define ELM_LIST_ENABLE(list)                     \
64   do                                              \
65     {                                             \
66        elm_object_disabled_set(list, EINA_FALSE); \
67     }                                             \
68   while (0)
69
70 #define LABEL_FRAME_ADD(label)                                      \
71   do                                                                \
72     {                                                               \
73        pd = elm_frame_add(win);                                     \
74        evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0); \
75        evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, 0.5);    \
76        elm_object_style_set(pd, "pad_medium");                      \
77        elm_box_pack_end(bx, pd);                                    \
78        evas_object_show(pd);                                        \
79                                                                     \
80        lb = elm_label_add(win);                                     \
81        evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0); \
82        evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5);    \
83        elm_object_text_set(lb, label);                              \
84        elm_object_content_set(pd, lb);                               \
85        evas_object_show(lb);                                        \
86     }                                                               \
87   while (0)
88
89 static Evas_Object *main_win = NULL;
90
91 static int quiet = 0;
92 static int interactive = 1;
93
94 static const char *theme_set = NULL;
95 static const char *finger_size_set = NULL;
96 static const char *scale_set = NULL;
97 static Fonts_Data fdata = {NULL, NULL, NULL, NULL, NULL, NULL, 0.0};
98
99 static void
100 _font_styles_list_sel(void *data   __UNUSED__,
101                       Evas_Object *obj,
102                       void        *event_info);
103
104 static void
105 config_exit(void *data       __UNUSED__,
106             Evas_Object *obj __UNUSED__,
107             void *event_info __UNUSED__)
108 {
109    Elm_Text_Class_Data *tc_data;
110    Elm_Font_Size_Data *sd;
111
112    EINA_LIST_FREE(fdata.text_classes, tc_data)
113      {
114         eina_stringshare_del(tc_data->name);
115         eina_stringshare_del(tc_data->desc);
116         eina_stringshare_del(tc_data->font);
117         eina_stringshare_del(tc_data->style);
118         free(tc_data);
119      }
120
121    elm_font_available_hash_del(fdata.font_hash);
122    fdata.font_hash = NULL;
123
124    EINA_LIST_FREE(fdata.font_px_list, sd)
125      {
126         eina_stringshare_del(sd->size_str);
127         free(sd);
128      }
129
130    EINA_LIST_FREE(fdata.font_scale_list, sd)
131      {
132         eina_stringshare_del(sd->size_str);
133         free(sd);
134      }
135
136    if (fdata.cur_font) eina_stringshare_del(fdata.cur_font);
137    fdata.cur_font = NULL;
138
139    if (fdata.cur_style) eina_stringshare_del(fdata.cur_style);
140    fdata.cur_style = NULL;
141
142    elm_config_save();
143    elm_exit(); /* exit the program's main loop that runs in elm_run() */
144 }
145
146 static void
147 sb_change(void *data       __UNUSED__,
148           Evas_Object     *obj,
149           void *event_info __UNUSED__)
150 {
151    Eina_Bool val = elm_check_state_get(obj);
152    Eina_Bool sb = elm_scroll_bounce_enabled_get();
153
154    if (val == sb) return;
155    elm_scroll_bounce_enabled_all_set(val);
156
157    /*TODO: enable/disable subordinate sliders (make 'em support it 1st)*/
158 }
159
160 static void
161 bf_round(void *data       __UNUSED__,
162          Evas_Object     *obj,
163          void *event_info __UNUSED__)
164 {
165    double val = elm_slider_value_get(obj);
166    double v;
167
168    v = ((double)((int)(val * 10.0))) / 10.0;
169    if (v != val) elm_slider_value_set(obj, v);
170 }
171
172 static void
173 bf_change(void *data       __UNUSED__,
174           Evas_Object     *obj,
175           void *event_info __UNUSED__)
176 {
177    double bf = elm_scroll_bounce_friction_get();
178    double val = elm_slider_value_get(obj);
179
180    if (bf == val) return;
181    elm_scroll_bounce_friction_all_set(val);
182 }
183
184 static void
185 ps_round(void *data       __UNUSED__,
186          Evas_Object     *obj,
187          void *event_info __UNUSED__)
188 {
189    double val = elm_slider_value_get(obj);
190    double v;
191
192    v = ((double)((int)(val * 10.0))) / 10.0;
193    if (v != val) elm_slider_value_set(obj, v);
194 }
195
196 static void
197 ps_change(void *data       __UNUSED__,
198           Evas_Object     *obj,
199           void *event_info __UNUSED__)
200 {
201    double ps = elm_scroll_page_scroll_friction_get();
202    double val = elm_slider_value_get(obj);
203
204    if (ps == val) return;
205    elm_scroll_page_scroll_friction_all_set(val);
206 }
207
208 static void
209 bis_round(void *data       __UNUSED__,
210           Evas_Object     *obj,
211           void *event_info __UNUSED__)
212 {
213    double val = elm_slider_value_get(obj);
214    double v;
215
216    v = ((double)((int)(val * 10.0))) / 10.0;
217    if (v != val) elm_slider_value_set(obj, v);
218 }
219
220 static void
221 bis_change(void *data       __UNUSED__,
222            Evas_Object     *obj,
223            void *event_info __UNUSED__)
224 {
225    double bis = elm_scroll_bring_in_scroll_friction_get();
226    double val = elm_slider_value_get(obj);
227
228    if (bis == val) return;
229    elm_scroll_bring_in_scroll_friction_all_set(val);
230 }
231
232 static void
233 zf_round(void *data       __UNUSED__,
234          Evas_Object     *obj,
235          void *event_info __UNUSED__)
236 {
237    double val = elm_slider_value_get(obj);
238    double v;
239
240    v = ((double)((int)(val * 10.0))) / 10.0;
241    if (v != val) elm_slider_value_set(obj, v);
242 }
243
244 static void
245 zf_change(void *data       __UNUSED__,
246           Evas_Object     *obj,
247           void *event_info __UNUSED__)
248 {
249    double zf = elm_scroll_zoom_friction_get();
250    double val = elm_slider_value_get(obj);
251
252    if (zf == val) return;
253    elm_scroll_zoom_friction_all_set(val);
254 }
255
256 static void
257 ts_change(void *data       __UNUSED__,
258           Evas_Object     *obj,
259           void *event_info __UNUSED__)
260 {
261    Eina_Bool val = elm_check_state_get(obj);
262    Eina_Bool sb = elm_scroll_thumbscroll_enabled_get();
263
264    if (val == sb) return;
265    elm_scroll_thumbscroll_enabled_all_set(val);
266
267    /*TODO: enable/disable subordinate sliders (make 'em support it 1st)*/
268 }
269
270 static void
271 tst_round(void *data       __UNUSED__,
272           Evas_Object     *obj,
273           void *event_info __UNUSED__)
274 {
275    double val = elm_slider_value_get(obj);
276    double v;
277
278    v = ((double)((int)(val * 10.0))) / 10.0;
279    if (v != val) elm_slider_value_set(obj, v);
280 }
281
282 static void
283 tst_change(void *data       __UNUSED__,
284            Evas_Object     *obj,
285            void *event_info __UNUSED__)
286 {
287    double tst = elm_scroll_thumbscroll_threshold_get();
288    double val = elm_slider_value_get(obj);
289
290    if (tst == val) return;
291    elm_scroll_thumbscroll_threshold_all_set(val);
292 }
293
294 static void
295 tsmt_round(void *data       __UNUSED__,
296            Evas_Object     *obj,
297            void *event_info __UNUSED__)
298 {
299    double val = elm_slider_value_get(obj);
300    double v;
301
302    v = ((double)((int)(val * 10.0))) / 10.0;
303    if (v != val) elm_slider_value_set(obj, v);
304 }
305
306 static void
307 tsmt_change(void *data       __UNUSED__,
308             Evas_Object     *obj,
309             void *event_info __UNUSED__)
310 {
311    double tsmt = elm_scroll_thumbscroll_momentum_threshold_get();
312    double val = elm_slider_value_get(obj);
313
314    if (tsmt == val) return;
315    elm_scroll_thumbscroll_momentum_threshold_all_set(val);
316 }
317
318 static void
319 tsf_round(void *data       __UNUSED__,
320           Evas_Object     *obj,
321           void *event_info __UNUSED__)
322 {
323    double val = elm_slider_value_get(obj);
324    double v;
325
326    v = ((double)((int)(val * 10.0))) / 10.0;
327    if (v != val) elm_slider_value_set(obj, v);
328 }
329
330 static void
331 tsf_change(void *data       __UNUSED__,
332            Evas_Object     *obj,
333            void *event_info __UNUSED__)
334 {
335    double tsf = elm_scroll_thumbscroll_friction_get();
336    double val = elm_slider_value_get(obj);
337
338    if (tsf == val) return;
339    elm_scroll_thumbscroll_friction_all_set(val);
340 }
341
342 static void
343 tsbf_round(void *data       __UNUSED__,
344            Evas_Object     *obj,
345            void *event_info __UNUSED__)
346 {
347    double val = elm_slider_value_get(obj);
348    double v;
349
350    v = ((double)((int)(val * 10.0))) / 10.0;
351    if (v != val) elm_slider_value_set(obj, v);
352 }
353
354 static void
355 tsbf_change(void *data       __UNUSED__,
356             Evas_Object     *obj,
357             void *event_info __UNUSED__)
358 {
359    double tsbf = elm_scroll_thumbscroll_border_friction_get();
360    double val = elm_slider_value_get(obj);
361
362    if (tsbf == val) return;
363    elm_scroll_thumbscroll_border_friction_all_set(val);
364 }
365
366 static void
367 tssf_round(void *data       __UNUSED__,
368            Evas_Object     *obj,
369            void *event_info __UNUSED__)
370 {
371    double val = elm_slider_value_get(obj);
372    double v;
373
374    v = ((double)((int)(val * 20.0))) / 20.0;
375    if (v != val) elm_slider_value_set(obj, v);
376 }
377
378 static void
379 tssf_change(void *data       __UNUSED__,
380             Evas_Object     *obj,
381             void *event_info __UNUSED__)
382 {
383    double tssf = elm_scroll_thumbscroll_sensitivity_friction_get();
384    double val = elm_slider_value_get(obj);
385
386    if (tssf == val) return;
387    elm_scroll_thumbscroll_sensitivity_friction_all_set(val);
388 }
389
390 static void
391 cf_enable(void *data,
392           Evas_Object     *obj,
393           void *event_info __UNUSED__)
394 {
395    Eina_Bool cf = elm_cache_flush_enabled_get();
396    Eina_Bool val = elm_check_state_get(obj);
397
398    if (cf == val) return;
399    elm_object_disabled_set((Evas_Object *)data, !val);
400    elm_cache_flush_enabled_all_set(val);
401 }
402
403 static void
404 cf_round(void *data       __UNUSED__,
405          Evas_Object     *obj,
406          void *event_info __UNUSED__)
407 {
408    double val = elm_slider_value_get(obj);
409    double v;
410
411    v = ((double)((int)(val * 5.0))) / 5.0;
412    if (v != val) elm_slider_value_set(obj, v);
413 }
414
415 static void
416 cf_change(void *data       __UNUSED__,
417           Evas_Object     *obj,
418           void *event_info __UNUSED__)
419 {
420    double cf = elm_cache_flush_interval_get();
421    double val = elm_slider_value_get(obj);
422
423    if (cf == val) return;
424    elm_cache_flush_interval_all_set(val);
425 }
426
427 static void
428 fc_round(void *data       __UNUSED__,
429          Evas_Object     *obj,
430          void *event_info __UNUSED__)
431 {
432    double val = elm_slider_value_get(obj);
433    double v;
434
435    v = ((double)((int)(val * 10.0))) / 10.0;
436    if (v != val) elm_slider_value_set(obj, v);
437 }
438
439 static void
440 fc_change(void *data       __UNUSED__,
441           Evas_Object     *obj,
442           void *event_info __UNUSED__)
443 {
444    double font_cache = elm_font_cache_get();
445    double val = elm_slider_value_get(obj);
446
447    if (font_cache == val) return;
448    elm_font_cache_all_set(val * 1024);
449 }
450
451 static void
452 ic_round(void *data       __UNUSED__,
453          Evas_Object     *obj,
454          void *event_info __UNUSED__)
455 {
456    double val = elm_slider_value_get(obj);
457    double v;
458
459    v = ((double)((int)(val * 10.0))) / 10.0;
460    if (v != val) elm_slider_value_set(obj, v);
461 }
462
463 static void
464 ic_change(void *data       __UNUSED__,
465           Evas_Object     *obj,
466           void *event_info __UNUSED__)
467 {
468    double image_cache = elm_image_cache_get();
469    double val = elm_slider_value_get(obj);
470
471    if (image_cache == val) return;
472    elm_image_cache_all_set(val * 1024);
473 }
474
475 static void
476 sc_round(void *data       __UNUSED__,
477          Evas_Object     *obj,
478          void *event_info __UNUSED__)
479 {
480    double val = elm_slider_value_get(obj);
481    double v;
482
483    v = ((double)((int)(val * 10.0))) / 10.0;
484    if (v != val) elm_slider_value_set(obj, v);
485 }
486
487 static void
488 sc_change(void *data       __UNUSED__,
489           Evas_Object     *obj,
490           void *event_info __UNUSED__)
491 {
492    double scale = elm_scale_get();
493    double val = elm_slider_value_get(obj);
494
495    if (scale == val) return;
496    elm_scale_all_set(val);
497 }
498
499 static void
500 fs_round(void *data       __UNUSED__,
501          Evas_Object     *obj,
502          void *event_info __UNUSED__)
503 {
504    double val = elm_slider_value_get(obj);
505    double v;
506
507    v = ((double)((int)(val * 5.0))) / 5.0;
508    if (v != val) elm_slider_value_set(obj, v);
509 }
510
511 static void
512 fs_change(void *data       __UNUSED__,
513           Evas_Object     *obj,
514           void *event_info __UNUSED__)
515 {
516    double fs = elm_finger_size_get();
517    double val = elm_slider_value_get(obj);
518
519    if (fs == val) return;
520    elm_finger_size_all_set(val);
521 }
522
523 static void
524 efc_round(void *data       __UNUSED__,
525           Evas_Object     *obj,
526           void *event_info __UNUSED__)
527 {
528    double val = elm_slider_value_get(obj);
529    double v;
530
531    v = ((double)((int)(val * 5.0))) / 5.0;
532    if (v != val) elm_slider_value_set(obj, v);
533 }
534
535 static void
536 efc_change(void *data       __UNUSED__,
537            Evas_Object     *obj,
538            void *event_info __UNUSED__)
539 {
540    double efc = elm_edje_file_cache_get();
541    double val = elm_slider_value_get(obj);
542
543    if (efc == val) return;
544    elm_edje_file_cache_all_set(val);
545 }
546
547 static void
548 ecc_round(void *data       __UNUSED__,
549           Evas_Object     *obj,
550           void *event_info __UNUSED__)
551 {
552    double val = elm_slider_value_get(obj);
553    double v;
554
555    v = ((double)((int)(val * 5.0))) / 5.0;
556    if (v != val) elm_slider_value_set(obj, v);
557 }
558
559 static void
560 ecc_change(void *data       __UNUSED__,
561            Evas_Object     *obj,
562            void *event_info __UNUSED__)
563 {
564    double ecc = elm_edje_collection_cache_get();
565    double val = elm_slider_value_get(obj);
566
567    if (ecc == val) return;
568    elm_edje_collection_cache_all_set(val);
569 }
570
571 static void
572 _status_basic(Evas_Object *win,
573               Evas_Object *bx0)
574 {
575    Evas_Object *lb, *fr;
576
577    fr = elm_frame_add(win);
578    evas_object_size_hint_weight_set(fr, 1.0, 1.0);
579    elm_object_text_set(fr, "Information");
580    elm_box_pack_end(bx0, fr);
581    evas_object_show(fr);
582
583    lb = elm_label_add(win);
584    elm_object_text_set(lb,
585                        "Applying configuration change"
586                        );
587    elm_object_content_set(fr, lb);
588    evas_object_show(lb);
589 }
590
591 static void
592 _status_config(Evas_Object *win,
593                Evas_Object *bx0)
594 {
595    Evas_Object *lb, *pd, *bx, *fr, *sl, *sp;
596
597    fr = elm_frame_add(win);
598    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
599    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
600    elm_object_text_set(fr, "Sizing");
601    elm_box_pack_end(bx0, fr);
602    evas_object_show(fr);
603
604    bx = elm_box_add(win);
605    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
606    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
607
608    LABEL_FRAME_ADD("<hilight>Scale</>");
609
610    sl = elm_slider_add(win);
611    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
612    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
613    elm_slider_span_size_set(sl, 120);
614    elm_slider_unit_format_set(sl, "%1.2f");
615    elm_slider_indicator_format_set(sl, "%1.2f");
616    elm_slider_min_max_set(sl, 0.25, 5.0);
617    elm_slider_value_set(sl, elm_scale_get());
618    elm_box_pack_end(bx, sl);
619    evas_object_show(sl);
620
621    evas_object_smart_callback_add(sl, "changed", sc_round, NULL);
622    evas_object_smart_callback_add(sl, "delay,changed", sc_change, NULL);
623
624    sp = elm_separator_add(win);
625    elm_separator_horizontal_set(sp, 1);
626    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
627    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
628    elm_box_pack_end(bx, sp);
629    evas_object_show(sp);
630
631    LABEL_FRAME_ADD("<hilight>Finger Size</><br/>");
632
633    sl = elm_slider_add(win);
634    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
635    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
636    elm_slider_span_size_set(sl, 120);
637    elm_slider_unit_format_set(sl, "%1.0f");
638    elm_slider_indicator_format_set(sl, "%1.0f");
639    elm_slider_min_max_set(sl, 5, 200);
640    elm_slider_value_set(sl, elm_finger_size_get());
641    elm_box_pack_end(bx, sl);
642    evas_object_show(sl);
643
644    evas_object_smart_callback_add(sl, "changed", fs_round, NULL);
645    evas_object_smart_callback_add(sl, "delay,changed", fs_change, NULL);
646
647    // FIXME: add theme selector (basic mode and advanced for fallbacks)
648    // FIXME: save config
649    // FIXME: profile selector / creator etc.
650    elm_object_content_set(fr, bx);
651    evas_object_show(bx);
652 }
653
654 static void
655 _flip_to(Evas_Object *win,
656          const char  *name)
657 {
658    Evas_Object *wid, *pager;
659    wid = evas_object_data_get(win, name);
660    pager = evas_object_data_get(win, "pager");
661    elm_pager_content_promote(pager, wid);
662 }
663
664 static void
665 _cf_sizing(void            *data,
666            Evas_Object *obj __UNUSED__,
667            void *event_info __UNUSED__)
668 {
669    _flip_to(data, "sizing");
670 }
671
672 static void
673 _cf_themes(void            *data,
674            Evas_Object *obj __UNUSED__,
675            void *event_info __UNUSED__)
676 {
677    _flip_to(data, "themes");
678 }
679
680 static void
681 _cf_fonts(void            *data,
682           Evas_Object *obj __UNUSED__,
683           void *event_info __UNUSED__)
684 {
685    _flip_to(data, "fonts");
686 }
687
688 static void
689 _cf_profiles(void            *data,
690              Evas_Object *obj __UNUSED__,
691              void *event_info __UNUSED__)
692 {
693    _flip_to(data, "profiles");
694 }
695
696 static void
697 _cf_scrolling(void            *data,
698               Evas_Object *obj __UNUSED__,
699               void *event_info __UNUSED__)
700 {
701    _flip_to(data, "scrolling");
702 }
703
704 static void
705 _cf_rendering(void            *data,
706               Evas_Object *obj __UNUSED__,
707               void *event_info __UNUSED__)
708 {
709    _flip_to(data, "rendering");
710 }
711
712 static void
713 _cf_caches(void            *data,
714            Evas_Object *obj __UNUSED__,
715            void *event_info __UNUSED__)
716 {
717    _flip_to(data, "caches");
718 }
719
720 const char *
721 _elm_theme_current_get(const char *theme_search_order)
722 {
723    const char *ret;
724    const char *p;
725
726    if (!theme_search_order)
727      return NULL;
728
729    for (p = theme_search_order;; p++)
730      {
731         if ((*p == ':') || (!*p))
732           {
733              if (p > theme_search_order)
734                {
735                   char *n = malloc(p - theme_search_order + 1);
736                   if (!n)
737                     return NULL;
738
739                   strncpy(n, theme_search_order, p - theme_search_order);
740                   n[p - theme_search_order] = 0;
741                   ret = eina_stringshare_add(n);
742                   free(n);
743                   break;
744                }
745           }
746      }
747
748    return ret;
749 }
750
751 static void
752 _font_overlay_set_all(void            *data,
753                       Evas_Object *obj __UNUSED__,
754                       void *event_info __UNUSED__)
755 {
756    Evas_Object *win, *fclasses;
757    Elm_Text_Class_Data *tc_data, *tc;
758    Elm_Object_Item *list_it;
759    Eina_List *l;
760
761    win = data;
762
763    fclasses = evas_object_data_get(win, "font_classes_list");
764    list_it = elm_list_selected_item_get(fclasses);
765    if (!list_it) return;
766    tc_data = elm_object_item_data_get(list_it);
767
768    EINA_LIST_FOREACH(fdata.text_classes, l, tc)
769      {
770         eina_stringshare_replace(&tc->font, tc_data->font);
771         eina_stringshare_replace(&tc->style, tc_data->style);
772         tc->size = tc_data->size;
773      }
774
775    elm_config_save();
776 }
777
778 static void
779 _font_overlay_reset(void            *data,
780                     Evas_Object *obj __UNUSED__,
781                     void *event_info __UNUSED__)
782 {
783    Evas_Object *win, *fclasses, *fnames, *fstyles, *fsizes;
784    Elm_Text_Class_Data *tc_data;
785    Elm_Object_Item *list_it;
786
787    win = data;
788
789    fclasses = evas_object_data_get(win, "font_classes_list");
790    list_it = elm_list_selected_item_get(fclasses);
791    if (!list_it) return;
792    tc_data = elm_object_item_data_get(list_it);
793
794    fnames = evas_object_data_get(win, "font_names_list");
795    fstyles = evas_object_data_get(win, "font_styles_list");
796    fsizes = evas_object_data_get(win, "font_sizes_list");
797
798    elm_font_overlay_unset(tc_data->name);
799
800    eina_stringshare_replace(&fdata.cur_font, NULL);
801    eina_stringshare_replace(&tc_data->font, NULL);
802    eina_stringshare_replace(&fdata.cur_style, NULL);
803    eina_stringshare_replace(&tc_data->style, NULL);
804    fdata.cur_size = 0.0;
805    tc_data->size = 0.0;
806
807    ELM_LIST_DISABLE(fnames);
808    ELM_LIST_DISABLE(fstyles);
809    ELM_LIST_DISABLE(fsizes);
810
811    elm_config_save();
812 }
813
814 static void
815 _font_overlay_reset_all(void            *data,
816                         Evas_Object *obj __UNUSED__,
817                         void *event_info __UNUSED__)
818 {
819    Evas_Object *win, *fclasses, *fnames, *fstyles, *fsizes;
820    Elm_Text_Class_Data *tc_data;
821    Elm_Object_Item *list_it;
822    Eina_List *l;
823
824    win = data;
825    eina_stringshare_replace(&fdata.cur_font, NULL);
826    eina_stringshare_replace(&fdata.cur_style, NULL);
827    fdata.cur_size = 0.0;
828
829    EINA_LIST_FOREACH(fdata.text_classes, l, tc_data)
830      {
831         elm_font_overlay_unset(tc_data->name);
832
833         eina_stringshare_replace(&tc_data->font, NULL);
834         eina_stringshare_replace(&tc_data->style, NULL);
835         tc_data->size = 0.0;
836      }
837
838    fclasses = evas_object_data_get(win, "font_classes_list");
839    fnames = evas_object_data_get(win, "font_names_list");
840    fstyles = evas_object_data_get(win, "font_styles_list");
841    fsizes = evas_object_data_get(win, "font_sizes_list");
842
843    list_it = elm_list_selected_item_get(fclasses);
844    if (list_it) elm_list_item_selected_set(list_it, EINA_FALSE);
845
846    ELM_LIST_DISABLE(fnames);
847    ELM_LIST_DISABLE(fstyles);
848    ELM_LIST_DISABLE(fsizes);
849
850    elm_config_save();
851 }
852
853 static void
854 _font_overlay_change(void *data       __UNUSED__,
855                      Evas_Object *obj __UNUSED__,
856                      void *event_info __UNUSED__)
857 {
858    Elm_Text_Class_Data *tc_data;
859    Eina_List *l;
860
861    EINA_LIST_FOREACH(fdata.text_classes, l, tc_data)
862      {
863         if (tc_data->font)
864           {
865              const char *name;
866
867              name = elm_font_fontconfig_name_get(tc_data->font,
868                                                  tc_data->style);
869              elm_font_overlay_set(tc_data->name, name,
870                                   tc_data->size ? tc_data->size : -100);
871              elm_font_fontconfig_name_free(name);
872           }
873         else
874           elm_font_overlay_unset(tc_data->name);
875      }
876
877    elm_config_save();
878    elm_font_overlay_all_apply();
879
880    /* TODO: apply hinting */
881 }
882
883 static void
884 _config_display_update(Evas_Object *win)
885 {
886    int flush_interval, font_c, image_c, edje_file_c, edje_col_c, ts_threshould;
887    double scale, s_bounce_friction, ts_momentum_threshold, ts_friction,
888           ts_border_friction, ts_sensitivity_friction, page_friction, bring_in_friction, zoom_friction;
889    const char *curr_theme, *curr_engine;
890    const Eina_List *l_items, *l;
891    Eina_Bool s_bounce, ts;
892    Elm_Object_Item *list_it;
893    Elm_Theme *th;
894    int fs;
895
896    scale = elm_scale_get();
897    fs = elm_finger_size_get();
898    flush_interval = elm_cache_flush_interval_get();
899    font_c = elm_font_cache_get();
900    image_c = elm_image_cache_get();
901    edje_file_c = elm_edje_file_cache_get();
902    edje_col_c = elm_edje_collection_cache_get();
903
904    s_bounce = elm_scroll_bounce_enabled_get();
905    s_bounce_friction = elm_scroll_bounce_friction_get();
906    ts = elm_scroll_thumbscroll_enabled_get();
907    ts_threshould = elm_scroll_thumbscroll_threshold_get();
908    ts_momentum_threshold = elm_scroll_thumbscroll_momentum_threshold_get();
909    ts_friction = elm_scroll_thumbscroll_friction_get();
910    ts_border_friction = elm_scroll_thumbscroll_border_friction_get();
911    ts_sensitivity_friction = elm_scroll_thumbscroll_sensitivity_friction_get();
912    page_friction = elm_scroll_page_scroll_friction_get();
913    bring_in_friction = elm_scroll_bring_in_scroll_friction_get();
914    zoom_friction = elm_scroll_zoom_friction_get();
915
916    /* gotta update root windows' atoms */
917 //   elm_scale_all_set(scale);
918    elm_slider_value_set(evas_object_data_get(win, "scale_slider"), scale);
919 //   elm_finger_size_all_set(fs);
920    elm_slider_value_set(evas_object_data_get(win, "fs_slider"), fs);
921
922 //   elm_cache_flush_interval_all_set(flush_interval);
923    elm_slider_value_set(evas_object_data_get(win,
924                                              "cache_flush_interval_slider"),
925                         flush_interval);
926 //   elm_font_cache_all_set(font_c);
927    elm_slider_value_set(evas_object_data_get(win, "font_cache_slider"),
928                         font_c / 1024.0);
929 //   elm_image_cache_all_set(image_c);
930    elm_slider_value_set(evas_object_data_get(win, "image_cache_slider"),
931                         image_c / 1024.0);
932 //   elm_edje_file_cache_all_set(edje_file_c);
933    elm_slider_value_set(evas_object_data_get(win, "edje_file_cache_slider"),
934                         edje_file_c);
935 //   elm_edje_collection_cache_all_set(edje_col_c);
936    elm_slider_value_set(evas_object_data_get(win,
937                                              "edje_collection_cache_slider"),
938                         edje_col_c);
939
940 //   elm_scroll_bounce_enabled_all_set(s_bounce);
941    elm_check_state_set(evas_object_data_get(win, "scroll_bounce_check"),
942                        s_bounce);
943 //   elm_scroll_bounce_friction_all_set(s_bounce_friction);
944    elm_slider_value_set(evas_object_data_get(win, "bounce_friction_slider"),
945                         s_bounce_friction);
946 //   elm_scroll_thumbscroll_enabled_all_set(ts);
947    elm_check_state_set(evas_object_data_get(win, "thumbscroll_check"), ts);
948 //   elm_scroll_thumbscroll_threshold_all_set(ts_threshould);
949    elm_slider_value_set(evas_object_data_get(win,
950                                              "thumbscroll_threshold_slider"),
951                         ts_threshould);
952 //   elm_scroll_thumbscroll_momentum_threshold_all_set(ts_momentum_threshold);
953    elm_slider_value_set(evas_object_data_get(win,
954                                              "ts_momentum_threshold_slider"),
955                         ts_momentum_threshold);
956 //   elm_scroll_thumbscroll_friction_all_set(ts_friction);
957    elm_slider_value_set(evas_object_data_get(win,
958                                              "thumbscroll_friction_slider"),
959                         ts_friction);
960 //   elm_scroll_thumbscroll_border_friction_all_set(ts_border_friction);
961    elm_slider_value_set(evas_object_data_get(win, "ts_border_friction_slider"),
962                         ts_border_friction);
963 //   elm_scroll_thumbscroll_sensitivity_friction_all_set(ts_sensitivity_friction);
964    elm_slider_value_set(evas_object_data_get(win, "ts_sensitivity_friction_slider"),
965                         ts_sensitivity_friction);
966 //   elm_scroll_page_scroll_friction_all_set(page_friction);
967    elm_slider_value_set(evas_object_data_get(win,
968                                              "page_scroll_friction_slider"),
969                         page_friction);
970 //   elm_scroll_bring_in_scroll_friction_all_set(bring_in_friction);
971    elm_slider_value_set(evas_object_data_get(win,
972                                              "bring_in_scroll_friction_slider"),
973                         bring_in_friction);
974 //   elm_scroll_zoom_friction_all_set(zoom_friction);
975    elm_slider_value_set(evas_object_data_get(win,
976                                              "zoom_scroll_friction_slider"),
977                         zoom_friction);
978
979    curr_theme = _elm_theme_current_get(elm_theme_get(NULL));
980 //   elm_theme_all_set(curr_theme);
981
982    th = elm_theme_new();
983    elm_theme_set(th, curr_theme);
984    elm_object_theme_set(evas_object_data_get(win, "theme_preview"), th);
985    elm_theme_free(th);
986    eina_stringshare_del(curr_theme);
987
988    curr_engine = elm_engine_get();
989    l_items = elm_list_items_get(evas_object_data_get(win, "engines_list"));
990    EINA_LIST_FOREACH(l_items, l, list_it)
991      {
992         if (!strcmp(elm_object_item_data_get(list_it), curr_engine))
993           {
994              elm_list_item_selected_set(list_it, EINA_TRUE);
995              break;
996           }
997      }
998 }
999
1000 static void
1001 _profile_change_do(Evas_Object *win,
1002                    const char  *profile)
1003 {
1004    elm_profile_all_set(profile);
1005    _config_display_update(win);
1006 }
1007
1008 static Eina_Bool
1009 _config_all_changed(void *data,
1010                     int ev_type __UNUSED__,
1011                     void *ev __UNUSED__)
1012 {
1013    Evas_Object *win = data;
1014    _config_display_update(win);
1015    return ECORE_CALLBACK_PASS_ON;
1016 }
1017
1018 static void
1019 _engine_use(void            *data,
1020             Evas_Object *obj __UNUSED__,
1021             void *event_info __UNUSED__)
1022 {
1023    Evas_Object *li;
1024    const char *selection;
1025
1026    li = data;
1027    selection = elm_object_item_data_get(elm_list_selected_item_get(li));
1028
1029    if (!strcmp(elm_engine_get(), selection))
1030      return;
1031
1032    elm_engine_set(selection);
1033    elm_config_save(); /* make sure new engine has its data dir */
1034 }
1035
1036 static void
1037 _profile_use(void            *data,
1038              Evas_Object *obj __UNUSED__,
1039              void *event_info __UNUSED__)
1040 {
1041    Evas_Object *li;
1042    const char *selection;
1043    const char *profile;
1044
1045    li = data;
1046    selection = elm_object_item_data_get(elm_list_selected_item_get(li));
1047    profile = elm_profile_current_get();
1048
1049    if (!profile)
1050      {
1051         fprintf(stderr, "No profile currently set!\n"); /* FIXME: log domain */
1052         return;
1053      }
1054
1055    if (!strcmp(profile, selection))
1056      return;
1057
1058    elm_profile_set(selection); /* just here to update info for getters below */
1059
1060    _profile_change_do(elm_object_top_widget_get(li), selection);
1061    elm_config_save(); /* make sure new profile has its data dir */
1062 }
1063
1064 static void
1065 _btn_todo(void *data       __UNUSED__,
1066           Evas_Object *obj __UNUSED__,
1067           void *event_info __UNUSED__)
1068 {
1069    printf("To be done!\n");
1070 }
1071
1072 static void
1073 _profile_reset(void            *data,
1074                Evas_Object *obj __UNUSED__,
1075                void *event_info __UNUSED__)
1076 {
1077    const char *selection, *curr;
1078    const char *pdir;
1079    Evas_Object *li;
1080
1081    li = data;
1082    selection = elm_object_item_data_get(elm_list_selected_item_get(li));
1083    curr = elm_profile_current_get();
1084
1085    elm_config_save(); /* dump config into old profile's data dir */
1086
1087    pdir = elm_profile_dir_get(selection, EINA_TRUE);
1088    if (!pdir)
1089      return;
1090
1091    ecore_file_recursive_rm(pdir);
1092    elm_profile_dir_free(pdir);
1093
1094    elm_config_reload();
1095
1096    _profile_change_do(elm_object_top_widget_get(li), curr);
1097    elm_config_save(); /* make sure new profile has its data dir */
1098 }
1099
1100 static void
1101 _theme_use(void *data       __UNUSED__,
1102            Evas_Object *obj __UNUSED__,
1103            void *event_info __UNUSED__)
1104 {
1105    const char *defth;
1106    Elm_Theme *th;
1107    Evas_Object *win = elm_object_top_widget_get(obj);
1108    Evas_Object *sample = evas_object_data_get(win, "theme_preview");
1109
1110    th = elm_object_theme_get(sample);
1111    defth = elm_theme_get(th);
1112    elm_theme_all_set(defth);
1113    elm_config_save();
1114 }
1115
1116 static void
1117 _theme_sel(void            *data __UNUSED__,
1118            Evas_Object     *obj,
1119            void *event_info __UNUSED__)
1120 {
1121    Evas_Object *win = elm_object_top_widget_get(obj);
1122    Evas_Object *sample = evas_object_data_get(win, "theme_preview");
1123    Elm_Theme *th;
1124    Elm_Object_Item *list_it;
1125    Eina_Strbuf *newth;
1126    Eina_List *l;
1127
1128    if (!sample) return;
1129    tsel = elm_list_selected_items_get(obj);
1130    newth = eina_strbuf_new();
1131    EINA_SAFETY_ON_NULL_RETURN(newth);
1132    th = elm_theme_new();
1133    if (!th)
1134      {
1135         eina_strbuf_free(newth);
1136         return;
1137      }
1138    EINA_LIST_REVERSE_FOREACH((Eina_List*)tsel, l, list_it)
1139      {
1140         Theme *t = elm_object_item_data_get(list_it);
1141         eina_strbuf_append_printf(newth, "%s:", t->name);
1142         if ((!l->prev) && strcmp(t->name, "default"))
1143           /* ensure default theme is always there for fallback */
1144           eina_strbuf_append(newth, "default");
1145      }
1146    elm_theme_set(th, eina_strbuf_string_get(newth));
1147    eina_strbuf_free(newth);
1148    elm_object_theme_set(sample, th);
1149    elm_theme_free(th);
1150 }
1151
1152 /*static void
1153    _theme_browse(void *data, Evas_Object *obj, void *event_info)
1154    {
1155    printf("not implemented\n");
1156    }*/
1157
1158 static void
1159 _status_config_sizing(Evas_Object *win,
1160                       Evas_Object *pager)
1161 {
1162    Evas_Object *lb, *pd, *bx, *sl, *sp;
1163
1164    bx = elm_box_add(win);
1165    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
1166    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
1167
1168    LABEL_FRAME_ADD("<hilight>Scale</>");
1169
1170    sl = elm_slider_add(win);
1171    evas_object_data_set(win, "scale_slider", sl);
1172    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
1173    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
1174    elm_slider_span_size_set(sl, 120);
1175    elm_slider_unit_format_set(sl, "%1.2f");
1176    elm_slider_indicator_format_set(sl, "%1.2f");
1177    elm_slider_min_max_set(sl, 0.25, 5.0);
1178    elm_slider_value_set(sl, elm_scale_get());
1179    elm_box_pack_end(bx, sl);
1180    evas_object_show(sl);
1181
1182    evas_object_smart_callback_add(sl, "changed", sc_round, NULL);
1183    evas_object_smart_callback_add(sl, "delay,changed", sc_change, NULL);
1184
1185    sp = elm_separator_add(win);
1186    elm_separator_horizontal_set(sp, 1);
1187    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
1188    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
1189    elm_box_pack_end(bx, sp);
1190    evas_object_show(sp);
1191
1192    LABEL_FRAME_ADD("<hilight>Finger Size</><br/>");
1193
1194    sl = elm_slider_add(win);
1195    evas_object_data_set(win, "fs_slider", sl);
1196    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
1197    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
1198    elm_slider_span_size_set(sl, 120);
1199    elm_slider_unit_format_set(sl, "%1.0f");
1200    elm_slider_indicator_format_set(sl, "%1.0f");
1201    elm_slider_min_max_set(sl, 5, 200);
1202    elm_slider_value_set(sl, elm_finger_size_get());
1203    elm_box_pack_end(bx, sl);
1204    evas_object_show(sl);
1205
1206    evas_object_smart_callback_add(sl, "changed", fs_round, NULL);
1207    evas_object_smart_callback_add(sl, "delay,changed", fs_change, NULL);
1208
1209    evas_object_data_set(win, "sizing", bx);
1210
1211    elm_pager_content_push(pager, bx);
1212 }
1213
1214 static Evas_Object *
1215 _sample_theme_new(Evas_Object *win)
1216 {
1217    Evas_Object *base, *bg, *bt, *ck, *rd, *rdg, *sl, *fr, *li, *rc, *sp;
1218
1219    base = elm_table_add(win);
1220    evas_object_size_hint_weight_set(base, 1.0, 1.0);
1221    evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1222
1223    bg = elm_bg_add(win);
1224    evas_object_size_hint_weight_set(bg, 1.0, 1.0);
1225    evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
1226    elm_table_pack(base, bg, 0, 0, 2, 5);
1227    evas_object_show(bg);
1228
1229    bt = elm_button_add(win);
1230    evas_object_size_hint_weight_set(bt, 1.0, 0.0);
1231    elm_object_text_set(bt, "Button");
1232    elm_table_pack(base, bt, 0, 0, 1, 1);
1233    evas_object_show(bt);
1234
1235    ck = elm_check_add(win);
1236    evas_object_size_hint_weight_set(ck, 1.0, 0.0);
1237    elm_object_text_set(ck, "Check");
1238    elm_table_pack(base, ck, 0, 1, 1, 1);
1239    evas_object_show(ck);
1240
1241    rd = elm_radio_add(win);
1242    evas_object_size_hint_weight_set(rd, 1.0, 0.0);
1243    elm_radio_state_value_set(rd, 0);
1244    elm_object_text_set(rd, "Radio 1");
1245    elm_table_pack(base, rd, 1, 0, 1, 1);
1246    evas_object_show(rd);
1247    rdg = rd;
1248
1249    rd = elm_radio_add(win);
1250    evas_object_size_hint_weight_set(rd, 1.0, 0.0);
1251    elm_radio_state_value_set(rd, 1);
1252    elm_object_text_set(rd, "Radio 2");
1253    elm_radio_group_add(rd, rdg);
1254    elm_table_pack(base, rd, 1, 1, 1, 1);
1255    evas_object_show(rd);
1256
1257    sp = elm_separator_add(win);
1258    elm_separator_horizontal_set(sp, 1);
1259    evas_object_size_hint_weight_set(sp, 1.0, 0.0);
1260    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
1261    elm_table_pack(base, sp, 0, 2, 2, 1);
1262    evas_object_show(sp);
1263
1264    sl = elm_slider_add(win);
1265    elm_object_text_set(sl, "Slider");
1266    elm_slider_span_size_set(sl, 120);
1267    elm_slider_min_max_set(sl, 1, 10);
1268    elm_slider_value_set(sl, 4);
1269    evas_object_size_hint_weight_set(sl, 1.0, 0.0);
1270    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, EVAS_HINT_FILL);
1271    elm_table_pack(base, sl, 0, 3, 2, 1);
1272    evas_object_show(sl);
1273
1274    fr = elm_frame_add(win);
1275    elm_object_text_set(fr, "Frame");
1276    elm_table_pack(base, fr, 0, 4, 2, 1);
1277    evas_object_size_hint_weight_set(fr, 1.0, 1.0);
1278    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
1279    evas_object_show(fr);
1280
1281    li = elm_list_add(win);
1282    evas_object_size_hint_weight_set(li, 1.0, 1.0);
1283    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
1284    elm_object_content_set(fr, li);
1285    evas_object_show(li);
1286
1287    elm_list_item_append(li, "List Item 1", NULL, NULL, NULL, NULL);
1288    elm_list_item_append(li, "Second Item", NULL, NULL, NULL, NULL);
1289    elm_list_item_append(li, "Third Item", NULL, NULL, NULL, NULL);
1290    elm_list_go(li);
1291
1292    rc = evas_object_rectangle_add(evas_object_evas_get(win));
1293    evas_object_size_hint_weight_set(rc, 1.0, 1.0);
1294    evas_object_size_hint_min_set(rc, 160, 120);
1295    elm_table_pack(base, rc, 0, 4, 2, 1);
1296
1297    return base;
1298 }
1299
1300 static void
1301 _status_config_themes(Evas_Object *win,
1302                       Evas_Object *pager)
1303 {
1304    Evas_Object *tb, *rc, *sc, *sp, *li, *pd, *fr, *bt, *sample;
1305    Eina_List *list, *l;
1306    char *th, *s, *ext;
1307    Elm_Theme *d;
1308    Elm_Object_Item *list_it, *def_it = NULL;
1309    const char *theme_name, *sep[20];
1310    unsigned int x;
1311
1312    tb = elm_table_add(win);
1313    evas_object_size_hint_weight_set(tb, 1.0, 1.0);
1314    evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
1315
1316    rc = evas_object_rectangle_add(evas_object_evas_get(win));
1317    evas_object_size_hint_weight_set(rc, 1.0, 1.0);
1318    evas_object_size_hint_min_set(rc, 0, 130);
1319    elm_table_pack(tb, rc, 0, 0, 1, 1);
1320
1321    rc = evas_object_rectangle_add(evas_object_evas_get(win));
1322    evas_object_size_hint_weight_set(rc, 1.0, 1.0);
1323    evas_object_size_hint_min_set(rc, 0, 200);
1324    elm_table_pack(tb, rc, 0, 1, 1, 1);
1325
1326    /////////////////////////////////////////////
1327
1328    pd = elm_frame_add(win);
1329    elm_object_style_set(pd, "pad_medium");
1330    evas_object_size_hint_weight_set(pd, 1.0, 1.0);
1331    evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, EVAS_HINT_FILL);
1332    elm_table_pack(tb, pd, 0, 0, 1, 1);
1333    evas_object_show(pd);
1334
1335    li = elm_list_add(win);
1336    elm_list_multi_select_set(li, EINA_TRUE);
1337    evas_object_size_hint_weight_set(li, 1.0, 1.0);
1338    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
1339    elm_object_content_set(pd, li);
1340    evas_object_show(li);
1341
1342    list = elm_theme_name_available_list_new();
1343    d = elm_theme_default_get();
1344    theme_name = elm_theme_get(d);
1345    for (x = 1, sep[0] = theme_name; x < sizeof(sep) / sizeof(sep[0]); x++)
1346      {
1347         sep[x] = strchr(sep[x - 1] + 1, ':');
1348         if (!sep[x]) break;
1349      }
1350    EINA_LIST_FOREACH(list, l, th)
1351      {
1352         Theme *t;
1353         int y;
1354
1355         t = calloc(1, sizeof(Theme));
1356         t->name = eina_stringshare_add(th);
1357         s = elm_theme_list_item_path_get(th, &(t->in_search_path));
1358         if (s)
1359           {
1360              t->path = eina_stringshare_add(s);
1361              free(s);
1362           }
1363         if (t->in_search_path)
1364           {
1365              s = strdup(th);
1366              if (s)
1367                {
1368                   s[0] = toupper(s[0]);
1369                   t->label = eina_stringshare_add(s);
1370                   free(s);
1371                }
1372              else
1373                t->label = eina_stringshare_add(s);
1374           }
1375         else
1376           {
1377              s = strdup(ecore_file_file_get(th));
1378              if (s)
1379                {
1380                   s[0] = toupper(s[0]);
1381                   ext = strrchr(s, '.');
1382                   if (ext) *ext = 0;
1383                   t->label = eina_stringshare_add(s);
1384                   free(s);
1385                }
1386              else
1387                t->label = eina_stringshare_add(s);
1388           }
1389         themes = eina_list_append(themes, t);
1390         list_it = elm_list_item_append(li, t->label, NULL, NULL, NULL, t);
1391         if (!strcmp(t->name, "default")) def_it = list_it;
1392         for (y = x - 1 /* ignore default e theme */; y > 0; y--)
1393           {
1394              const char *start = (sep[y - 1][0] == ':') ? sep[y - 1] + 1 : sep[y - 1];
1395              unsigned int len = (unsigned int)(sep[y] - start);
1396              if (strncmp(start , t->name, len) || (strlen(t->name) != len)) continue;
1397
1398              if (!elm_list_item_selected_get(list_it))
1399                elm_list_item_selected_set(list_it, EINA_TRUE);
1400              break;
1401           }
1402      }
1403    if (!elm_list_selected_items_get(li))
1404      elm_list_item_selected_set(def_it, EINA_TRUE);
1405    evas_object_smart_callback_add(li, "selected", _theme_sel, NULL);
1406    evas_object_smart_callback_add(li, "unselected", _theme_sel, NULL);
1407    elm_theme_name_available_list_free(list);
1408
1409    elm_list_go(li);
1410
1411    pd = elm_frame_add(win);
1412    elm_object_style_set(pd, "pad_medium");
1413    evas_object_size_hint_weight_set(pd, 1.0, 1.0);
1414    evas_object_size_hint_align_set(pd, 0.9, 0.9);
1415    elm_table_pack(tb, pd, 0, 0, 1, 1);
1416    evas_object_show(pd);
1417
1418    /* FIXME: not implemented yet
1419       bt = elm_button_add(win);
1420       evas_object_smart_callback_add(bt, "clicked", _theme_browse, win);
1421       elm_object_text_set(bt, "Browse...");
1422       evas_object_size_hint_weight_set(bt, 1.0, 1.0);
1423       evas_object_size_hint_align_set(bt, 0.9, 0.9);
1424       elm_object_content_set(pd, bt);
1425       evas_object_show(bt);
1426     */
1427    pd = elm_frame_add(win);
1428    elm_object_style_set(pd, "pad_medium");
1429    evas_object_size_hint_weight_set(pd, 1.0, 0.0);
1430    evas_object_size_hint_align_set(pd, EVAS_HINT_FILL, EVAS_HINT_FILL);
1431    elm_table_pack(tb, pd, 0, 1, 1, 1);
1432    evas_object_show(pd);
1433
1434    fr = elm_frame_add(win);
1435    elm_object_text_set(fr, "Preview");
1436    evas_object_size_hint_weight_set(fr, 1.0, 1.0);
1437    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
1438    elm_object_content_set(pd, fr);
1439    evas_object_show(fr);
1440
1441    sc = elm_scroller_add(win);
1442    elm_scroller_bounce_set(sc, 0, 0);
1443    evas_object_size_hint_weight_set(sc, 1.0, 1.0);
1444    evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
1445    elm_object_content_set(fr, sc);
1446    evas_object_show(sc);
1447
1448    sample = _sample_theme_new(win);
1449    elm_object_content_set(sc, sample);
1450    evas_object_show(sample);
1451    evas_object_data_set(win, "theme_preview", sample);
1452
1453    /////////////////////////////////////////////
1454    sp = elm_separator_add(win);
1455    elm_separator_horizontal_set(sp, 1);
1456    evas_object_size_hint_weight_set(sp, 1.0, 0.0);
1457    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
1458    elm_table_pack(tb, sp, 0, 2, 1, 1);
1459    evas_object_show(sp);
1460
1461    pd = elm_frame_add(win);
1462    elm_object_style_set(pd, "pad_medium");
1463    evas_object_size_hint_weight_set(pd, 1.0, 0.0);
1464    evas_object_size_hint_align_set(pd, 0.5, 0.5);
1465    elm_table_pack(tb, pd, 0, 3, 1, 1);
1466    evas_object_show(pd);
1467
1468    bt = elm_button_add(win);
1469    evas_object_smart_callback_add(bt, "clicked", _theme_use, win);
1470    elm_object_text_set(bt, "Use Theme");
1471    evas_object_size_hint_weight_set(bt, 1.0, 0.0);
1472    evas_object_size_hint_align_set(bt, 0.5, 0.5);
1473    elm_object_content_set(pd, bt);
1474    evas_object_show(bt);
1475
1476    evas_object_data_set(win, "themes", tb);
1477    elm_pager_content_push(pager, tb);
1478 }
1479
1480 static void
1481 _font_preview_update(Evas_Object *win)
1482 {
1483    Evas_Font_Size sz;
1484    const char *name;
1485
1486    if (!fdata.cur_font)
1487      return;
1488
1489    name = elm_font_fontconfig_name_get(fdata.cur_font, fdata.cur_style);
1490    sz = fdata.cur_size;
1491
1492    if (sz < 0)
1493      sz = (-sz * 10) / 100;
1494    if (sz == 0)
1495      sz = 10;
1496
1497    edje_object_text_class_set(evas_object_data_get(win, "font_preview"),
1498                               "font_preview", name, sz);
1499
1500    elm_font_fontconfig_name_free(name);
1501 }
1502
1503 static void
1504 _font_classes_list_sel(void *data   __UNUSED__,
1505                        Evas_Object *obj,
1506                        void        *event_info)
1507 {
1508    const Eina_List *f_names_items, *l;
1509    Elm_Text_Class_Data *tc_data;
1510    Evas_Object *f_names_list;
1511    Elm_Object_Item *list_it;
1512
1513    tc_data = elm_object_item_data_get(event_info);
1514
1515    f_names_list = evas_object_data_get(elm_object_top_widget_get(obj),
1516                                        "font_names_list");
1517    ELM_LIST_ENABLE(f_names_list);
1518
1519    f_names_items = elm_list_items_get(f_names_list);
1520
1521    EINA_LIST_FOREACH(f_names_items, l, list_it)
1522      {
1523         const char *l;
1524
1525         l = elm_object_item_text_get(list_it);
1526
1527         if (tc_data->font && !strcmp(l, tc_data->font))
1528           {
1529              elm_list_item_selected_set(list_it, EINA_TRUE);
1530              elm_list_item_show(list_it);
1531              break;
1532           }
1533      }
1534 }
1535
1536 static void
1537 _font_names_list_sel(void *data   __UNUSED__,
1538                      Evas_Object *obj,
1539                      void        *event_info)
1540 {
1541    Evas_Object *style_list, *cls_list, *win;
1542    const char *style, *sel_font;
1543    Elm_Text_Class_Data *tc_data;
1544    Elm_Object_Item *list_it, *fc_list_it;
1545    Elm_Font_Properties *efp;
1546    const Eina_List *l;
1547
1548    list_it = event_info;
1549    sel_font = elm_object_item_text_get(list_it);
1550
1551    win = elm_object_top_widget_get(obj);
1552    style_list = evas_object_data_get(win, "font_styles_list");
1553    cls_list = evas_object_data_get(win, "font_classes_list");
1554
1555    fc_list_it = elm_list_selected_item_get(cls_list);
1556    if (!fc_list_it) return;  /* should not happen, fonts list disabled in
1557                          * this case */
1558
1559    eina_stringshare_replace(&fdata.cur_font, sel_font);
1560
1561    tc_data = elm_object_item_data_get(fc_list_it);
1562    if (tc_data->font) eina_stringshare_del(tc_data->font);
1563    if (fdata.cur_font) tc_data->font = eina_stringshare_ref(fdata.cur_font);
1564
1565    /* load styles list */
1566    efp = eina_hash_find(fdata.font_hash, sel_font);
1567
1568    ELM_LIST_ENABLE(style_list);
1569    elm_list_clear(style_list);
1570
1571    evas_event_freeze(evas_object_evas_get(style_list));
1572    edje_freeze();
1573
1574    list_it = NULL;
1575
1576    EINA_LIST_FOREACH(efp->styles, l, style)
1577      {
1578         Elm_Object_Item *i;
1579
1580         i = elm_list_item_append(style_list, style, NULL, NULL,
1581                                  _font_styles_list_sel, NULL);
1582
1583         if (tc_data->style && (!strcmp(style, tc_data->style)))
1584           list_it = i;
1585      }
1586
1587    elm_list_go(style_list);
1588
1589    edje_thaw();
1590    evas_event_thaw(evas_object_evas_get(style_list));
1591
1592    if (list_it)
1593      elm_list_item_selected_set(list_it, EINA_TRUE);
1594
1595    _font_preview_update(win);
1596 }
1597
1598 static void
1599 _font_styles_list_sel(void *data   __UNUSED__,
1600                       Evas_Object *obj,
1601                       void        *event_info)
1602 {
1603    Evas_Object *fc_list, *fs_list, *win;
1604    Elm_Text_Class_Data *tc_data;
1605    const Eina_List *l;
1606    Elm_Object_Item *list_it;
1607
1608    win = elm_object_top_widget_get(obj);
1609    fc_list = evas_object_data_get(win, "font_classes_list");
1610    fs_list = evas_object_data_get(win, "font_sizes_list");
1611
1612    list_it = elm_list_selected_item_get(fc_list);
1613    if (!list_it) return;  /* should not happen */
1614
1615    eina_stringshare_replace(&fdata.cur_style,
1616                             elm_object_item_text_get(event_info));
1617    ELM_LIST_ENABLE(fs_list);
1618
1619    tc_data = elm_object_item_data_get(list_it);
1620    eina_stringshare_del(tc_data->style);
1621    tc_data->style = eina_stringshare_ref(fdata.cur_style);
1622
1623    evas_event_freeze(evas_object_evas_get(fs_list));
1624    edje_freeze();
1625
1626    EINA_LIST_FOREACH(elm_list_items_get(fs_list), l, list_it)
1627      {
1628         Elm_Font_Size_Data *sdata;
1629
1630         sdata = elm_object_item_data_get(list_it);
1631         elm_list_item_selected_set(l->data, EINA_FALSE);
1632
1633         if (tc_data->size == sdata->size)
1634           {
1635              elm_list_item_selected_set(list_it, EINA_TRUE);
1636              elm_list_item_show(list_it);
1637              break;
1638           }
1639      }
1640
1641    edje_thaw();
1642    evas_event_thaw(evas_object_evas_get(fs_list));
1643
1644    _font_preview_update(win);
1645 }
1646
1647 static void
1648 _font_sizes_list_sel(void *data       __UNUSED__,
1649                      Evas_Object *obj __UNUSED__,
1650                      void *event_info __UNUSED__)
1651 {
1652    Elm_Text_Class_Data *tc_data;
1653    Evas_Object *fc_list, *win;
1654    Elm_Font_Size_Data *sd;
1655    Elm_Object_Item *list_it;
1656
1657    win = elm_object_top_widget_get(obj);
1658    fc_list = evas_object_data_get(win, "font_classes_list");
1659
1660    list_it = elm_list_selected_item_get(fc_list);
1661    if (!list_it) return;  /* should not happen */
1662
1663    sd = elm_object_item_data_get(event_info);
1664    fdata.cur_size = sd->size;
1665
1666    tc_data = elm_object_item_data_get(list_it);
1667    tc_data->size = fdata.cur_size;
1668
1669    _font_preview_update(win);
1670 }
1671
1672 static void
1673 _fstyle_list_unselect_cb(void *data       __UNUSED__,
1674                          Evas_Object     *obj,
1675                          void *event_info __UNUSED__)
1676 {
1677    Evas_Object *sizes_list, *win;
1678
1679    if (elm_list_selected_item_get(obj)) return;
1680
1681    win = elm_object_top_widget_get(obj);
1682
1683    sizes_list = evas_object_data_get(win, "font_sizes_list");
1684    ELM_LIST_DISABLE(sizes_list);
1685 }
1686
1687 static void
1688 _fc_list_unselect_cb(void *data       __UNUSED__,
1689                      Evas_Object     *obj,
1690                      void *event_info __UNUSED__)
1691 {
1692    Evas_Object *font_names_list, *styles_list, *sizes_list, *win;
1693
1694    if (elm_list_selected_item_get(obj)) return;
1695
1696    win = elm_object_top_widget_get(obj);
1697
1698    font_names_list = evas_object_data_get(win, "font_names_list");
1699    ELM_LIST_DISABLE(font_names_list);
1700
1701    styles_list = evas_object_data_get(win, "font_styles_list");
1702    ELM_LIST_DISABLE(styles_list);
1703
1704    sizes_list = evas_object_data_get(win, "font_sizes_list");
1705    ELM_LIST_DISABLE(sizes_list);
1706 }
1707
1708 static void
1709 _font_classes_list_load(Evas_Object *li)
1710 {
1711    Elm_Text_Class_Data *tc_data;
1712    Eina_List *l;
1713    Evas *evas;
1714
1715    evas = evas_object_evas_get(li);
1716    evas_event_freeze(evas);
1717    edje_freeze();
1718
1719    EINA_LIST_FOREACH(fdata.text_classes, l, tc_data)
1720      elm_list_item_append(li, tc_data->desc, NULL, NULL,
1721                           _font_classes_list_sel, tc_data);
1722
1723    evas_object_smart_callback_add(li, "unselected", _fc_list_unselect_cb,
1724                                   NULL);
1725
1726    elm_list_go(li);
1727    edje_thaw();
1728    evas_event_thaw(evas);
1729 }
1730
1731 static void
1732 _fonts_data_fill(Evas *evas)
1733 {
1734    const Eina_List *fo_list, *text_classes, *l;
1735    Elm_Text_Class_Data *tc_data;
1736    Elm_Font_Size_Data *sd;
1737    Elm_Font_Overlay *efo;
1738    Eina_List *evas_fonts;
1739    Elm_Text_Class *etc;
1740    int i;
1741
1742    evas_fonts = evas_font_available_list(evas);
1743    fdata.font_hash = elm_font_available_hash_add(evas_fonts);
1744    evas_font_available_list_free(evas, evas_fonts);
1745
1746    text_classes = elm_text_classes_list_get();
1747    fo_list = elm_font_overlay_list_get();
1748
1749    EINA_LIST_FOREACH(text_classes, l, etc)
1750      {
1751         const Eina_List *ll;
1752
1753         tc_data = calloc(1, sizeof(*tc_data));
1754         tc_data->name = eina_stringshare_add(etc->name);
1755         tc_data->desc = eina_stringshare_add(etc->desc);
1756
1757         EINA_LIST_FOREACH(fo_list, ll, efo)
1758           {
1759              if (strcmp(tc_data->name, efo->text_class))
1760                continue;
1761
1762              if (efo->font)
1763                {
1764                   Elm_Font_Properties *efp;
1765
1766                   efp = elm_font_properties_get(efo->font);
1767                   if (efp)
1768                     {
1769                        tc_data->font = eina_stringshare_add(efp->name);
1770                        /* we're sure we recorded with only 1 style selected */
1771                        tc_data->style = eina_stringshare_add(efp->styles->data);
1772                        elm_font_properties_free(efp);
1773                     }
1774                }
1775              tc_data->size = efo->size;
1776           }
1777
1778         fdata.text_classes = eina_list_append(fdata.text_classes, tc_data);
1779      }
1780
1781    elm_text_classes_list_free(text_classes);
1782
1783    /* FIXME: hinting later */
1784    /* fdata.hinting = e_config->font_hinting; */
1785
1786    sd = calloc(1, sizeof(Elm_Font_Size_Data));
1787    sd->size_str = eina_stringshare_add("Tiny");
1788    sd->size = -50;
1789    fdata.font_scale_list = eina_list_append(fdata.font_scale_list, sd);
1790
1791    sd = calloc(1, sizeof(Elm_Font_Size_Data));
1792    sd->size_str = eina_stringshare_add("Small");
1793    sd->size = -80;
1794    fdata.font_scale_list = eina_list_append(fdata.font_scale_list, sd);
1795
1796    sd = calloc(1, sizeof(Elm_Font_Size_Data));
1797    sd->size_str = eina_stringshare_add("Normal");
1798    sd->size = -100;
1799    fdata.font_scale_list = eina_list_append(fdata.font_scale_list, sd);
1800
1801    sd = calloc(1, sizeof(Elm_Font_Size_Data));
1802    sd->size_str = eina_stringshare_add("Big");
1803    sd->size = -150;
1804    fdata.font_scale_list = eina_list_append(fdata.font_scale_list, sd);
1805
1806    sd = calloc(1, sizeof(Elm_Font_Size_Data));
1807    sd->size_str = eina_stringshare_add("Really Big");
1808    sd->size = -190;
1809    fdata.font_scale_list = eina_list_append(fdata.font_scale_list, sd);
1810
1811    sd = calloc(1, sizeof(Elm_Font_Size_Data));
1812    sd->size_str = eina_stringshare_add("Huge");
1813    sd->size = -250;
1814    fdata.font_scale_list = eina_list_append(fdata.font_scale_list, sd);
1815
1816    for (i = 5; i < 51; i++)
1817      {
1818         char str[16];
1819
1820         str[0] = 0;
1821         snprintf(str, sizeof(str), "%d pixels", i);
1822
1823         sd = calloc(1, sizeof(Elm_Font_Size_Data));
1824         sd->size_str = eina_stringshare_add(str);
1825         sd->size = i;
1826         fdata.font_px_list = eina_list_append(fdata.font_px_list, sd);
1827      }
1828 }
1829
1830 static int
1831 _font_sort_cb(const void *data1,
1832               const void *data2)
1833 {
1834    if (!data1) return 1;
1835    if (!data2) return -1;
1836    return strcmp(data1, data2);
1837 }
1838
1839 static void
1840 _font_sizes_list_load(Evas_Object *size_list)
1841 {
1842    Elm_Font_Size_Data *size_data;
1843    Eina_List *l;
1844    Evas *evas;
1845
1846    evas = evas_object_evas_get(size_list);
1847    evas_event_freeze(evas);
1848    edje_freeze();
1849
1850    EINA_LIST_FOREACH(fdata.font_scale_list, l, size_data)
1851      elm_list_item_append(size_list, size_data->size_str, NULL, NULL,
1852                           _font_sizes_list_sel, size_data);
1853
1854    EINA_LIST_FOREACH(fdata.font_px_list, l, size_data)
1855      elm_list_item_append(size_list, size_data->size_str, NULL, NULL,
1856                           _font_sizes_list_sel, size_data);
1857
1858    elm_list_go(size_list);
1859    edje_thaw();
1860    evas_event_thaw(evas);
1861 }
1862
1863 static void
1864 _fnames_list_unselect_cb(void *data       __UNUSED__,
1865                          Evas_Object     *obj,
1866                          void *event_info __UNUSED__)
1867 {
1868    Evas_Object *styles_list, *sizes_list, *win;
1869
1870    if (elm_list_selected_item_get(obj)) return;
1871
1872    win = elm_object_top_widget_get(obj);
1873
1874    styles_list = evas_object_data_get(win, "font_styles_list");
1875    ELM_LIST_DISABLE(styles_list);
1876
1877    sizes_list = evas_object_data_get(win, "font_sizes_list");
1878    ELM_LIST_DISABLE(sizes_list);
1879 }
1880
1881 static Eina_Bool
1882 _font_list_fill(const Eina_Hash *hash __UNUSED__,
1883                 const void *key       __UNUSED__,
1884                 void                 *data,
1885                 void                 *fdata)
1886 {
1887    Elm_Font_Properties *efp;
1888    Eina_List **flist;
1889
1890    flist = fdata;
1891    efp = data;
1892
1893    *flist = eina_list_append(*flist, efp->name);
1894
1895    return EINA_TRUE;
1896 }
1897
1898 static void
1899 _font_names_list_load(Evas_Object *flist)
1900 {
1901    Eina_List *l, *names_list = NULL;
1902    const char *font;
1903    Evas *evas;
1904
1905    evas = evas_object_evas_get(flist);
1906    evas_event_freeze(evas);
1907    edje_freeze();
1908
1909    eina_hash_foreach(fdata.font_hash, _font_list_fill, &names_list);
1910    names_list = eina_list_sort(names_list, eina_list_count(names_list),
1911                                _font_sort_cb);
1912
1913    EINA_LIST_FOREACH(names_list, l, font)
1914      elm_list_item_append(flist, font, NULL, NULL, _font_names_list_sel, NULL);
1915
1916    EINA_LIST_FREE(names_list, font) ;
1917
1918    evas_object_smart_callback_add(flist, "unselected",
1919                                   _fnames_list_unselect_cb, NULL);
1920
1921    elm_list_go(flist);
1922
1923    edje_thaw();
1924    evas_event_thaw(evas);
1925 }
1926
1927 static void
1928 _status_config_fonts(Evas_Object *win,
1929                      Evas_Object *pager)
1930 {
1931    Evas_Object *base, *fr, *li, *rc, *preview, *sp, *pd, *bt, *bx;
1932    char buf[PATH_MAX];
1933
1934    _fonts_data_fill(evas_object_evas_get(win));
1935
1936    base = elm_table_add(win);
1937    evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1938    evas_object_size_hint_align_set(base, EVAS_HINT_FILL, EVAS_HINT_FILL);
1939
1940    /* yeah, dummy rectangles are ugly as hell, but no good way yet of
1941       fixing sizes */
1942    rc = evas_object_rectangle_add(evas_object_evas_get(win));
1943    evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1944    evas_object_size_hint_align_set(rc, EVAS_HINT_FILL, EVAS_HINT_FILL);
1945    evas_object_size_hint_min_set(rc, 70, 170);
1946    elm_table_pack(base, rc, 1, 0, 1, 1);
1947
1948    fr = elm_frame_add(win);
1949    elm_object_text_set(fr, "Font Class");
1950    elm_table_pack(base, fr, 0, 0, 1, 2);
1951    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1952    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
1953    evas_object_show(fr);
1954
1955    /* FIXME: no multiselection for this list, for now */
1956    li = elm_list_add(win);
1957    evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1958    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
1959    elm_object_content_set(fr, li);
1960    evas_object_show(li);
1961
1962    evas_object_data_set(win, "font_classes_list", li);
1963    _font_classes_list_load(li);
1964
1965    fr = elm_frame_add(win);
1966    elm_object_text_set(fr, "Font");
1967    elm_table_pack(base, fr, 1, 0, 1, 2);
1968    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1969    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
1970    evas_object_show(fr);
1971
1972    li = elm_list_add(win);
1973    evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1974    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
1975    elm_object_content_set(fr, li);
1976    evas_object_show(li);
1977
1978    evas_object_data_set(win, "font_names_list", li);
1979    _font_names_list_load(li);
1980    ELM_LIST_DISABLE(li);
1981
1982    rc = evas_object_rectangle_add(evas_object_evas_get(win));
1983    evas_object_size_hint_weight_set(rc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1984    evas_object_size_hint_align_set(rc, EVAS_HINT_FILL, EVAS_HINT_FILL);
1985    evas_object_size_hint_min_set(rc, 70, 130);
1986    elm_table_pack(base, rc, 1, 2, 1, 1);
1987
1988    fr = elm_frame_add(win);
1989    elm_object_text_set(fr, "Style");
1990    elm_table_pack(base, fr, 0, 2, 1, 1);
1991    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1992    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
1993    evas_object_show(fr);
1994    ELM_LIST_DISABLE(li);
1995
1996    li = elm_list_add(win);
1997    evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1998    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
1999    elm_object_content_set(fr, li);
2000    evas_object_show(li);
2001
2002    evas_object_data_set(win, "font_styles_list", li);
2003    evas_object_smart_callback_add(li, "unselected", _fstyle_list_unselect_cb,
2004                                   NULL);
2005
2006    fr = elm_frame_add(win);
2007    elm_object_text_set(fr, "Size");
2008    elm_table_pack(base, fr, 1, 2, 1, 1);
2009    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2010    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
2011    evas_object_show(fr);
2012
2013    li = elm_list_add(win);
2014    evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2015    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
2016    elm_object_content_set(fr, li);
2017    evas_object_show(li);
2018
2019    evas_object_data_set(win, "font_sizes_list", li);
2020    _font_sizes_list_load(li);
2021    ELM_LIST_DISABLE(li);
2022
2023    bx = elm_box_add(win);
2024    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2025    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
2026    elm_table_pack(base, bx, 0, 3, 2, 1);
2027    evas_object_show(bx);
2028
2029    /* FIXME: what to do here? dedicated widget? some new entry API set? */
2030    snprintf(buf, sizeof(buf), "%s/objects/font_preview.edj", elm_app_data_dir_get());
2031    preview = elm_layout_add(win);
2032    elm_layout_file_set(preview, buf, "font_preview");
2033    elm_object_part_text_set(preview, "elm.text", "Preview Text â€” æˆ‘真的会写中文");
2034    evas_object_size_hint_weight_set(preview, EVAS_HINT_EXPAND, 0.0);
2035    evas_object_size_hint_align_set(preview, EVAS_HINT_FILL, EVAS_HINT_FILL);
2036    evas_object_show(preview);
2037
2038    elm_box_pack_end(bx, preview);
2039    evas_object_data_set(win, "font_preview", elm_layout_edje_get(preview));
2040
2041    /////////////////////////////////////////////
2042    sp = elm_separator_add(win);
2043    elm_separator_horizontal_set(sp, EINA_TRUE);
2044    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2045    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2046    elm_table_pack(base, sp, 0, 4, 2, 1);
2047    evas_object_show(sp);
2048
2049    pd = elm_frame_add(win);
2050    elm_object_style_set(pd, "pad_medium");
2051    evas_object_size_hint_weight_set(pd, EVAS_HINT_EXPAND, 0.0);
2052    evas_object_size_hint_align_set(pd, 0.5, 0.5);
2053    elm_table_pack(base, pd, 0, 5, 2, 1);
2054    evas_object_show(pd);
2055
2056    bx = elm_box_add(win);
2057    elm_box_horizontal_set(bx, EINA_TRUE);
2058    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2059    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
2060    evas_object_show(bx);
2061
2062    bt = elm_button_add(win);
2063    evas_object_smart_callback_add(bt, "clicked", _font_overlay_set_all, win);
2064    elm_object_text_set(bt, "Set to All");
2065    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2066    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2067    elm_box_pack_end(bx, bt);
2068    evas_object_show(bt);
2069
2070    bt = elm_button_add(win);
2071    evas_object_smart_callback_add(bt, "clicked", _font_overlay_reset, win);
2072    elm_object_text_set(bt, "Reset");
2073    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2074    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2075    elm_box_pack_end(bx, bt);
2076    evas_object_show(bt);
2077
2078    bt = elm_button_add(win);
2079    evas_object_smart_callback_add(bt, "clicked", _font_overlay_reset_all, win);
2080    elm_object_text_set(bt, "Reset All");
2081    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2082    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2083    elm_box_pack_end(bx, bt);
2084    evas_object_show(bt);
2085
2086    bt = elm_button_add(win);
2087    evas_object_smart_callback_add(bt, "clicked", _font_overlay_change, win);
2088    elm_object_text_set(bt, "Apply");
2089    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2090    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2091    elm_box_pack_end(bx, bt);
2092    evas_object_show(bt);
2093
2094    elm_object_content_set(pd, bx);
2095
2096    evas_object_data_set(win, "fonts", base);
2097
2098    elm_pager_content_push(pager, base);
2099 }
2100
2101 static void
2102 _engines_list_item_del_cb(void            *data,
2103                           Evas_Object *obj __UNUSED__,
2104                           void *event_info __UNUSED__)
2105 {
2106    free(data);
2107 }
2108
2109 static void
2110 _profiles_list_item_del_cb(void            *data,
2111                            Evas_Object *obj __UNUSED__,
2112                            void *event_info __UNUSED__)
2113 {
2114    free(data);
2115 }
2116
2117 static void
2118 _profiles_list_selected_cb(void            *data,
2119                            Evas_Object     *obj,
2120                            void *event_info __UNUSED__)
2121 {
2122    const char *cur_profile = NULL;
2123    const char *sel_profile, *pdir;
2124    const char *prof_name;
2125    char buf[PATH_MAX];
2126    Evas_Object *en;
2127 #ifdef ELM_EFREET
2128    Efreet_Desktop *desk = NULL;
2129 #endif
2130
2131    sel_profile = data;
2132    if (!sel_profile)
2133      return;
2134
2135    cur_profile = elm_profile_current_get();
2136
2137    pdir = elm_profile_dir_get(sel_profile, EINA_TRUE);
2138    if (!pdir) pdir = elm_profile_dir_get(sel_profile, EINA_FALSE);
2139 #ifdef ELM_EFREET
2140    snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
2141    desk = efreet_desktop_new(buf);
2142    if ((desk) && (desk->name)) prof_name = desk->name;
2143    else
2144      {
2145         if (desk) efreet_desktop_free(desk);
2146         pdir = elm_profile_dir_get(sel_profile, EINA_FALSE);
2147         snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
2148         desk = efreet_desktop_new(buf);
2149         if ((desk) && (desk->name)) prof_name = desk->name;
2150         else prof_name = cur_profile;
2151      }
2152 #endif
2153    prof_name = cur_profile;
2154
2155    if (!pdir)
2156      elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"),
2157                              EINA_TRUE);
2158    else
2159      {
2160         elm_object_disabled_set(evas_object_data_get(obj, "prof_del_btn"),
2161                                 EINA_TRUE);
2162         elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"),
2163                                 EINA_FALSE);
2164         elm_object_disabled_set(evas_object_data_get(obj, "prof_use_btn"),
2165                                 EINA_FALSE);
2166         elm_profile_dir_free(pdir);
2167      }
2168
2169    snprintf(buf, sizeof(buf), "<hilight>Selected profile: %s</><br/>",
2170             prof_name);
2171    elm_object_text_set(evas_object_data_get(obj, "prof_name_lbl"), buf);
2172
2173    en = evas_object_data_get(obj, "prof_desc_entry");
2174 #ifdef ELM_EFREET
2175    if (desk) elm_object_text_set(en, desk->comment);
2176    else
2177 #endif
2178    elm_object_text_set(en, "Unknown");
2179
2180 #ifdef ELM_EFREET
2181    if (desk) efreet_desktop_free(desk);
2182 #endif
2183 }
2184
2185 static void
2186 _profiles_list_fill(Evas_Object *l_widget,
2187                     Eina_List   *p_names)
2188 {
2189    const char *cur_profile = NULL;
2190    const char *profile;
2191    void *sel_it = NULL;
2192    Eina_List *l;
2193
2194    if (!p_names)
2195      return;
2196
2197    elm_list_clear(l_widget);
2198
2199    cur_profile = elm_profile_current_get();
2200
2201    EINA_LIST_FOREACH(p_names, l, profile)
2202      {
2203 #ifdef ELM_EFREET
2204         Efreet_Desktop *desk = NULL;
2205 #endif
2206         const char *label, *ext, *pdir;
2207         char buf[PATH_MAX];
2208         Elm_Object_Item *list_it;
2209         Evas_Object *ic;
2210
2211         pdir = elm_profile_dir_get(profile, EINA_TRUE);
2212         if (!pdir) pdir = elm_profile_dir_get(profile, EINA_FALSE);
2213         label = profile;
2214
2215 #ifdef ELM_EFREET
2216         snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
2217         desk = efreet_desktop_new(buf);
2218         if ((desk) && (desk->name)) label = desk->name;
2219         else
2220           {
2221              if (desk) efreet_desktop_free(desk);
2222              pdir = elm_profile_dir_get(profile, EINA_FALSE);
2223              snprintf(buf, sizeof(buf), "%s/profile.desktop", pdir);
2224              desk = efreet_desktop_new(buf);
2225              if ((desk) && (desk->name)) label = desk->name;
2226              else label = profile;
2227           }
2228 #endif
2229
2230         buf[0] = 0;
2231         if (pdir) snprintf(buf, sizeof(buf), "%s/icon.edj", pdir);
2232 #ifdef ELM_EFREET
2233         if ((desk) && (desk->icon) && (pdir))
2234           snprintf(buf, sizeof(buf), "%s/%s", pdir, desk->icon);
2235 #endif
2236         ic = elm_icon_add(l_widget);
2237         ext = strrchr(buf, '.');
2238         if (ext)
2239           {
2240              if (!strcmp(ext, ".edj")) elm_icon_file_set(ic, buf, "icon");
2241              else elm_icon_file_set(ic, buf, NULL);
2242           }
2243
2244         evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL,
2245                                          1, 1);
2246         evas_object_show(ic);
2247
2248         list_it = elm_list_item_append(l_widget, label, ic, NULL,
2249                                        _profiles_list_selected_cb,
2250                                        strdup(profile));
2251         elm_object_item_del_cb_set(list_it, _profiles_list_item_del_cb);
2252         if (cur_profile && !strcmp(profile, cur_profile))
2253           sel_it = list_it;
2254
2255         elm_profile_dir_free(pdir);
2256
2257 #ifdef ELM_EFREET
2258         if (desk) efreet_desktop_free(desk);
2259 #endif
2260      }
2261
2262    if (sel_it) elm_list_item_selected_set(sel_it, EINA_TRUE);
2263    elm_list_go(l_widget);
2264 }
2265
2266 static void
2267 _profiles_list_unselect_cb(void *data       __UNUSED__,
2268                            Evas_Object     *obj,
2269                            void *event_info __UNUSED__)
2270 {
2271    if (elm_list_selected_item_get(obj)) return;
2272    elm_object_disabled_set(evas_object_data_get(obj, "prof_del_btn"),
2273                            EINA_TRUE);
2274    elm_object_disabled_set(evas_object_data_get(obj, "prof_reset_btn"),
2275                            EINA_TRUE);
2276    elm_object_disabled_set(evas_object_data_get(obj, "prof_use_btn"),
2277                            EINA_TRUE);
2278 }
2279
2280 static void
2281 _status_config_profiles(Evas_Object *win,
2282                         Evas_Object *pager)
2283 {
2284    Evas_Object *li, *bx, *fr_bx1, *fr_bx2, *btn_bx, *fr, *lb, *en, *sp, *pd,
2285    *bt;
2286    Eina_List *profs;
2287    Evas *evas;
2288
2289    bx = elm_box_add(win);
2290    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2291    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
2292
2293    fr_bx1 = elm_box_add(win);
2294    evas_object_size_hint_weight_set(fr_bx1, EVAS_HINT_EXPAND,
2295                                     EVAS_HINT_EXPAND);
2296    evas_object_size_hint_align_set(fr_bx1, EVAS_HINT_FILL, EVAS_HINT_FILL);
2297    elm_box_homogeneous_set(fr_bx1, EINA_TRUE);
2298    evas_object_show(fr_bx1);
2299
2300    fr_bx2 = elm_box_add(win);
2301    evas_object_size_hint_weight_set(fr_bx2, EVAS_HINT_EXPAND,
2302                                     EVAS_HINT_EXPAND);
2303    evas_object_size_hint_align_set(fr_bx2, EVAS_HINT_FILL, EVAS_HINT_FILL);
2304    evas_object_show(fr_bx2);
2305
2306    fr = elm_frame_add(win);
2307    elm_object_text_set(fr, "Available Profiles");
2308    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2309    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
2310    elm_object_content_set(fr, fr_bx1);
2311    elm_box_pack_end(bx, fr);
2312    evas_object_show(fr);
2313
2314    li = elm_list_add(win);
2315    evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2316    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
2317    evas_object_smart_callback_add(li, "unselected", _profiles_list_unselect_cb,
2318                                   NULL);
2319
2320    profs = elm_profile_list_get();
2321
2322    evas_object_show(li);
2323    elm_box_pack_end(fr_bx2, li);
2324
2325    lb = elm_label_add(win);
2326    evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, 0.0);
2327    evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, 0.5);
2328
2329    evas_object_show(lb);
2330
2331    en = elm_entry_add(win);
2332    elm_entry_scrollable_set(en, EINA_TRUE);
2333    elm_entry_editable_set(en, EINA_FALSE);
2334    evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2335    evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
2336    evas_object_show(en);
2337
2338    evas_object_data_set(li, "prof_name_lbl", lb);
2339    evas_object_data_set(li, "prof_desc_entry", en);
2340
2341    elm_box_pack_end(fr_bx2, lb);
2342    elm_box_pack_end(fr_bx1, fr_bx2);
2343    elm_box_pack_end(fr_bx1, en);
2344
2345    /////////////////////////////////////////////
2346    sp = elm_separator_add(win);
2347    elm_separator_horizontal_set(sp, EINA_TRUE);
2348    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2349    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2350    elm_box_pack_end(bx, sp);
2351    evas_object_show(sp);
2352
2353    pd = elm_frame_add(win);
2354    elm_object_style_set(pd, "pad_medium");
2355    evas_object_size_hint_weight_set(pd, 0.0, 0.0);
2356    evas_object_size_hint_align_set(pd, 0.5, 0.5);
2357    elm_box_pack_end(bx, pd);
2358    evas_object_show(pd);
2359
2360    btn_bx = elm_box_add(win);
2361    elm_box_horizontal_set(btn_bx, EINA_TRUE);
2362    evas_object_size_hint_weight_set(btn_bx, EVAS_HINT_EXPAND,
2363                                     EVAS_HINT_EXPAND);
2364    evas_object_size_hint_align_set(btn_bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
2365    evas_object_show(btn_bx);
2366
2367    bt = elm_button_add(win);
2368    evas_object_smart_callback_add(bt, "clicked", _profile_use, li);
2369    elm_object_text_set(bt, "Use");
2370    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2371    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2372    elm_box_pack_end(btn_bx, bt);
2373    evas_object_show(bt);
2374
2375    evas_object_data_set(li, "prof_use_btn", bt);
2376
2377    bt = elm_button_add(win);
2378    evas_object_smart_callback_add(bt, "clicked", _btn_todo, NULL); /* TODO */
2379    elm_object_text_set(bt, "Delete");
2380    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2381    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2382    elm_box_pack_end(btn_bx, bt);
2383    evas_object_show(bt);
2384
2385    evas_object_data_set(li, "prof_del_btn", bt);
2386
2387    bt = elm_button_add(win);
2388    evas_object_smart_callback_add(bt, "clicked", _profile_reset, li);
2389    elm_object_text_set(bt, "Reset");
2390    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2391    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2392    elm_box_pack_end(btn_bx, bt);
2393    evas_object_show(bt);
2394
2395    evas_object_data_set(li, "prof_reset_btn", bt);
2396
2397    bt = elm_button_add(win);
2398    evas_object_smart_callback_add(bt, "clicked", _btn_todo, NULL); /* TODO */
2399    elm_object_text_set(bt, "Add new");
2400    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2401    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2402    elm_box_pack_end(btn_bx, bt);
2403    evas_object_show(bt);
2404
2405    elm_object_content_set(pd, btn_bx);
2406
2407    evas = evas_object_evas_get(li);
2408    evas_event_freeze(evas);
2409    edje_freeze();
2410
2411    _profiles_list_fill(li, profs);
2412
2413    elm_profile_list_free(profs);
2414
2415    edje_thaw();
2416    evas_event_thaw(evas);
2417
2418    evas_object_data_set(win, "profiles", bx);
2419    elm_pager_content_push(pager, bx);
2420 }
2421
2422 static void
2423 _status_config_scrolling(Evas_Object *win,
2424                          Evas_Object *pager)
2425 {
2426    Evas_Object *lb, *pd, *bx, *sl, *sp, *ck, *sc;
2427
2428    bx = elm_box_add(win);
2429    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
2430    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
2431
2432    sc = elm_scroller_add(win);
2433    evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2434    evas_object_size_hint_align_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL);
2435    elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE);
2436    evas_object_show(sc);
2437    elm_object_content_set(sc, bx);
2438
2439    ck = elm_check_add(win);
2440    elm_object_tooltip_text_set(ck, "Set whether scrollers should bounce<br/>"
2441                                    "when they reach their viewport's edge<br/>"
2442                                    "during a scroll");
2443    elm_object_text_set(ck, "Enable scroll bounce");
2444    evas_object_data_set(win, "scroll_bounce_check", ck);
2445    evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
2446    evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.5);
2447    elm_check_state_set(ck, elm_scroll_bounce_enabled_get());
2448    elm_box_pack_end(bx, ck);
2449    evas_object_show(ck);
2450
2451    evas_object_smart_callback_add(ck, "changed", sb_change, NULL);
2452
2453    LABEL_FRAME_ADD("<hilight>Scroll bounce friction</>");
2454
2455    sl = elm_slider_add(win);
2456    elm_object_tooltip_text_set(sl, "This is the amount of inertia a <br/>"
2457                                    "scroller will impose at bounce animations");
2458    evas_object_data_set(win, "bounce_friction_slider", sl);
2459    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2460    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2461    elm_slider_span_size_set(sl, 120);
2462    elm_slider_unit_format_set(sl, "%1.2f");
2463    elm_slider_indicator_format_set(sl, "%1.2f");
2464    elm_slider_min_max_set(sl, 0.0, 4.0);
2465    elm_slider_value_set(sl, elm_scroll_bounce_friction_get());
2466    elm_box_pack_end(bx, sl);
2467    evas_object_show(sl);
2468
2469    evas_object_smart_callback_add(sl, "changed", bf_round, NULL);
2470    evas_object_smart_callback_add(sl, "delay,changed", bf_change, NULL);
2471
2472    sp = elm_separator_add(win);
2473    elm_separator_horizontal_set(sp, EINA_TRUE);
2474    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2475    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2476    elm_box_pack_end(bx, sp);
2477    evas_object_show(sp);
2478
2479    ck = elm_check_add(win);
2480    elm_object_tooltip_text_set(ck, "Set whether scrollers should be<br/>"
2481                                    "draggable from any point in their views");
2482    elm_object_text_set(ck, "Enable thumb scroll");
2483    evas_object_data_set(win, "thumbscroll_check", ck);
2484    evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
2485    evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.5);
2486    elm_check_state_set(ck, elm_scroll_thumbscroll_enabled_get());
2487    elm_box_pack_end(bx, ck);
2488    evas_object_show(ck);
2489
2490    evas_object_smart_callback_add(ck, "changed", ts_change, NULL);
2491
2492    LABEL_FRAME_ADD("<hilight>Thumb scroll threshold</>");
2493
2494    sl = elm_slider_add(win);
2495    elm_object_tooltip_text_set(sl, "This is the number of pixels one should<br/>"
2496                                    "travel while dragging a scroller's view<br/>"
2497                                    "to actually trigger scrolling");
2498    evas_object_data_set(win, "thumbscroll_threshold_slider", sl);
2499    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2500    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2501    elm_slider_span_size_set(sl, 120);
2502    elm_slider_unit_format_set(sl, "%1.0f pixels");
2503    elm_slider_indicator_format_set(sl, "%1.0f");
2504    elm_slider_min_max_set(sl, 8.0, 50.0);
2505    elm_slider_value_set(sl, elm_scroll_thumbscroll_threshold_get());
2506    elm_box_pack_end(bx, sl);
2507    evas_object_show(sl);
2508
2509    evas_object_smart_callback_add(sl, "changed", tst_round, NULL);
2510    evas_object_smart_callback_add(sl, "delay,changed", tst_change, NULL);
2511
2512    LABEL_FRAME_ADD("<hilight>Thumb scroll momentum threshold</>");
2513
2514    sl = elm_slider_add(win);
2515    elm_object_tooltip_text_set(sl, "This is the minimum speed of mouse <br/>"
2516                                    "cursor movement which will trigger<br/>"
2517                                    "list self scrolling animation after a<br/>"
2518                                    "mouse up event (pixels/second)");
2519    evas_object_data_set(win, "ts_momentum_threshold_slider", sl);
2520    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2521    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2522    elm_slider_span_size_set(sl, 120);
2523    elm_slider_unit_format_set(sl, "%1.0f pixels/s");
2524    elm_slider_indicator_format_set(sl, "%1.0f");
2525    elm_slider_min_max_set(sl, 10.0, 200.0);
2526    elm_slider_value_set(sl, elm_scroll_thumbscroll_momentum_threshold_get());
2527    elm_box_pack_end(bx, sl);
2528    evas_object_show(sl);
2529
2530    evas_object_smart_callback_add(sl, "changed", tsmt_round, NULL);
2531    evas_object_smart_callback_add(sl, "delay,changed", tsmt_change,
2532                                   NULL);
2533
2534    LABEL_FRAME_ADD("<hilight>Thumb scroll friction</>");
2535
2536    sl = elm_slider_add(win);
2537    elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>"
2538                                    "scroller will impose at self scrolling<br/>"
2539                                    "animations");
2540    evas_object_data_set(win, "thumbscroll_friction_slider", sl);
2541    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2542    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2543    elm_slider_span_size_set(sl, 120);
2544    elm_slider_unit_format_set(sl, "%1.1f");
2545    elm_slider_indicator_format_set(sl, "%1.1f");
2546    elm_slider_min_max_set(sl, 0.0, 15.0);
2547    elm_slider_value_set(sl, elm_scroll_thumbscroll_friction_get());
2548    elm_box_pack_end(bx, sl);
2549    evas_object_show(sl);
2550
2551    evas_object_smart_callback_add(sl, "changed", tsf_round, NULL);
2552    evas_object_smart_callback_add(sl, "delay,changed", tsf_change, NULL);
2553
2554    LABEL_FRAME_ADD("<hilight>Thumb scroll border friction</>");
2555
2556    sl = elm_slider_add(win);
2557    elm_object_tooltip_text_set(sl, "This is the amount of lag between your<br/>"
2558                                    "actual mouse cursor dragging movement<br/>"
2559                                    "and a scroller's view movement itself,<br/>"
2560                                    "while pushing it into bounce state<br/>"
2561                                    "manually");
2562    evas_object_data_set(win, "ts_border_friction_slider", sl);
2563    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2564    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2565    elm_slider_span_size_set(sl, 120);
2566    elm_slider_unit_format_set(sl, "%1.2f");
2567    elm_slider_indicator_format_set(sl, "%1.2f");
2568    elm_slider_min_max_set(sl, 0.0, 1.0);
2569    elm_slider_value_set(sl, elm_scroll_thumbscroll_border_friction_get());
2570    elm_box_pack_end(bx, sl);
2571    evas_object_show(sl);
2572
2573    evas_object_smart_callback_add(sl, "changed", tsbf_round, NULL);
2574    evas_object_smart_callback_add(sl, "delay,changed", tsbf_change, NULL);
2575
2576    LABEL_FRAME_ADD("<hilight>Thumb scroll sensitivity friction</>");
2577
2578    sl = elm_slider_add(win);
2579    elm_object_tooltip_text_set(sl, "This is the sensitivity amount which<br/>"
2580                                    "is be multiplied by the length of mouse<br/>"
2581                                    "dragging.");
2582    evas_object_data_set(win, "ts_sensitivity_friction_slider", sl);
2583    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2584    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2585    elm_slider_span_size_set(sl, 120);
2586    elm_slider_unit_format_set(sl, "%1.2f");
2587    elm_slider_indicator_format_set(sl, "%1.2f");
2588    elm_slider_min_max_set(sl, 0.1, 1.0);
2589    elm_slider_value_set(sl, elm_scroll_thumbscroll_sensitivity_friction_get());
2590    elm_box_pack_end(bx, sl);
2591    evas_object_show(sl);
2592
2593    evas_object_smart_callback_add(sl, "changed", tssf_round, NULL);
2594    evas_object_smart_callback_add(sl, "delay,changed", tssf_change, NULL);
2595
2596    sp = elm_separator_add(win);
2597    elm_separator_horizontal_set(sp, EINA_TRUE);
2598    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2599    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2600    elm_box_pack_end(bx, sp);
2601    evas_object_show(sp);
2602
2603    LABEL_FRAME_ADD("<hilight>Page scroll friction</>");
2604
2605    sl = elm_slider_add(win);
2606    elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>"
2607                                    "paged scroller will impose at<br/>"
2608                                    "page fitting animations");
2609    evas_object_data_set(win, "page_scroll_friction_slider", sl);
2610    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2611    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2612    elm_slider_span_size_set(sl, 120);
2613    elm_slider_unit_format_set(sl, "%1.1f");
2614    elm_slider_indicator_format_set(sl, "%1.1f");
2615    elm_slider_min_max_set(sl, 0.0, 5.0);
2616    elm_slider_value_set(sl, elm_scroll_page_scroll_friction_get());
2617    elm_box_pack_end(bx, sl);
2618    evas_object_show(sl);
2619
2620    evas_object_smart_callback_add(sl, "changed", ps_round, NULL);
2621    evas_object_smart_callback_add(sl, "delay,changed", ps_change, NULL);
2622
2623    LABEL_FRAME_ADD("<hilight>Bring in scroll friction</>");
2624
2625    sl = elm_slider_add(win);
2626    elm_object_tooltip_text_set(sl, "This is the amount of inertia a<br/>"
2627                                    "scroller will impose at region bring<br/>"
2628                                    "animations");
2629    evas_object_data_set(win, "bring_in_scroll_friction_slider", sl);
2630    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2631    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2632    elm_slider_span_size_set(sl, 120);
2633    elm_slider_unit_format_set(sl, "%1.1f");
2634    elm_slider_indicator_format_set(sl, "%1.1f");
2635    elm_slider_min_max_set(sl, 0.0, 5.0);
2636    elm_slider_value_set(sl, elm_scroll_bring_in_scroll_friction_get());
2637    elm_box_pack_end(bx, sl);
2638    evas_object_show(sl);
2639
2640    evas_object_smart_callback_add(sl, "changed", bis_round, NULL);
2641    evas_object_smart_callback_add(sl, "delay,changed", bis_change, NULL);
2642
2643    LABEL_FRAME_ADD("<hilight>Zoom scroll friction</>");
2644
2645    sl = elm_slider_add(win);
2646    elm_object_tooltip_text_set(sl, "This is the amount of inertia<br/>"
2647                                    "scrollers will impose at animations<br/>"
2648                                    "triggered by Elementary widgets'<br/>"
2649                                    "zooming API");
2650    evas_object_data_set(win, "zoom_scroll_friction_slider", sl);
2651    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2652    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2653    elm_slider_span_size_set(sl, 120);
2654    elm_slider_unit_format_set(sl, "%1.1f");
2655    elm_slider_indicator_format_set(sl, "%1.1f");
2656    elm_slider_min_max_set(sl, 0.0, 5.0);
2657    elm_slider_value_set(sl, elm_scroll_zoom_friction_get());
2658    elm_box_pack_end(bx, sl);
2659    evas_object_show(sl);
2660
2661    evas_object_smart_callback_add(sl, "changed", zf_round, NULL);
2662    evas_object_smart_callback_add(sl, "delay,changed", zf_change, NULL);
2663
2664    evas_object_data_set(win, "scrolling", sc);
2665
2666    elm_pager_content_push(pager, sc);
2667 }
2668
2669 static char *
2670 _engine_name_prettify(const char *engine)
2671 {
2672    char *ret, *ptr;
2673
2674    ret = strdup(engine);
2675    ret[0] -= 0x20;
2676
2677    while ((ptr = strpbrk(ret, "_")))
2678      {
2679         *ptr = ' ';
2680      }
2681
2682    return ret;
2683 }
2684
2685 /* FIXME! ideally, we would trim elm_config.c's _elm_engines list at
2686    build time, making a getter for is as in ecore-evas. */
2687 static Eina_Bool
2688 _elm_engine_supported(const char *engine)
2689 {
2690    const char *engines[] = {
2691       "software_x11",
2692       "fb",
2693       "directfb",
2694       "software_16_x11",
2695       "software_8_x11",
2696       "xrender_x11",
2697       "opengl_x11",
2698       "software_gdi",
2699       "software_16_wince_gdi",
2700       "sdl",
2701       "software_16_sdl",
2702       "opengl_sdl",
2703       "ews",
2704       "opengl_cocoa",
2705       "psl1ght",
2706       "wayland_shm",
2707       "wayland_egl",
2708       NULL
2709    };
2710
2711    unsigned int i;
2712
2713    for (i = 0; engines[i]; i++)
2714      {
2715 #define ENGINE_COMPARE(name) (!strcmp(engines[i], name))
2716         if (ENGINE_COMPARE(engine))
2717           return EINA_TRUE;
2718 #undef ENGINE_COMPARE
2719      }
2720
2721    return EINA_FALSE;
2722 }
2723
2724 static void
2725 _engines_list_fill(Evas_Object *l_widget,
2726                    Eina_List   *e_names)
2727 {
2728    const char *engine, *cur_engine;
2729    void *sel_it = NULL;
2730    Eina_List *l;
2731
2732    if (!e_names)
2733      return;
2734
2735    cur_engine = elm_engine_get();
2736
2737    EINA_LIST_FOREACH(e_names, l, engine)
2738      {
2739         const char *label;
2740         Elm_Object_Item *list_it;
2741
2742         if (!_elm_engine_supported(engine))
2743           continue;
2744
2745         label = _engine_name_prettify(engine);
2746
2747         list_it = elm_list_item_append(l_widget, label, NULL, NULL, NULL,
2748                                   strdup(engine));
2749         elm_object_item_del_cb_set(list_it, _engines_list_item_del_cb);
2750         free((void *)label);
2751
2752         if (!strcmp(cur_engine, engine))
2753           sel_it = list_it;
2754      }
2755
2756    if (sel_it) elm_list_item_selected_set(sel_it, EINA_TRUE);
2757    elm_list_go(l_widget);
2758 }
2759
2760 static void
2761 _status_config_rendering(Evas_Object *win,
2762                          Evas_Object *pager)
2763 {
2764    Evas_Object *li, *bx, *fr, *sp, *pd, *bt;
2765    Eina_List *engines;
2766
2767    bx = elm_box_add(win);
2768    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2769    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
2770
2771    fr = elm_frame_add(win);
2772    elm_object_text_set(fr, "Available Engines");
2773    evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2774    evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
2775    elm_box_pack_end(bx, fr);
2776    evas_object_show(fr);
2777
2778    li = elm_list_add(win);
2779    elm_object_content_set(fr, li);
2780    evas_object_size_hint_weight_set(li, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2781    evas_object_size_hint_align_set(li, EVAS_HINT_FILL, EVAS_HINT_FILL);
2782
2783    engines = ecore_evas_engines_get();
2784    _engines_list_fill(li, engines);
2785    ecore_evas_engines_free(engines);
2786
2787    evas_object_show(li);
2788    evas_object_data_set(win, "engines_list", li);
2789
2790    /////////////////////////////////////////////
2791    sp = elm_separator_add(win);
2792    elm_separator_horizontal_set(sp, EINA_TRUE);
2793    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2794    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2795    elm_box_pack_end(bx, sp);
2796    evas_object_show(sp);
2797
2798    pd = elm_frame_add(win);
2799    elm_object_style_set(pd, "pad_medium");
2800    evas_object_size_hint_weight_set(pd, 0.0, 0.0);
2801    evas_object_size_hint_align_set(pd, 0.5, 0.5);
2802    elm_box_pack_end(bx, pd);
2803    evas_object_show(pd);
2804
2805    bt = elm_button_add(win);
2806    evas_object_smart_callback_add(bt, "clicked", _engine_use, li);
2807    elm_object_text_set(bt, "Use Engine");
2808    evas_object_size_hint_weight_set(bt, 0.0, 0.0);
2809    evas_object_size_hint_align_set(bt, 0.5, 0.5);
2810    elm_object_content_set(pd, bt);
2811    evas_object_show(bt);
2812
2813    evas_object_data_set(win, "rendering", bx);
2814    elm_pager_content_push(pager, bx);
2815 }
2816
2817 static void
2818 _status_config_caches(Evas_Object *win,
2819                       Evas_Object *pager)
2820 {
2821    Evas_Object *lb, *pd, *bx, *sl, *sp, *ck;
2822
2823    bx = elm_box_add(win);
2824    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
2825    evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
2826
2827    LABEL_FRAME_ADD("<hilight>Cache Flush Interval (8 ticks pre second)</>");
2828
2829    sl = elm_slider_add(win);
2830    evas_object_data_set(win, "cache_flush_interval_slider", sl);
2831    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2832    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2833    elm_slider_span_size_set(sl, 120);
2834    elm_slider_unit_format_set(sl, "%1.0f ticks");
2835    elm_slider_indicator_format_set(sl, "%1.0f");
2836    elm_slider_min_max_set(sl, 8.0, 4096.0);
2837    elm_slider_value_set(sl, elm_cache_flush_interval_get());
2838    elm_object_disabled_set(sl, !elm_cache_flush_enabled_get());
2839
2840    ck = elm_check_add(win);
2841    evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
2842    evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.5);
2843    elm_object_text_set(ck, "Enable Flushing");
2844    elm_check_state_set(ck, elm_cache_flush_enabled_get());
2845    evas_object_smart_callback_add(ck, "changed", cf_enable, sl);
2846    elm_box_pack_end(bx, ck);
2847    evas_object_show(ck);
2848
2849    elm_box_pack_end(bx, sl);
2850    evas_object_show(sl);
2851
2852    evas_object_smart_callback_add(sl, "changed", cf_round, NULL);
2853    evas_object_smart_callback_add(sl, "delay,changed", cf_change, NULL);
2854
2855    sp = elm_separator_add(win);
2856    elm_separator_horizontal_set(sp, 1);
2857    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2858    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2859    elm_box_pack_end(bx, sp);
2860    evas_object_show(sp);
2861
2862    LABEL_FRAME_ADD("<hilight>Font Cache Size</>");
2863
2864    sl = elm_slider_add(win);
2865    evas_object_data_set(win, "font_cache_slider", sl);
2866    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2867    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2868    elm_slider_span_size_set(sl, 120);
2869    elm_slider_unit_format_set(sl, "%1.1f MB");
2870    elm_slider_indicator_format_set(sl, "%1.1f");
2871    elm_slider_min_max_set(sl, 0.0, 4.0);
2872    elm_slider_value_set(sl, (double)elm_font_cache_get() / 1024.0);
2873    elm_box_pack_end(bx, sl);
2874    evas_object_show(sl);
2875
2876    evas_object_smart_callback_add(sl, "changed", fc_round, NULL);
2877    evas_object_smart_callback_add(sl, "delay,changed", fc_change, NULL);
2878
2879    sp = elm_separator_add(win);
2880    elm_separator_horizontal_set(sp, 1);
2881    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2882    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2883    elm_box_pack_end(bx, sp);
2884    evas_object_show(sp);
2885
2886    LABEL_FRAME_ADD("<hilight>Image Cache Size</>");
2887
2888    sl = elm_slider_add(win);
2889    evas_object_data_set(win, "image_cache_slider", sl);
2890    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2891    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2892    elm_slider_span_size_set(sl, 120);
2893    elm_slider_unit_format_set(sl, "%1.0f MB");
2894    elm_slider_indicator_format_set(sl, "%1.0f");
2895    elm_slider_min_max_set(sl, 0, 32);
2896    elm_slider_value_set(sl, (double)elm_image_cache_get() / 1024.0);
2897    elm_box_pack_end(bx, sl);
2898    evas_object_show(sl);
2899
2900    evas_object_smart_callback_add(sl, "changed", ic_round, NULL);
2901    evas_object_smart_callback_add(sl, "delay,changed", ic_change, NULL);
2902
2903    sp = elm_separator_add(win);
2904    elm_separator_horizontal_set(sp, 1);
2905    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2906    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2907    elm_box_pack_end(bx, sp);
2908    evas_object_show(sp);
2909
2910    LABEL_FRAME_ADD("<hilight>Number of Edje Files to Cache</>");
2911
2912    sl = elm_slider_add(win);
2913    evas_object_data_set(win, "edje_file_cache_slider", sl);
2914    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2915    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2916    elm_slider_span_size_set(sl, 120);
2917    elm_slider_unit_format_set(sl, "%1.0f files");
2918    elm_slider_indicator_format_set(sl, "%1.0f");
2919    elm_slider_min_max_set(sl, 0, 32);
2920    elm_slider_value_set(sl, elm_edje_file_cache_get());
2921    elm_box_pack_end(bx, sl);
2922    evas_object_show(sl);
2923
2924    evas_object_smart_callback_add(sl, "changed", efc_round, NULL);
2925    evas_object_smart_callback_add(sl, "delay,changed", efc_change, NULL);
2926
2927    sp = elm_separator_add(win);
2928    elm_separator_horizontal_set(sp, 1);
2929    evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, 0.0);
2930    evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5);
2931    elm_box_pack_end(bx, sp);
2932    evas_object_show(sp);
2933
2934    LABEL_FRAME_ADD("<hilight>Number of Edje Collections to Cache</>");
2935
2936    sl = elm_slider_add(win);
2937    evas_object_data_set(win, "edje_collection_cache_slider", sl);
2938    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
2939    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
2940    elm_slider_span_size_set(sl, 120);
2941    elm_slider_unit_format_set(sl, "%1.0f collections");
2942    elm_slider_indicator_format_set(sl, "%1.0f");
2943    elm_slider_min_max_set(sl, 0, 128);
2944    elm_slider_value_set(sl, elm_edje_collection_cache_get());
2945    elm_box_pack_end(bx, sl);
2946    evas_object_show(sl);
2947
2948    evas_object_smart_callback_add(sl, "changed", ecc_round, NULL);
2949    evas_object_smart_callback_add(sl, "delay,changed", ecc_change, NULL);
2950
2951    evas_object_data_set(win, "caches", bx);
2952
2953    elm_pager_content_push(pager, bx);
2954 }
2955
2956 static void
2957 _status_config_full(Evas_Object *win,
2958                     Evas_Object *bx0)
2959 {
2960    Evas_Object *tb, *pager;
2961    Elm_Object_Item *tb_sizing, *tb_it;
2962
2963    tb = elm_toolbar_add(win);
2964    elm_toolbar_menu_parent_set(tb, win);
2965    elm_toolbar_homogeneous_set(tb, 0);
2966    evas_object_size_hint_weight_set(tb, 1.0, 0.0);
2967    evas_object_size_hint_align_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
2968
2969    tb_sizing = elm_toolbar_item_append(tb, "zoom-fit-best", "Sizing",
2970                                     _cf_sizing, win);
2971    elm_toolbar_item_priority_set(tb_sizing, 100);
2972
2973    tb_it = elm_toolbar_item_append(tb, "preferences-desktop-theme", "Theme",
2974                                 _cf_themes, win);
2975    elm_toolbar_item_priority_set(tb_it, 90);
2976
2977    elm_toolbar_item_append(tb, "preferences-desktop-font", "Fonts",
2978                            _cf_fonts, win);
2979
2980    tb_it = elm_toolbar_item_append(tb, "system-users", "Profiles",
2981                                 _cf_profiles, win);
2982    elm_toolbar_item_priority_set(tb_it, 90);
2983
2984    elm_toolbar_item_append(tb, "system-run", "Scrolling", _cf_scrolling, win);
2985    elm_toolbar_item_append(tb, "video-display", "Rendering",
2986                            _cf_rendering, win);
2987    elm_toolbar_item_append(tb, "appointment-new", "Caches", _cf_caches, win);
2988
2989    elm_box_pack_end(bx0, tb);
2990    evas_object_show(tb);
2991
2992    pager = elm_pager_add(win);
2993    evas_object_size_hint_align_set(pager, EVAS_HINT_FILL, EVAS_HINT_FILL);
2994    evas_object_size_hint_weight_set(pager, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
2995    evas_object_data_set(win, "pager", pager);
2996
2997    _status_config_themes(win, pager);
2998    _status_config_fonts(win, pager);
2999    _status_config_profiles(win, pager);
3000    _status_config_rendering(win, pager);
3001    _status_config_scrolling(win, pager);
3002    _status_config_caches(win, pager);
3003    _status_config_sizing(win, pager);
3004
3005    // FIXME uncomment after flip style fix, please
3006    //elm_object_style_set(pager, "flip");
3007    elm_toolbar_item_selected_set(tb_sizing, EINA_TRUE);
3008    elm_box_pack_end(bx0, pager);
3009    evas_object_show(pager);
3010 }
3011
3012 static void
3013 status_win(void)
3014 {
3015    Evas_Object *win, *bg, *bx0;
3016
3017    win = elm_win_add(NULL, "main", ELM_WIN_BASIC);
3018    main_win = win;
3019    elm_win_title_set(win, "Elementary Config");
3020
3021    ecore_event_handler_add(ELM_EVENT_CONFIG_ALL_CHANGED, _config_all_changed,
3022                            win);
3023
3024    evas_object_smart_callback_add(win, "delete,request", config_exit, NULL);
3025    bg = elm_bg_add(win);
3026    evas_object_size_hint_weight_set(bg, 1.0, 1.0);
3027    elm_win_resize_object_add(win, bg);
3028    evas_object_show(bg);
3029
3030    bx0 = elm_box_add(win);
3031    evas_object_size_hint_weight_set(bx0, 1.0, 1.0);
3032    elm_win_resize_object_add(win, bx0);
3033    evas_object_show(bx0);
3034
3035    if (!interactive) _status_basic(win, bx0);
3036    else if (0)
3037      _status_config(win, bx0);
3038    else _status_config_full(win, bx0);
3039
3040    evas_object_resize(win, 320, 480);
3041    evas_object_show(win);
3042 }
3043
3044 static Eina_Bool
3045 _exit_timer(void *data __UNUSED__)
3046 {
3047    elm_exit();
3048    return ECORE_CALLBACK_CANCEL;
3049 }
3050
3051 /* this is your elementary main function - it MUST be called IMMEDIATELY
3052  * after elm_init() and MUST be passed argc and argv, and MUST be called
3053  * elm_main and not be static - must be a visible symbol with EAPI infront */
3054 EAPI_MAIN int
3055 elm_main(int    argc,
3056          char **argv)
3057 {
3058    int i;
3059
3060    elm_app_info_set(elm_main, "elementary", "images/logo.png");
3061    elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR);
3062    elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
3063
3064    for (i = 1; i < argc; i++)
3065      {
3066         if (!strcmp(argv[i], "-h"))
3067           {
3068              printf("Usage:\n"
3069                     "  -h                This help\n"
3070                     "  -q                Quiet mode (dont show window)\n"
3071                     "  -t THEME          Set theme to THEME (ELM_THEME spec)\n"
3072                     "  -f SIZE           Set finger size to SIZE pixels\n"
3073                     "  -s SCALE          Set scale factor to SCALE\n"
3074                     );
3075           }
3076         else if (!strcmp(argv[i], "-q"))
3077           {
3078              quiet = 1;
3079              interactive = 0;
3080           }
3081         else if ((!strcmp(argv[i], "-t")) && (i < argc - 1))
3082           {
3083              i++;
3084              theme_set = argv[i];
3085              interactive = 0;
3086           }
3087         else if ((!strcmp(argv[i], "-f")) && (i < argc - 1))
3088           {
3089              i++;
3090              finger_size_set = argv[i];
3091              interactive = 0;
3092           }
3093         else if ((!strcmp(argv[i], "-s")) && (i < argc - 1))
3094           {
3095              i++;
3096              scale_set = argv[i];
3097              interactive = 0;
3098           }
3099      }
3100    /* put here any init code specific to this app like parsing args, etc. */
3101    if (!quiet)
3102      {
3103 #ifdef ELM_EFREET
3104         elm_need_efreet();
3105 #endif
3106         status_win(); /* create main window */
3107         if (!interactive)
3108           ecore_timer_add(2.0, _exit_timer, NULL);
3109      }
3110    if (!interactive)
3111      {
3112         if (theme_set)
3113           {
3114              elm_theme_all_set(theme_set);
3115           }
3116         if (finger_size_set)
3117           {
3118              elm_finger_size_all_set(atoi(finger_size_set));
3119           }
3120         if (scale_set)
3121           {
3122              elm_scale_all_set(atof(scale_set));
3123           }
3124         if (quiet)
3125           {
3126              elm_exit();
3127           }
3128      }
3129    elm_run(); /* and run the program now and handle all events, etc. */
3130    /* if the mainloop that elm_run() runs exists, we exit the app */
3131    elm_shutdown(); /* clean up and shut down */
3132    /* exit code */
3133    return 0;
3134 }
3135
3136 #endif
3137 /* All emelentary apps should use this. Put it right after elm_main() */
3138 ELM_MAIN()