Add a task to copy configuration files to user's HOME dir from data dir for multi...
[platform/core/uifw/e17.git] / src / modules / xkbswitch / e_mod_config.c
1 #include "e.h"
2 #include "e_mod_main.h"
3 #include "e_mod_parse.h"
4
5 struct _E_Config_Dialog_Data
6 {
7    Evas *evas, *dlg_evas;
8    Evas_Object *layout_list, *used_list;
9    Evas_Object *dmodel_list, *model_list, *variant_list;
10    Evas_Object *btn_add, *btn_del, *btn_up, *btn_down;
11    Ecore_Timer *fill_delay;
12    Ecore_Timer *dlg_fill_delay;
13
14    Eina_List  *cfg_layouts;
15    Eina_List  *cfg_options;
16    const char *default_model;
17
18    int only_label;
19
20    E_Dialog *dlg_add_new;
21 };
22
23 typedef struct _E_XKB_Dialog_Option
24 {
25    int enabled;
26    const char *name;
27 } E_XKB_Dialog_Option;
28
29 /* Local prototypes */
30
31 static void *_create_data(E_Config_Dialog *cfd);
32 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
33 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
34 static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
35
36 static void _cb_add(void *data, void *data2 __UNUSED__);
37 static void _cb_del(void *data, void *data2 __UNUSED__);
38
39 static void _cb_up(void *data, void *data2 __UNUSED__);
40 static void _cb_dn(void *data, void *data2 __UNUSED__);
41
42 static void _dlg_add_cb_ok(void *data, E_Dialog *dlg);
43 static void _dlg_add_cb_cancel(void *data, E_Dialog *dlg);
44
45 static E_Dialog *_dlg_add_new(E_Config_Dialog_Data *cfdata);
46
47 static void _dlg_add_cb_del(void *obj);
48
49 static Eina_Bool _cb_dlg_fill_delay(void *data);
50
51 static void _cb_layout_select(void *data);
52 static void _cb_used_select  (void *data);
53
54 static Eina_Bool _cb_fill_delay(void *data);
55
56 /* Externals */
57
58 E_Config_Dialog *
59 _xkb_cfg_dialog(E_Container *con, const char *params __UNUSED__)
60 {
61    E_Config_Dialog *cfd;
62    E_Config_Dialog_View *v;
63
64    if (e_config_dialog_find("E", "keyboard_and_mouse/xkbswitch"))
65      return NULL;
66    if (!(v = E_NEW(E_Config_Dialog_View, 1))) return NULL;
67
68    v->create_cfdata        = _create_data;
69    v->free_cfdata          = _free_data;
70    v->basic.create_widgets = _basic_create;
71    v->basic.apply_cfdata   = _basic_apply;
72
73    cfd = e_config_dialog_new(con, _("Keyboard Settings"), "E",
74                              "keyboard_and_mouse/xkbswitch",
75                              "preferences-desktop-keyboard",
76                              0, v, NULL);
77    e_dialog_resizable_set(cfd->dia, 1);
78    _xkb.cfd = cfd;
79    return cfd;
80 }
81
82 /* Locals */
83
84 static void *
85 _create_data(E_Config_Dialog *cfd __UNUSED__)
86 {
87    E_Config_Dialog_Data *cfdata;
88    Eina_List *l, *ll, *lll;
89    E_Config_XKB_Layout *cl, *nl;
90    E_XKB_Dialog_Option *od;
91    E_XKB_Option *op;
92    E_XKB_Option_Group *gr;
93
94    find_rules();
95    parse_rules(); /* XXX: handle in case nothing was found? */
96
97    cfdata = E_NEW(E_Config_Dialog_Data, 1);
98
99    cfdata->cfg_layouts = NULL;
100    EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
101      {
102         nl          = E_NEW(E_Config_XKB_Layout, 1);
103         nl->name    = eina_stringshare_add(cl->name);
104         nl->model   = eina_stringshare_add(cl->model);
105         nl->variant = eina_stringshare_add(cl->variant);
106
107         cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, nl);
108      }
109
110    /* Initialize options */
111
112    cfdata->only_label  = e_config->xkb.only_label;
113    cfdata->cfg_options = NULL;
114
115    lll = e_config->xkb.used_options;
116    EINA_LIST_FOREACH(optgroups, l, gr)
117      {
118         EINA_LIST_FOREACH(gr->options, ll, op)
119           {
120              od = E_NEW(E_XKB_Dialog_Option, 1);
121              od->name = eina_stringshare_add(op->name);
122              if (lll &&
123                  (od->name == ((E_Config_XKB_Option *)
124                                eina_list_data_get(lll))->name))
125                {
126                   od->enabled = 1;
127                   lll = eina_list_next(lll);
128                }
129              else od->enabled = 0;
130              cfdata->cfg_options = eina_list_append(cfdata->cfg_options, od);
131           }
132      }
133
134    return cfdata;
135 }
136
137 static void
138 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
139 {
140    E_Config_XKB_Layout *cl;
141    E_XKB_Dialog_Option *od;
142
143    _xkb.cfd = NULL;
144
145    EINA_LIST_FREE(cfdata->cfg_layouts, cl)
146      {
147         eina_stringshare_del(cl->name);
148         eina_stringshare_del(cl->model);
149         eina_stringshare_del(cl->variant);
150         E_FREE(cl);
151      }
152
153    EINA_LIST_FREE(cfdata->cfg_options, od)
154      {
155         eina_stringshare_del(od->name);
156         E_FREE(od);
157      }
158
159    eina_stringshare_del(cfdata->default_model);
160    E_FREE(cfdata);
161    clear_rules();
162 }
163
164 static int
165 _basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
166 {
167    Eina_List *l;
168    E_Config_XKB_Layout *cl, *nl;
169    E_Config_XKB_Option *oc;
170    E_XKB_Dialog_Option *od;
171
172    EINA_LIST_FREE(e_config->xkb.used_layouts, cl)
173      {
174         eina_stringshare_del(cl->name);
175         eina_stringshare_del(cl->model);
176         eina_stringshare_del(cl->variant);
177         E_FREE(cl);
178      }
179
180    EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
181      {
182         nl          = E_NEW(E_Config_XKB_Layout, 1);
183         nl->name    = eina_stringshare_add(cl->name);
184         nl->model   = eina_stringshare_add(cl->model);
185         nl->variant = eina_stringshare_add(cl->variant);
186
187         e_config->xkb.used_layouts =
188           eina_list_append(e_config->xkb.used_layouts, nl);
189      }
190
191    if (e_config->xkb.default_model)
192      eina_stringshare_del(e_config->xkb.default_model);
193
194    e_config->xkb.default_model = eina_stringshare_add(cfdata->default_model);
195
196    /* Save options */
197    e_config->xkb.only_label = cfdata->only_label;
198
199    EINA_LIST_FREE(e_config->xkb.used_options, oc)
200      {
201         eina_stringshare_del(oc->name);
202         E_FREE(oc);
203      }
204
205    EINA_LIST_FOREACH(cfdata->cfg_options, l, od)
206      {
207         if (!od->enabled) continue;
208
209         oc = E_NEW(E_Config_XKB_Option, 1);
210         oc->name = eina_stringshare_add(od->name);
211         e_config->xkb.used_options = eina_list_append(e_config->xkb.used_options, oc);
212     }
213
214    e_xkb_update(-1);
215    _xkb_update_icon(0);
216
217    e_config_save_queue();
218    return 1;
219 }
220
221 static Evas_Object *
222 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
223 {
224    /* Holds the dialog contents, displays a toolbar on the top */
225    Evas_Object *mainn = e_widget_toolbook_add(evas, 24, 24);
226      {
227         /* Holds the used layouts ilist and the button table */
228         Evas_Object *layoutss;
229         Evas_Object *modelss;
230         Evas_Object *options;
231
232         layoutss = e_widget_list_add(evas, 0, 0);
233           {
234              /* Holds the used layouts */
235              Evas_Object *configs;
236              Evas_Object *buttons;
237
238              configs = e_widget_ilist_add(evas, 32, 32, NULL);
239
240                {
241                   e_widget_size_min_set(configs, 220, 160);
242                   e_widget_ilist_go(configs);
243
244                   e_widget_list_object_append(layoutss, configs, 1, 1, 0.5);
245                   cfdata->used_list = configs;
246                }
247
248              /* Holds the buttons */
249              buttons = e_widget_table_add(evas, 1);
250                {
251                   cfdata->btn_up = e_widget_button_add(evas, _("Up"), "go-up", _cb_up, cfdata, NULL);
252                     {
253                        e_widget_disabled_set(cfdata->btn_up, EINA_TRUE);
254                        e_widget_table_object_append(buttons, cfdata->btn_up, 0, 0, 1, 1, 1, 1, 1, 0);
255                     }
256
257                   cfdata->btn_down = e_widget_button_add(evas, _("Down"), "go-down", _cb_dn, cfdata, NULL);
258                     {
259                        e_widget_disabled_set(cfdata->btn_down, EINA_TRUE);
260                        e_widget_table_object_append(buttons, cfdata->btn_down, 1, 0, 1, 1, 1, 1, 1, 0);
261                     }
262
263                   cfdata->btn_add = e_widget_button_add(evas, _("Add"), "list-add", _cb_add, cfdata, NULL);
264                     {
265                        e_widget_table_object_append(buttons, cfdata->btn_add, 0, 1, 1, 1, 1, 1, 1, 0);
266                     }
267
268                   cfdata->btn_del = e_widget_button_add(evas, _("Remove"), "list-remove", _cb_del, cfdata, NULL);
269                     {
270                        e_widget_disabled_set(cfdata->btn_del,  EINA_TRUE);
271                        e_widget_table_object_append(buttons, cfdata->btn_del, 1, 1, 1, 1, 1, 1, 1, 0);
272                     }
273
274                   e_widget_list_object_append(layoutss, buttons, 1, 0, 1);
275                }
276
277              e_widget_toolbook_page_append(mainn, NULL, _("Configurations"), layoutss, 1, 1, 1, 1, 0.5, 0.0);
278           }
279
280         /* Holds the default models */
281         modelss = e_widget_ilist_add(evas, 32, 32, &cfdata->default_model);
282           {
283              e_widget_size_min_set(modelss, 220, 160);
284              cfdata->dmodel_list = modelss;
285
286              e_widget_toolbook_page_append(mainn, NULL, _("Models"), modelss, 1, 1, 1, 1, 0.5, 0.0);
287           }
288
289         /* Holds the options */
290         options = e_widget_list_add(evas, 0, 0);
291           {
292              E_XKB_Option *option;
293              E_XKB_Option_Group *group;
294              Eina_List *l, *ll, *lll;
295              Evas_Coord mw, mh;
296              Evas_Object *general;
297              Evas_Object *scroller;
298
299              general =  e_widget_framelist_add(evas, _("Gadgets"), 0);
300                {
301                   Evas_Object *only_label = e_widget_check_add(evas, _("Label only"), &(cfdata->only_label));
302                     {
303                        e_widget_framelist_object_append(general, only_label);
304                     }
305                   e_widget_list_object_append(options, general, 1, 1, 0.0);
306                }
307
308              lll  = cfdata->cfg_options;
309
310              EINA_LIST_FOREACH(optgroups, l, group)
311                {
312                   Evas_Object *grp = e_widget_framelist_add(evas, group->description, 0);
313
314                   EINA_LIST_FOREACH(group->options, ll, option)
315                     {
316                        Evas_Object *chk = e_widget_check_add(evas, option->description,
317                                                              &(((E_XKB_Dialog_Option *)
318                                                                 eina_list_data_get(lll))->enabled));
319                        e_widget_framelist_object_append(grp, chk);
320                        lll = eina_list_next(lll);
321                     }
322                   e_widget_list_object_append(options, grp, 1, 1, 0.0);
323                }
324
325              e_widget_size_min_get(options, &mw, &mh);
326
327              if (mw < 220) mw = 220;
328              if (mh < 160) mh = 160;
329
330              evas_object_resize(options, mw, mh);
331
332              scroller = e_widget_scrollframe_simple_add(evas, options);
333              e_widget_size_min_set(scroller, 220, 160);
334
335              e_widget_toolbook_page_append(mainn, NULL, _("Options"), scroller, 1, 1, 1, 1, 0.5, 0.0);
336           }
337
338         /* Display the first page by default */
339         e_widget_toolbook_page_show(mainn, 0);
340      }
341
342    /* The main evas */
343    cfdata->evas = evas;
344
345    /* Clear up any previous timer */
346    if (cfdata->fill_delay)
347      ecore_timer_del(cfdata->fill_delay);
348
349    /* Trigger the fill */
350    cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata);
351
352    return mainn;
353 }
354
355 static void
356 _cb_add(void *data, void *data2 __UNUSED__)
357 {
358    E_Config_Dialog_Data *cfdata;
359    if (!(cfdata = data)) return;
360
361    if (cfdata->dlg_add_new) e_win_raise(cfdata->dlg_add_new->win);
362    else cfdata->dlg_add_new = _dlg_add_new(cfdata);
363 }
364
365 static void
366 _cb_del(void *data, void *data2 __UNUSED__)
367 {
368    E_Config_Dialog_Data *cfdata;
369    int n = 0;
370
371    if (!(cfdata = data)) return;
372    if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
373
374    cfdata->cfg_layouts = eina_list_remove_list(cfdata->cfg_layouts, eina_list_nth_list(cfdata->cfg_layouts, n));
375
376    /* Update the list */
377    evas_event_freeze(cfdata->evas);
378    edje_freeze();
379    e_widget_ilist_freeze(cfdata->used_list);
380    e_widget_ilist_remove_num(cfdata->used_list, n);
381    e_widget_ilist_go(cfdata->used_list);
382    e_widget_ilist_thaw(cfdata->used_list);
383    edje_thaw();
384    evas_event_thaw(cfdata->evas);
385 }
386
387 static void
388 _cb_up(void *data, void *data2 __UNUSED__)
389 {
390    E_Config_Dialog_Data *cfdata;
391    void *nddata;
392    Evas_Object *ic;
393    Eina_List *l;
394    const char *lbl;
395    int n;
396
397    if (!(cfdata = data)) return;
398    if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
399
400    l = eina_list_nth_list(cfdata->cfg_layouts, n);
401
402    nddata = eina_list_data_get(eina_list_prev(l));
403    eina_list_data_set(eina_list_prev(l), eina_list_data_get(l));
404    eina_list_data_set(l, nddata);
405
406    /* Update the list */
407
408    evas_event_freeze(cfdata->evas);
409    edje_freeze();
410    e_widget_ilist_freeze(cfdata->used_list);
411
412    ic = e_icon_add(cfdata->evas);
413    e_icon_file_set(ic, e_icon_file_get(e_widget_ilist_nth_icon_get(cfdata->used_list, n)));
414    lbl = e_widget_ilist_nth_label_get(cfdata->used_list, n);
415    e_widget_ilist_prepend_relative_full(cfdata->used_list, ic, NULL, lbl, _cb_used_select, cfdata, NULL, (n - 1));
416    e_widget_ilist_remove_num(cfdata->used_list, n);
417
418    e_widget_ilist_go(cfdata->used_list);
419    e_widget_ilist_thaw(cfdata->used_list);
420    edje_thaw();
421    evas_event_thaw(cfdata->evas);
422
423    e_widget_ilist_selected_set(cfdata->used_list, (n - 1));
424 }
425
426 static void
427 _cb_dn(void *data, void *data2 __UNUSED__)
428 {
429    E_Config_Dialog_Data *cfdata;
430    void *nddata;
431    Evas_Object *ic;
432    Eina_List *l;
433    const char *lbl;
434    int n;
435
436    if (!(cfdata = data)) return;
437    if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
438
439    l = eina_list_nth_list(cfdata->cfg_layouts, n);
440
441    nddata = eina_list_data_get(eina_list_next(l));
442    eina_list_data_set(eina_list_next(l), eina_list_data_get(l));
443    eina_list_data_set(l, nddata);
444
445    /* Update the list */
446
447    evas_event_freeze(cfdata->evas);
448    edje_freeze();
449    e_widget_ilist_freeze(cfdata->used_list);
450
451    ic = e_icon_add(cfdata->evas);
452    e_icon_file_set(ic, e_icon_file_get(e_widget_ilist_nth_icon_get(cfdata->used_list, n)));
453    lbl = e_widget_ilist_nth_label_get(cfdata->used_list, n);
454    e_widget_ilist_append_relative_full(cfdata->used_list, ic, NULL, lbl, _cb_used_select, cfdata, NULL, n);
455    e_widget_ilist_remove_num(cfdata->used_list, n);
456
457    e_widget_ilist_go(cfdata->used_list);
458    e_widget_ilist_thaw(cfdata->used_list);
459    edje_thaw();
460    evas_event_thaw(cfdata->evas);
461
462    e_widget_ilist_selected_set(cfdata->used_list, (n + 1));
463 }
464
465 static E_Dialog *
466 _dlg_add_new(E_Config_Dialog_Data *cfdata)
467 {
468    E_Dialog *dlg;
469    Evas *evas;
470    Evas_Coord mw, mh;
471    Evas_Object *mainn;
472
473    if (!(dlg = e_dialog_new(_xkb.cfd->con, "E", "xkbswitch_config_add_dialog"))) return NULL;
474
475    dlg->data = cfdata;
476
477    e_object_del_attach_func_set(E_OBJECT(dlg), _dlg_add_cb_del);
478    e_win_centered_set(dlg->win, 1);
479
480    evas = e_win_evas_get(dlg->win);
481    e_dialog_title_set(dlg, _("Add New Configuration"));
482
483    /* The main toolbook, holds the lists and tabs */
484    mainn = e_widget_toolbook_add(evas, 24, 24);
485      {
486         /* Holds the available layouts */
487         Evas_Object *available = e_widget_ilist_add(evas, 32, 32, NULL);
488         Evas_Object *modelss;
489         Evas_Object *variants;
490
491           {
492              e_widget_size_min_set(available, 220, 160);
493              e_widget_ilist_go(available);
494              e_widget_toolbook_page_append(mainn, NULL, _("Available"), available, 1, 1, 1, 1, 0.5, 0.0);
495              cfdata->layout_list = available;
496           }
497
498         /* Holds the available models */
499         modelss = e_widget_ilist_add(evas, 32, 32, NULL);
500           {
501              e_widget_toolbook_page_append(mainn, NULL, _("Model"), modelss, 1, 1, 1, 1, 0.5, 0.0);
502              cfdata->model_list = modelss;
503         }
504
505         /* Holds the available variants */
506         variants = e_widget_ilist_add(evas, 32, 32, NULL);
507           {
508              e_widget_toolbook_page_append(mainn, NULL, _("Variant"), variants, 1, 1, 1, 1, 0.5, 0.0);
509              cfdata->variant_list = variants;
510           }
511         e_widget_toolbook_page_show(mainn, 0);
512      }
513
514    e_widget_size_min_get(mainn, &mw, &mh);
515    e_dialog_content_set(dlg, mainn, mw,  mh);
516
517    cfdata->dlg_evas = evas;
518
519    /* Clear up any previous timer */
520    if (cfdata->dlg_fill_delay) ecore_timer_del(cfdata->dlg_fill_delay);
521
522    /* Trigger the fill */
523    cfdata->dlg_fill_delay = ecore_timer_add(0.2, _cb_dlg_fill_delay, cfdata);
524
525    /* Some buttons */
526    e_dialog_button_add(dlg, _("OK"), NULL, _dlg_add_cb_ok, cfdata);
527    e_dialog_button_add(dlg, _("Cancel"), NULL, _dlg_add_cb_cancel, cfdata);
528
529    e_dialog_button_disable_num_set(dlg, 0, 1);
530    e_dialog_button_disable_num_set(dlg, 1, 0);
531
532    e_dialog_resizable_set(dlg, 1);
533    e_dialog_show(dlg);
534
535    return dlg;
536 }
537
538 static void
539 _dlg_add_cb_ok(void *data __UNUSED__, E_Dialog *dlg)
540 {
541    E_Config_Dialog_Data *cfdata = dlg->data;
542    E_Config_XKB_Layout  *cl;
543    char buf[4096];
544    /* Configuration information */
545    const char *layout = e_widget_ilist_selected_value_get(cfdata->layout_list);
546    const char *model = e_widget_ilist_selected_value_get(cfdata->model_list);
547    const char *variant = e_widget_ilist_selected_value_get(cfdata->variant_list);
548
549    /* The new configuration */
550    cl          = E_NEW(E_Config_XKB_Layout, 1);
551    cl->name    = eina_stringshare_add(layout);
552    cl->model   = eina_stringshare_add(model);
553    cl->variant = eina_stringshare_add(variant);
554
555    cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, cl);
556
557    /* Update the main list */
558    evas_event_freeze(cfdata->evas);
559    edje_freeze();
560    e_widget_ilist_freeze(cfdata->used_list);
561
562      {
563         Evas_Object *ic = e_icon_add(cfdata->evas);
564         const char *name = cl->name;
565
566         e_xkb_e_icon_flag_setup(ic, name);
567         snprintf(buf, sizeof(buf), "%s (%s, %s)",
568                  cl->name, cl->model, cl->variant);
569         e_widget_ilist_append_full(cfdata->used_list, ic, NULL, buf,
570                                    _cb_used_select, cfdata, NULL);
571      }
572
573    e_widget_ilist_go  (cfdata->used_list);
574    e_widget_ilist_thaw(cfdata->used_list);
575    edje_thaw();
576    evas_event_thaw(cfdata->evas);
577
578    cfdata->dlg_add_new = NULL;
579    e_object_unref(E_OBJECT(dlg));
580 }
581
582 static void
583 _dlg_add_cb_cancel(void *data __UNUSED__, E_Dialog *dlg)
584 {
585    E_Config_Dialog_Data *cfdata = dlg->data;
586    cfdata->dlg_add_new = NULL;
587    e_object_unref(E_OBJECT(dlg));
588 }
589
590 static void
591 _dlg_add_cb_del(void *obj)
592 {
593    E_Dialog *dlg = obj;
594    E_Config_Dialog_Data *cfdata = dlg->data;
595    cfdata->dlg_add_new = NULL;
596    e_object_unref(E_OBJECT(dlg));
597 }
598
599 static Eina_Bool
600 _cb_dlg_fill_delay(void *data)
601 {
602    E_Config_Dialog_Data *cfdata;
603    Eina_List *l;
604    E_XKB_Layout *layout;
605    char buf[4096];
606
607    if (!(cfdata = data)) return ECORE_CALLBACK_RENEW;
608
609    /* Update the list of available layouts */
610    evas_event_freeze(cfdata->dlg_evas);
611    edje_freeze();
612
613    e_widget_ilist_freeze(cfdata->layout_list);
614    e_widget_ilist_clear (cfdata->layout_list);
615
616    EINA_LIST_FOREACH(layouts, l, layout)
617      {
618         Evas_Object *ic = e_icon_add(cfdata->dlg_evas);
619         const char *name = layout->name;
620
621         e_xkb_e_icon_flag_setup(ic, name);
622         snprintf(buf, sizeof(buf), "%s (%s)",
623                  layout->description, layout->name);
624         e_widget_ilist_append_full(cfdata->layout_list, ic, NULL, buf,
625                                    _cb_layout_select, cfdata, layout->name);
626      }
627
628    e_widget_ilist_go  (cfdata->layout_list);
629    e_widget_ilist_thaw(cfdata->layout_list);
630
631    edje_thaw();
632    evas_event_thaw(cfdata->dlg_evas);
633
634    cfdata->dlg_fill_delay = NULL;
635    return ECORE_CALLBACK_CANCEL;
636 }
637
638 static void
639 _cb_layout_select(void *data)
640 {
641    E_Config_Dialog_Data *cfdata;
642    E_XKB_Variant *variant;
643    E_XKB_Layout *layout;
644    E_XKB_Model *model;
645    Eina_List *l;
646    const char *label;
647    int n;
648    char buf[4096];
649
650    if (!(cfdata = data)) return;
651
652    /* Find the right layout */
653
654    if ((n = e_widget_ilist_selected_get(cfdata->layout_list)) < 0)
655      return;
656    if (!(label = e_widget_ilist_nth_label_get(cfdata->layout_list, n)))
657      return;
658
659    if (!(layout = eina_list_search_unsorted
660          (layouts, layout_sort_by_name_cb,
661              e_widget_ilist_nth_value_get(cfdata->layout_list, n)
662          ))) return;
663
664    /* Update the lists */
665    evas_event_freeze(cfdata->dlg_evas);
666    edje_freeze();
667
668    /* Models */
669    e_widget_ilist_freeze(cfdata->model_list);
670    e_widget_ilist_clear(cfdata->model_list);
671
672    EINA_LIST_FOREACH(models, l, model)
673      {
674         snprintf(buf, sizeof(buf), "%s (%s)", model->description, model->name);
675         e_widget_ilist_append(cfdata->model_list, NULL, buf, NULL, cfdata, model->name);
676      }
677
678    e_widget_ilist_go(cfdata->model_list);
679    e_widget_ilist_thaw(cfdata->model_list);
680
681    /* Variants */
682    e_widget_ilist_freeze(cfdata->variant_list);
683    e_widget_ilist_clear(cfdata->variant_list);
684
685    EINA_LIST_FOREACH(layout->variants, l, variant)
686      {
687         snprintf(buf, sizeof(buf),  "%s (%s)", variant->name, variant->description);
688         e_widget_ilist_append(cfdata->variant_list, NULL, buf, NULL, cfdata, variant->name);
689      }
690
691    e_widget_ilist_go(cfdata->variant_list);
692    e_widget_ilist_thaw(cfdata->variant_list);
693
694    edje_thaw();
695    evas_event_thaw(cfdata->dlg_evas);
696
697    e_widget_ilist_selected_set(cfdata->model_list,   0);
698    e_widget_ilist_selected_set(cfdata->variant_list, 0);
699
700    e_dialog_button_disable_num_set(cfdata->dlg_add_new, 0, 0);
701 }
702
703 static Eina_Bool
704 _cb_fill_delay(void *data)
705 {
706    E_Config_Dialog_Data *cfdata;
707    Eina_List *l;
708    E_Config_XKB_Layout *cl;
709    E_XKB_Model *model;
710    int n = 0;
711    char buf[4096];
712
713    if (!(cfdata = data)) return ECORE_CALLBACK_RENEW;
714
715    /* Update the list of used layouts */
716    evas_event_freeze(cfdata->evas);
717    edje_freeze();
718
719    e_widget_ilist_freeze(cfdata->used_list);
720    e_widget_ilist_clear(cfdata->used_list);
721
722    EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
723      {
724         Evas_Object *ic = e_icon_add(cfdata->evas);
725         const char *name = cl->name;
726
727         e_xkb_e_icon_flag_setup(ic, name);
728         snprintf(buf, sizeof(buf), "%s (%s, %s)",
729                  cl->name, cl->model, cl->variant);
730         e_widget_ilist_append_full(cfdata->used_list, ic, NULL, buf,
731                                    _cb_used_select, cfdata, NULL);
732     }
733
734    e_widget_ilist_go(cfdata->used_list);
735    e_widget_ilist_thaw(cfdata->used_list);
736
737    e_widget_ilist_freeze(cfdata->dmodel_list);
738    e_widget_ilist_clear(cfdata->dmodel_list);
739
740    /* Update the global model list */
741    EINA_LIST_FOREACH(models, l, model)
742      {
743         snprintf(buf, sizeof(buf), "%s (%s)", model->description, model->name);
744         e_widget_ilist_append(cfdata->dmodel_list, NULL, buf, NULL,
745                               cfdata, model->name);
746         if (model->name == e_config->xkb.default_model)
747           e_widget_ilist_selected_set(cfdata->dmodel_list, n);
748         n++;
749      }
750
751    e_widget_ilist_go(cfdata->dmodel_list);
752    e_widget_ilist_thaw(cfdata->dmodel_list);
753    edje_thaw();
754    evas_event_thaw(cfdata->evas);
755
756    cfdata->fill_delay = NULL;
757    return ECORE_CALLBACK_CANCEL;
758 }
759
760 static void
761 _cb_used_select(void *data)
762 {
763    E_Config_Dialog_Data *cfdata;
764    int n, c;
765
766    if (!(cfdata = data)) return;
767    if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
768
769    c = e_widget_ilist_count(cfdata->used_list);
770    e_widget_disabled_set(cfdata->btn_del, EINA_FALSE);
771
772    if (n == (c - 1))
773      {
774         e_widget_disabled_set(cfdata->btn_up,   EINA_FALSE);
775         e_widget_disabled_set(cfdata->btn_down, EINA_TRUE );
776      }
777    else if (n == 0)
778      {
779         e_widget_disabled_set(cfdata->btn_up,   EINA_TRUE );
780         e_widget_disabled_set(cfdata->btn_down, EINA_FALSE);
781      }
782    else
783      {
784         e_widget_disabled_set(cfdata->btn_up,   EINA_FALSE);
785         e_widget_disabled_set(cfdata->btn_down, EINA_FALSE);
786      }
787 }