yoz pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=15c0d460504abdbb25d4dcba9cdb3bde3c7a2b54

commit 15c0d460504abdbb25d4dcba9cdb3bde3c7a2b54
Author: Michaƫl Bouchaud (yoz) <y...@efl.so>
Date:   Mon Oct 31 11:35:24 2016 +0100

    xkbswitch: rewrite the config panel to improve the gui design
---
 src/modules/xkbswitch/e_mod_config.c | 1388 ++++++++++++++++++++++++++--------
 src/modules/xkbswitch/e_mod_main.c   |   15 -
 src/modules/xkbswitch/e_mod_parse.c  |  148 ++--
 src/modules/xkbswitch/e_mod_parse.h  |   27 +-
 4 files changed, 1182 insertions(+), 396 deletions(-)

diff --git a/src/modules/xkbswitch/e_mod_config.c 
b/src/modules/xkbswitch/e_mod_config.c
index d615aad..e7fa898 100644
--- a/src/modules/xkbswitch/e_mod_config.c
+++ b/src/modules/xkbswitch/e_mod_config.c
@@ -10,9 +10,51 @@ struct _E_Config_Dialog_Data
    Evas_Object *btn_add, *btn_del, *btn_up, *btn_down;
    Ecore_Timer *fill_delay;
    Ecore_Timer *dlg_fill_delay;
+   Evas_Object *popup;
+
+   Evas_Object *btn_layout;
+   Evas_Object *led_list;
+   Evas_Object *switch_list;
+   Evas_Object *ctrl_list;
+   Evas_Object *lv3_list;
+   Evas_Object *keypad_list;
+   Evas_Object *delkeypad_list;
+   Evas_Object *capslock_list;
+   Evas_Object *altwin_list;
+   Evas_Object *compose_list;
+   Evas_Object *currency_list;
+   Evas_Object *lv5_list;
+   Evas_Object *spacebar_list;
+   Evas_Object *japan_list;
+   Evas_Object *korean_list;
+   Evas_Object *esperanto_list;
+   Evas_Object *solaris_list;
+   Evas_Object *terminate_list;
+   Evas_Object *misc_list;
+
+   Evas_Object *chk_label;
 
    Eina_List   *cfg_layouts;
-   Eina_List   *cfg_options;
+
+   Eina_List   *cfg_led_options;
+   Eina_List   *cfg_switch_options;
+   Eina_List   *cfg_lv3_options;
+   Eina_List   *cfg_ctrl_options;
+   Eina_List   *cfg_keypad_options;
+   Eina_List   *cfg_delkeypad_options;
+   Eina_List   *cfg_capslock_options;
+   Eina_List   *cfg_altwin_options;
+   Eina_List   *cfg_compose_options;
+   Eina_List   *cfg_currency_options;
+   Eina_List   *cfg_lv5_options;
+   Eina_List   *cfg_spacebar_options;
+   Eina_List   *cfg_japan_options;
+   Eina_List   *cfg_korean_options;
+   Eina_List   *cfg_esperanto_options;
+   Eina_List   *cfg_solaris_options;
+   Eina_List   *cfg_terminate_options;
+   Eina_List   *cfg_misc_options;
+
    const char  *default_model;
 
    int          only_label;
@@ -22,25 +64,46 @@ struct _E_Config_Dialog_Data
    E_Config_Dialog *cfd;
 };
 
-typedef struct _E_XKB_Dialog_Option
-{
-   int         enabled;
-   const char *name;
-} E_XKB_Dialog_Option;
-
 /* Local prototypes */
 
 static void        *_create_data(E_Config_Dialog *cfd);
 static void         _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data 
*cfdata);
 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, 
E_Config_Dialog_Data *cfdata);
+static Evas_Object *_advanced_create(E_Config_Dialog *cfd, Evas *evas, 
E_Config_Dialog_Data *cfdata);
 static int          _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data 
*cfdata);
-static int          _basic_check_changed(E_Config_Dialog *cfd, 
E_Config_Dialog_Data *cfdata);
-
-static void         _cb_add(void *data, void *data2 EINA_UNUSED);
-static void         _cb_del(void *data, void *data2 EINA_UNUSED);
-
-static void         _cb_up(void *data, void *data2 EINA_UNUSED);
-static void         _cb_dn(void *data, void *data2 EINA_UNUSED);
+static int          _check_changed(E_Config_Dialog_Data *cfdata);
+
+
+static void         _dont_touch_my_damn_keyboard_changed(void *data, 
Evas_Object *obj, void *event);
+static void         _only_label_changed(void *data, Evas_Object *obj, void 
*event);
+
+static void         _layout_clicked(void *data, Evas_Object *obj, void *event);
+static void         _cb_add(void *data, Evas_Object *obj, void *event);
+static void         _cb_del(void *data, Evas_Object *obj, void *event);
+
+static void         _cb_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_dn(void *data, Evas_Object *obj, void *event);
+
+static void         _cb_led_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_ctrl_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_compose_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_lv3_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_switch_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_keypad_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_delkeypad_up(void *data, Evas_Object *obj, void 
*event);
+static void         _cb_capslock_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_altwin_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_currency_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_lv5_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_spacebar_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_japan_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_korean_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_esperanto_up(void *data, Evas_Object *obj, void 
*event);
+static void         _cb_solaris_up(void *data, Evas_Object *obj, void *event);
+static void         _cb_terminate_up(void *data, Evas_Object *obj, void 
*event);
+static void         _cb_misc_up(void *data, Evas_Object *obj, void *event);
+
+static void         _popup_cancel_clicked(void *data, Evas_Object *obj, void 
*event_info);
 
 static void         _dlg_add_cb_ok(void *data, E_Dialog *dlg);
 static void         _dlg_add_cb_cancel(void *data, E_Dialog *dlg);
@@ -52,7 +115,7 @@ static void         _dlg_add_cb_del(void *obj);
 static Eina_Bool    _cb_dlg_fill_delay(void *data);
 
 static void         _cb_layout_select(void *data);
-static void         _cb_used_select(void *data);
+static void         _cb_used_select(void *data, Evas_Object *obj, void *event);
 
 static Eina_Bool    _cb_fill_delay(void *data);
 
@@ -72,7 +135,8 @@ _xkb_cfg_dialog(Evas_Object *parent EINA_UNUSED, const char 
*params EINA_UNUSED)
    v->free_cfdata = _free_data;
    v->basic.create_widgets = _basic_create;
    v->basic.apply_cfdata = _basic_apply;
-   v->basic.check_changed = _basic_check_changed;
+   v->advanced.create_widgets = _advanced_create;
+   v->advanced.apply_cfdata = _basic_apply;
 
    cfd = e_config_dialog_new(NULL, _("Keyboard Settings"), "E",
                              "keyboard_and_mouse/xkbswitch",
@@ -84,15 +148,33 @@ _xkb_cfg_dialog(Evas_Object *parent EINA_UNUSED, const 
char *params EINA_UNUSED)
 
 /* Locals */
 
+static Eina_Bool
+_fill_data(E_XKB_Option *op, const char *name, int size, Eina_List *check, 
Eina_List **add)
+{
+   E_XKB_Option *op2;
+   Eina_List *l;
+
+   if (!strncmp(op->name, name, size))
+     {
+        EINA_LIST_FOREACH(check, l, op2)
+          {
+             if (op->name == op2->name)
+               {
+                  *add = eina_list_append(*add, op2);
+                  return EINA_TRUE;
+               }
+          }
+     }
+   return EINA_FALSE;
+}
+
 static void *
 _create_data(E_Config_Dialog *cfd)
 {
    E_Config_Dialog_Data *cfdata;
-   Eina_List *l, *ll, *lll;
+   Eina_List *l;
    E_Config_XKB_Layout *cl, *nl;
-   E_XKB_Dialog_Option *od;
    E_XKB_Option *op;
-   E_XKB_Option_Group *gr;
 
    find_rules();
    parse_rules(); /* XXX: handle in case nothing was found? */
@@ -112,28 +194,37 @@ _create_data(E_Config_Dialog *cfd)
      }
 
    /* Initialize options */
+   cfdata->default_model = eina_stringshare_add(e_config->xkb.default_model);
 
    cfdata->only_label = e_config->xkb.only_label;
    cfdata->dont_touch_my_damn_keyboard = 
e_config->xkb.dont_touch_my_damn_keyboard;
-   cfdata->cfg_options = NULL;
 
-   lll = e_config->xkb.used_options;
-   EINA_LIST_FOREACH(optgroups, l, gr)
+#undef FILL_DATA
+#define FILL_DATA(name, list_name) \
+   if (_fill_data(op, name, (sizeof(name) - 1),\
+                  opt ## list_name, \
+                  &cfdata->cfg_ ## list_name ## _options)) continue
+
+   EINA_LIST_FOREACH(e_config->xkb.used_options, l, op)
      {
-        EINA_LIST_FOREACH(gr->options, ll, op)
-          {
-             od = E_NEW(E_XKB_Dialog_Option, 1);
-             od->name = eina_stringshare_add(op->name);
-             if (lll &&
-                 (od->name == ((E_Config_XKB_Option *)
-                               eina_list_data_get(lll))->name))
-               {
-                  od->enabled = 1;
-                  lll = eina_list_next(lll);
-               }
-             else od->enabled = 0;
-             cfdata->cfg_options = eina_list_append(cfdata->cfg_options, od);
-          }
+        FILL_DATA("grp_led", led);
+        FILL_DATA("grp", switch);
+        FILL_DATA("lv3", lv3);
+        FILL_DATA("ctrl", ctrl);
+        FILL_DATA("keypad", keypad);
+        FILL_DATA("kpdl", delkeypad);
+        FILL_DATA("caps", capslock);
+        FILL_DATA("altwin", altwin);
+        FILL_DATA("compose", compose);
+        FILL_DATA("eurosign", currency);
+        FILL_DATA("rupeesign", currency);
+        FILL_DATA("lv5", lv5);
+        FILL_DATA("nbsp", spacebar);
+        FILL_DATA("japan", japan);
+        FILL_DATA("korean", korean);
+        FILL_DATA("esperanto", esperanto);
+        FILL_DATA("solaris", solaris);
+        FILL_DATA("terminate", terminate);
      }
 
    return cfdata;
@@ -143,7 +234,6 @@ static void
 _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
 {
    E_Config_XKB_Layout *cl;
-   E_XKB_Dialog_Option *od;
 
    _xkb.cfd = NULL;
 
@@ -155,28 +245,21 @@ _free_data(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
         E_FREE(cl);
      }
 
-   EINA_LIST_FREE(cfdata->cfg_options, od)
-     {
-        eina_stringshare_del(od->name);
-        E_FREE(od);
-     }
-
    eina_stringshare_del(cfdata->default_model);
    E_FREE(cfdata);
    clear_rules();
 }
 
 static int
-_basic_check_changed(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data 
*cfdata)
+_check_changed(E_Config_Dialog_Data *cfdata)
 {
-   Eina_List *l, *l2, *l3;
+   Eina_List *l, *l2;
+   Eina_List *list_option_found = NULL;
    E_Config_XKB_Layout *cl, *nl;
-   E_Config_XKB_Option *co;
-   E_XKB_Dialog_Option *od;
-   Eina_Bool found;
+   E_Config_XKB_Option *od, *op;
 
    if ((eina_list_count(e_config->xkb.used_layouts) !=
-         eina_list_count(cfdata->cfg_layouts)) ||
+        eina_list_count(cfdata->cfg_layouts)) ||
        (e_config->xkb.default_model != cfdata->default_model) ||
        (e_config->xkb.only_label != cfdata->only_label) ||
        (e_config->xkb.dont_touch_my_damn_keyboard != 
cfdata->dont_touch_my_damn_keyboard))
@@ -193,27 +276,70 @@ _basic_check_changed(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfd
         l2 = eina_list_next(l2);
      }
 
-   l2 = e_config->xkb.used_options;
-   EINA_LIST_FOREACH(cfdata->cfg_options, l, od)
+#undef CHECK_OPTION_AND_ADD
+#define CHECK_OPTION_AND_ADD(list) \
+   do { \
+        EINA_LIST_FOREACH(list, l, od) \
+          { \
+             if (op->name == od->name) \
+               { \
+                  list_option_found = eina_list_append(list_option_found, op); 
\
+                  break; \
+               } \
+          } \
+   } \
+   while(0); \
+   if (l) continue \
+
+   EINA_LIST_FOREACH(e_config->xkb.used_options, l, op)
      {
-        found = EINA_FALSE;
-        EINA_LIST_FOREACH(l2, l3, co)
-          {
-             if (od->name == co->name)
-               {
-                  found = EINA_TRUE;
-                  break;
-               }
-          }
-        if ((!found) && (!od->enabled))
-          continue;
-        if (found && od->enabled)
-          {
-             l2 = eina_list_next(l3);
-             continue;
-          }
+        CHECK_OPTION_AND_ADD(cfdata->cfg_compose_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_lv3_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_switch_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_led_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_ctrl_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_keypad_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_delkeypad_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_capslock_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_altwin_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_currency_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_lv5_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_spacebar_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_japan_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_korean_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_esperanto_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_solaris_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_terminate_options);
+        CHECK_OPTION_AND_ADD(cfdata->cfg_misc_options);
+     }
+   /* If user have deleted an option */
+   if (eina_list_count(e_config->xkb.used_options) > 
eina_list_count(list_option_found))
+     {
+        eina_list_free(list_option_found);
         return 1;
      }
+   /* If user have added an option */
+   eina_list_free(list_option_found);
+   if ((eina_list_count(e_config->xkb.used_options))
+       < (eina_list_count(cfdata->cfg_compose_options)
+          + eina_list_count(cfdata->cfg_lv3_options)
+          + eina_list_count(cfdata->cfg_switch_options)
+          + eina_list_count(cfdata->cfg_led_options)
+          + eina_list_count(cfdata->cfg_ctrl_options)
+          + eina_list_count(cfdata->cfg_keypad_options)
+          + eina_list_count(cfdata->cfg_delkeypad_options)
+          + eina_list_count(cfdata->cfg_capslock_options)
+          + eina_list_count(cfdata->cfg_altwin_options)
+          + eina_list_count(cfdata->cfg_currency_options)
+          + eina_list_count(cfdata->cfg_lv5_options)
+          + eina_list_count(cfdata->cfg_spacebar_options)
+          + eina_list_count(cfdata->cfg_japan_options)
+          + eina_list_count(cfdata->cfg_korean_options)
+          + eina_list_count(cfdata->cfg_esperanto_options)
+          + eina_list_count(cfdata->cfg_solaris_options)
+          + eina_list_count(cfdata->cfg_terminate_options)
+          + eina_list_count(cfdata->cfg_misc_options)))
+     return 1;
 
    return 0;
 }
@@ -223,8 +349,7 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
 {
    Eina_List *l;
    E_Config_XKB_Layout *cl, *nl;
-   E_Config_XKB_Option *oc;
-   E_XKB_Dialog_Option *od;
+   E_Config_XKB_Option *oc, *op;
    Eina_Bool cur_ok = EINA_FALSE, sel_ok = EINA_FALSE;
 
    EINA_LIST_FREE(e_config->xkb.used_layouts, cl)
@@ -243,7 +368,7 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
         nl->variant = eina_stringshare_ref(cl->variant);
 
         e_config->xkb.used_layouts =
-          eina_list_append(e_config->xkb.used_layouts, nl);
+           eina_list_append(e_config->xkb.used_layouts, nl);
         if (e_config_xkb_layout_eq(e_config->xkb.current_layout, nl))
           cur_ok = EINA_TRUE;
         if (e_config_xkb_layout_eq(e_config->xkb.sel_layout, nl))
@@ -253,11 +378,11 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
      {
         E_FREE_FUNC(e_config->xkb.current_layout, e_config_xkb_layout_free);
         EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
-          if (e_config->xkb.cur_layout == cl->name)
-            {
-               e_config->xkb.current_layout = e_config_xkb_layout_dup(cl);
-               break;
-            }
+           if (e_config->xkb.cur_layout == cl->name)
+             {
+                e_config->xkb.current_layout = e_config_xkb_layout_dup(cl);
+                break;
+             }
         if (!e_config->xkb.current_layout)
           eina_stringshare_replace(&e_config->xkb.cur_layout, NULL);
      }
@@ -265,11 +390,11 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
      {
         E_FREE_FUNC(e_config->xkb.sel_layout, e_config_xkb_layout_free);
         EINA_LIST_FOREACH(e_config->xkb.used_layouts, l, cl)
-          if (e_config->xkb.selected_layout == cl->name)
-            {
-               e_config->xkb.sel_layout = e_config_xkb_layout_dup(cl);
-               break;
-            }
+           if (e_config->xkb.selected_layout == cl->name)
+             {
+                e_config->xkb.sel_layout = e_config_xkb_layout_dup(cl);
+                break;
+             }
         if (!e_config->xkb.sel_layout)
           eina_stringshare_replace(&e_config->xkb.selected_layout, NULL);
      }
@@ -285,253 +410,906 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
         eina_stringshare_del(oc->name);
         E_FREE(oc);
      }
-
-   EINA_LIST_FOREACH(cfdata->cfg_options, l, od)
-     {
-        if (!od->enabled) continue;
-
-        oc = E_NEW(E_Config_XKB_Option, 1);
-        oc->name = eina_stringshare_ref(od->name);
-        e_config->xkb.used_options = 
eina_list_append(e_config->xkb.used_options, oc);
-     }
+#undef FILL_CONFIG
+#define FILL_CONFIG(list) \
+   do { \
+        EINA_LIST_FOREACH(list, l, op) \
+          { \
+             oc = E_NEW(E_Config_XKB_Option, 1); \
+             oc->name = eina_stringshare_ref(op->name); \
+             e_config->xkb.used_options = 
eina_list_append(e_config->xkb.used_options, oc); \
+          } \
+   } while(0)
+
+   FILL_CONFIG(cfdata->cfg_compose_options);
+   FILL_CONFIG(cfdata->cfg_lv3_options);
+   FILL_CONFIG(cfdata->cfg_switch_options);
+   FILL_CONFIG(cfdata->cfg_led_options);
+   FILL_CONFIG(cfdata->cfg_ctrl_options);
+   FILL_CONFIG(cfdata->cfg_keypad_options);
+   FILL_CONFIG(cfdata->cfg_delkeypad_options);
+   FILL_CONFIG(cfdata->cfg_capslock_options);
+   FILL_CONFIG(cfdata->cfg_altwin_options);
+   FILL_CONFIG(cfdata->cfg_currency_options);
+   FILL_CONFIG(cfdata->cfg_lv5_options);
+   FILL_CONFIG(cfdata->cfg_spacebar_options);
+   FILL_CONFIG(cfdata->cfg_japan_options);
+   FILL_CONFIG(cfdata->cfg_korean_options);
+   FILL_CONFIG(cfdata->cfg_esperanto_options);
+   FILL_CONFIG(cfdata->cfg_solaris_options);
+   FILL_CONFIG(cfdata->cfg_terminate_options);
+   FILL_CONFIG(cfdata->cfg_misc_options);
 
    e_xkb_reconfig();
    e_config_save_queue();
    return 1;
 }
 
-static Evas_Object *
-_basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, 
E_Config_Dialog_Data *cfdata)
+static void
+_list_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event EINA_UNUSED)
+{
+   Evas_Object **o;
+
+   o = data;
+
+   *o = NULL;
+}
+
+static void
+_option_del(void *data, Evas_Object *obj, void *event)
+{
+   Eina_List **list;
+   Eina_List *l;
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   l = evas_object_data_get(obj, "list_option");
+   list = evas_object_data_get(obj, "list");
+   (*list) = eina_list_remove_list((*list), l);
+   evas_object_del(obj);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_basic_create_fill(E_Config_Dialog_Data *cfdata)
 {
-   Evas_Object *mainn, *layoutss, *modelss, *options, *configs, *buttons,
-     *general, *scroller, *only_label, *dont_touch_my_damn_keyboard;
    E_XKB_Option *option;
-   E_XKB_Option_Group *group;
-   Eina_List *l, *ll, *lll;
-   Evas_Coord mw, mh;
+   Eina_List *l;
+   Evas_Object *o;
+   E_Config_XKB_Layout *cl;
+   Elm_Object_Item *it, *sel = NULL;
+
+   elm_object_disabled_set(cfdata->chk_label,
+                           cfdata->dont_touch_my_damn_keyboard);
+   elm_object_disabled_set(cfdata->used_list,
+                           cfdata->dont_touch_my_damn_keyboard);
+   if (cfdata->dont_touch_my_damn_keyboard)
+     elm_list_select_mode_set(cfdata->used_list, ELM_OBJECT_SELECT_MODE_NONE);
+   else
+     elm_list_select_mode_set(cfdata->used_list, 
ELM_OBJECT_SELECT_MODE_DEFAULT);
+   elm_object_disabled_set(cfdata->btn_add,
+                           cfdata->dont_touch_my_damn_keyboard);
+   elm_object_disabled_set(cfdata->btn_del,
+                           cfdata->dont_touch_my_damn_keyboard);
+   elm_object_disabled_set(cfdata->btn_up,
+                           cfdata->dont_touch_my_damn_keyboard);
+   elm_object_disabled_set(cfdata->btn_down,
+                           cfdata->dont_touch_my_damn_keyboard);
+   elm_object_disabled_set(cfdata->btn_layout,
+                           cfdata->dont_touch_my_damn_keyboard);
+   if (cfdata->default_model)
+     elm_object_text_set(cfdata->btn_layout, cfdata->default_model);
+   else
+     elm_object_text_set(cfdata->btn_layout, "default");
+
+   /* Update the list of used layouts */
+   elm_list_clear(cfdata->used_list);
+   if (!cfdata->dont_touch_my_damn_keyboard)
+     {
+        EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
+          {
+             Evas_Object *ic = elm_icon_add(cfdata->used_list);
+             const char *name = cl->name;
+             char buf[PATH_MAX];
+
+             e_xkb_flag_file_get(buf, sizeof(buf), name);
+             elm_image_file_set(ic, buf, NULL);
+             snprintf(buf, sizeof(buf), "%s (%s, %s)",
+                      cl->name, cl->model, cl->variant);
+             evas_object_show(ic);
+             it = elm_list_item_append(cfdata->used_list, buf, ic,
+                                       NULL, NULL, cl);
+             if (!l->prev)
+               sel = it;
+          }
+        if (sel)
+          elm_list_item_selected_set(sel, EINA_TRUE);
+        elm_list_go(cfdata->used_list);
+     }
+
+
+#undef FILL_GUI
+#define FILL_GUI(list, box, cb) \
+   do { \
+        if (!box) break; \
+        elm_box_clear(box); \
+        if (cfdata->dont_touch_my_damn_keyboard) break; \
+        EINA_LIST_FOREACH(list, l, option) \
+          { \
+             o = elm_button_add(box); \
+             elm_object_text_set(o, option->description); \
+             evas_object_data_set(o, "list_option", l); \
+             evas_object_data_set(o, "list", &list); \
+             evas_object_smart_callback_add(o, "clicked", _option_del, 
cfdata); \
+             elm_box_pack_end(box, o); \
+             evas_object_show(o); \
+          } \
+        o = elm_button_add(box); \
+        elm_object_text_set(o, "+"); \
+        evas_object_smart_callback_add(o, "clicked", cb, cfdata); \
+        elm_box_pack_end(box, o); \
+        evas_object_show(o); \
+   } while (0)
+
+   FILL_GUI(cfdata->cfg_compose_options, cfdata->compose_list, _cb_compose_up);
+   FILL_GUI(cfdata->cfg_lv3_options, cfdata->lv3_list, _cb_lv3_up);
+   FILL_GUI(cfdata->cfg_switch_options, cfdata->switch_list, _cb_switch_up);
+   FILL_GUI(cfdata->cfg_led_options, cfdata->led_list, _cb_led_up);
+   FILL_GUI(cfdata->cfg_ctrl_options, cfdata->ctrl_list, _cb_ctrl_up);
+   FILL_GUI(cfdata->cfg_keypad_options, cfdata->keypad_list, _cb_keypad_up);
+   FILL_GUI(cfdata->cfg_delkeypad_options, cfdata->delkeypad_list,
+            _cb_delkeypad_up);
+   FILL_GUI(cfdata->cfg_capslock_options, cfdata->capslock_list,
+            _cb_capslock_up);
+   FILL_GUI(cfdata->cfg_altwin_options, cfdata->altwin_list, _cb_altwin_up);
+   FILL_GUI(cfdata->cfg_currency_options, cfdata->currency_list,
+            _cb_currency_up);
+   FILL_GUI(cfdata->cfg_lv5_options, cfdata->lv5_list, _cb_lv5_up);
+   FILL_GUI(cfdata->cfg_spacebar_options, cfdata->spacebar_list,
+            _cb_spacebar_up);
+   FILL_GUI(cfdata->cfg_japan_options, cfdata->japan_list, _cb_japan_up);
+   FILL_GUI(cfdata->cfg_korean_options, cfdata->korean_list, _cb_korean_up);
+   FILL_GUI(cfdata->cfg_esperanto_options, cfdata->esperanto_list,
+            _cb_esperanto_up);
+   FILL_GUI(cfdata->cfg_solaris_options, cfdata->solaris_list, _cb_solaris_up);
+   FILL_GUI(cfdata->cfg_terminate_options,
+            cfdata->terminate_list, _cb_terminate_up);
+   FILL_GUI(cfdata->cfg_misc_options, cfdata->misc_list, _cb_misc_up);
+}
+
+static Evas_Object *
+_config_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data 
*cfdata)
+{
+   Evas_Object *mainn, *configs, *buttons, *only_label,
+               *dont_touch_my_damn_keyboard;
+   Evas_Object *listh, *frame;
+   Evas_Object *o;
+
    /* Holds the dialog contents, displays a toolbar on the top */
    e_dialog_resizable_set(cfd->dia, 1);
-   mainn = e_widget_toolbook_add(evas, 24, 24);
 
-   /* Holds the used layouts ilist and the button table */
-   layoutss = e_widget_list_add(evas, 0, 0);
-
-   /* Holds the used layouts */
-   configs = e_widget_ilist_add(evas, 32, 32, NULL);
+   /* The main evas */
+   cfdata->evas = evas;
 
-   e_widget_size_min_set(configs, 220, 160);
-   e_widget_ilist_go(configs);
+   mainn = elm_box_add(cfd->dia->win);
+   elm_box_horizontal_set(mainn, EINA_FALSE);
+   evas_object_size_hint_weight_set(mainn, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+
+   dont_touch_my_damn_keyboard = elm_check_add(mainn);
+   evas_object_smart_callback_add(dont_touch_my_damn_keyboard, "changed",
+                                  _dont_touch_my_damn_keyboard_changed, 
cfdata);
+   elm_object_text_set(dont_touch_my_damn_keyboard,
+                       _("Do not apply any keyboard settings ever"));
+   evas_object_show(dont_touch_my_damn_keyboard);
+   evas_object_size_hint_align_set(dont_touch_my_damn_keyboard, 0.0, 0.5);
+   elm_box_pack_end(mainn, dont_touch_my_damn_keyboard);
+
+   only_label = elm_check_add(mainn);
+   evas_object_smart_callback_add(only_label, "changed",
+                                  _only_label_changed, cfdata);
+   cfdata->chk_label = only_label;
+   elm_object_text_set(only_label, _("Label only in gadgets"));
+   evas_object_show(only_label);
+   evas_object_size_hint_align_set(only_label, 0.0, 0.5);
+   elm_box_pack_end(mainn, only_label);
+
+   o = elm_separator_add(mainn);
+   elm_separator_horizontal_set(o, EINA_TRUE);
+   evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, 0.5);
+   evas_object_show(o);
+   elm_box_pack_end(mainn, o);
+
+   /* Holds the default layouts */
+   listh = elm_box_add(mainn);
+   elm_box_horizontal_set(listh, EINA_TRUE);
+   elm_box_homogeneous_set(listh, EINA_TRUE);
+   evas_object_size_hint_align_set(listh, EVAS_HINT_FILL, 0.5);
+   o = elm_label_add(listh);
+   elm_object_text_set(o, _("Default keyboard layout"));
+   evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_box_pack_end(listh, o);
+   evas_object_show(o);
+   o = elm_button_add(listh);
+   cfdata->btn_layout = o;
+   evas_object_smart_callback_add(o, "clicked", _layout_clicked, cfdata);
+   evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(o);
+   elm_box_pack_end(listh, o);
+   evas_object_show(listh);
+   elm_box_pack_end(mainn, listh);
 
-   e_widget_list_object_append(layoutss, configs, 1, 1, 0.5);
+   /* Holds the used layouts */
+   listh = elm_box_add(mainn);
+   elm_box_horizontal_set(listh, EINA_TRUE);
+   o = evas_object_rectangle_add(listh);
+   evas_object_size_hint_min_set(o, 0, 160);
+   elm_box_pack_end(listh, o);
+   configs = elm_list_add(listh);
+   evas_object_size_hint_align_set(configs, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(configs, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+   elm_box_pack_end(listh, configs);
+   elm_box_pack_end(mainn, listh);
+   evas_object_show(configs);
+   evas_object_size_hint_align_set(listh, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(listh, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_show(listh);
+   evas_object_smart_callback_add(configs, "selected", _cb_used_select, 
cfdata);
    cfdata->used_list = configs;
 
    /* Holds the buttons */
-   buttons = e_widget_table_add(e_win_evas_win_get(evas), 1);
-   cfdata->btn_up = e_widget_button_add(evas, _("Up"), "go-up", _cb_up, 
cfdata, NULL);
-   e_widget_disabled_set(cfdata->btn_up, EINA_TRUE);
-   e_widget_table_object_append(buttons, cfdata->btn_up, 0, 0, 1, 1, 1, 1, 1, 
0);
+   buttons = elm_table_add(mainn);
+   elm_table_homogeneous_set(buttons, EINA_TRUE);
+
+   o = elm_button_add(buttons);
+   cfdata->btn_add = o;
+   elm_object_text_set(o, _("Add"));
+   evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_smart_callback_add(o, "clicked", _cb_add, cfdata);
+   evas_object_show(o);
+   elm_table_pack(buttons, o, 0, 0, 1, 1);
+
+   o = elm_button_add(buttons);
+   cfdata->btn_del = o;
+   elm_object_text_set(o, _("Del"));
+   elm_object_disabled_set(o, EINA_TRUE);
+   evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_smart_callback_add(o, "clicked", _cb_del, cfdata);
+   evas_object_show(o);
+   elm_table_pack(buttons, o, 0, 1, 1, 1);
+
+   o = elm_button_add(buttons);
+   cfdata->btn_up = o;
+   elm_object_text_set(o, _("Up"));
+   elm_object_disabled_set(o, EINA_TRUE);
+   evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_smart_callback_add(o, "clicked", _cb_up, cfdata);
+   evas_object_show(o);
+   elm_table_pack(buttons, o, 1, 0, 1, 1);
+
+   o = elm_button_add(buttons);
+   cfdata->btn_down = o;
+   elm_object_text_set(o, _("Down"));
+   elm_object_disabled_set(o, EINA_TRUE);
+   evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_smart_callback_add(o, "clicked", _cb_dn, cfdata);
+   evas_object_show(o);
+   elm_table_pack(buttons, o, 1, 1, 1, 1);
+
+   evas_object_size_hint_fill_set(buttons, EVAS_HINT_FILL, 0.5);
+   evas_object_show(buttons);
+   elm_box_pack_end(mainn, buttons);
+
+   elm_box_pack_end(mainn, buttons);
+   evas_object_show(buttons);
+
+   o = elm_separator_add(mainn);
+   elm_separator_horizontal_set(o, EINA_TRUE);
+   evas_object_size_hint_fill_set(o, EVAS_HINT_FILL, 0.5);
+   evas_object_show(o);
+   elm_box_pack_end(mainn, o);
+
+#define FRAME_ADD(name, list) \
+   do { \
+        frame = elm_frame_add(mainn); \
+        elm_object_text_set(frame, name); \
+        listh = elm_box_add(frame); \
+        elm_object_content_set(frame, listh); \
+        elm_box_layout_set(listh, evas_object_box_layout_flow_horizontal, \
+                           NULL, NULL); \
+        evas_object_size_hint_weight_set(listh, EVAS_HINT_EXPAND, 0.0); \
+        elm_box_pack_end(mainn, frame); \
+        evas_object_size_hint_fill_set(frame, EVAS_HINT_FILL, 0.5); \
+        evas_object_show(frame); \
+        evas_object_size_hint_weight_set(listh, EVAS_HINT_EXPAND, 0.0); \
+        evas_object_size_hint_align_set(listh, EVAS_HINT_FILL, 0.5); \
+        elm_box_align_set(listh, 0.0, 0.5); \
+        evas_object_event_callback_add(listh, EVAS_CALLBACK_DEL, \
+                                       _list_del, &list); \
+        list = listh; \
+   } while (0)
+
+
+   FRAME_ADD(_("Compose"), cfdata->compose_list);
+   FRAME_ADD(_("Third level"), cfdata->lv3_list);
+   FRAME_ADD(_("Switch layout"), cfdata->switch_list);
+
+   return mainn;
+}
+
+static Evas_Object *
+_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
+{
+   Evas_Object *mainn;
+
+   mainn = _config_basic_create(cfd, evas, cfdata);
+
+   /* Clear up any previous timer */
+   if (cfdata->fill_delay)
+     ecore_timer_del(cfdata->fill_delay);
 
-   cfdata->btn_down = e_widget_button_add(evas, _("Down"), "go-down", _cb_dn, 
cfdata, NULL);
-   e_widget_disabled_set(cfdata->btn_down, EINA_TRUE);
-   e_widget_table_object_append(buttons, cfdata->btn_down, 1, 0, 1, 1, 1, 1, 
1, 0);
+   /* Trigger the fill */
+   cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata);
 
-   cfdata->btn_add = e_widget_button_add(evas, _("Add"), "list-add", _cb_add, 
cfdata, NULL);
-   e_widget_table_object_append(buttons, cfdata->btn_add, 0, 1, 1, 1, 1, 1, 1, 
0);
+   return mainn;
+}
 
-   cfdata->btn_del = e_widget_button_add(evas, _("Remove"), "list-remove", 
_cb_del, cfdata, NULL);
-   e_widget_disabled_set(cfdata->btn_del, EINA_TRUE);
-   e_widget_table_object_append(buttons, cfdata->btn_del, 1, 1, 1, 1, 1, 1, 1, 
0);
 
-   e_widget_list_object_append(layoutss, buttons, 1, 0, 1);
+static Evas_Object *
+_advanced_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data 
*cfdata)
+{
+   Evas_Object *mainn;
+   Evas_Object *frame, *listh;
+   Evas_Object *sc;
+
+   sc = elm_scroller_add(cfd->dia->win);
+
+   mainn = _config_basic_create(cfd, evas, cfdata);
+
+   FRAME_ADD(_("Led"), cfdata->led_list);
+   FRAME_ADD(_("Control"), cfdata->ctrl_list);
+   FRAME_ADD(_("Keypad"), cfdata->keypad_list);
+   FRAME_ADD(_("Keypad delete key"), cfdata->delkeypad_list);
+   FRAME_ADD(_("Capslock"), cfdata->capslock_list);
+   FRAME_ADD(_("Alt win"), cfdata->altwin_list);
+   FRAME_ADD(_("Currency"), cfdata->currency_list);
+   FRAME_ADD(_("Fifth level"), cfdata->lv5_list);
+   FRAME_ADD(_("Spacebar"), cfdata->spacebar_list);
+   FRAME_ADD(_("Japan"), cfdata->japan_list);
+   FRAME_ADD(_("Korean"), cfdata->korean_list);
+   FRAME_ADD(_("Esperanto"), cfdata->esperanto_list);
+   FRAME_ADD(_("Solaris"), cfdata->solaris_list);
+   FRAME_ADD(_("Terminate X"), cfdata->terminate_list);
+   FRAME_ADD(_("Miscelaneous"), cfdata->misc_list);
+
+   elm_object_content_set(sc, mainn);
 
-   e_widget_toolbook_page_append(mainn, NULL, _("Configurations"), layoutss, 
1, 1, 1, 1, 0.5, 0.0);
+   /* Clear up any previous timer */
+   if (cfdata->fill_delay)
+     ecore_timer_del(cfdata->fill_delay);
 
-   /* Holds the default models */
-   modelss = e_widget_ilist_add(evas, 32, 32, &cfdata->default_model);
-   e_widget_size_min_set(modelss, 220, 160);
-   cfdata->dmodel_list = modelss;
+   /* Trigger the fill */
+   cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata);
 
-   e_widget_toolbook_page_append(mainn, NULL, _("Models"), modelss, 1, 1, 1, 
1, 0.5, 0.0);
+   return sc;
+}
 
-   /* Holds the options */
-   options = e_widget_list_add(evas, 0, 0);
+static void
+_model_item_clicked(void *data, Evas_Object *obj, void *event EINA_UNUSED)
+{
+   E_XKB_Model *model;
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(model = data)) return;
+
+   cfdata = evas_object_data_get(obj, "cfdata");
+
+   elm_object_text_set(cfdata->btn_layout, model->name);
+   eina_stringshare_replace(&cfdata->default_model, model->name);
+   evas_object_del(cfdata->popup);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
 
-   general = e_widget_framelist_add(evas, _("General"), 0);
-   dont_touch_my_damn_keyboard = e_widget_check_add(evas, _("Do not apply any 
keyboard settings ever"), &(cfdata->dont_touch_my_damn_keyboard));
-   e_widget_framelist_object_append(general, dont_touch_my_damn_keyboard);
-   only_label = e_widget_check_add(evas, _("Label only in gadgets"), 
&(cfdata->only_label));
-   e_widget_check_widget_disable_on_checked_add(dont_touch_my_damn_keyboard, 
only_label);
-   e_widget_framelist_object_append(general, only_label);
-   e_widget_list_object_append(options, general, 1, 1, 0.0);
+static void
+_layout_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event 
EINA_UNUSED)
+{
+   Evas_Object *popup, *fr, *vbx, *bx, *list, *o;
+   E_XKB_Model *model;
+   E_Config_Dialog_Data *cfdata;
+   Elm_Object_Item *it, *sel;
+   Eina_List *l;
 
-   lll = cfdata->cfg_options;
+   if (!(cfdata = data)) return;
 
-   EINA_LIST_FOREACH(optgroups, l, group)
+   popup = elm_popup_add(cfdata->cfd->dia->win);
+   elm_popup_allow_events_set(popup, EINA_FALSE);
+
+   fr = elm_frame_add(popup);
+   elm_object_text_set(fr, _("Default keyboard layout"));
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_object_content_set(popup, fr);
+   vbx = elm_box_add(fr);
+   elm_box_horizontal_set(vbx, EINA_FALSE);
+   elm_object_content_set(fr, vbx);
+
+   bx = elm_box_add(vbx);
+   elm_box_horizontal_set(bx, EINA_TRUE);
+   evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_box_pack_end(vbx, bx);
+
+   o = evas_object_rectangle_add(evas_object_evas_get(fr));
+   evas_object_size_hint_min_set(o, 0, 240);
+   elm_box_pack_end(bx, o);
+
+   list = elm_list_add(fr);
+   elm_list_mode_set(list, ELM_LIST_COMPRESS);
+   elm_box_pack_end(bx, list);
+   evas_object_data_set(list, "cfdata", cfdata);
+   evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   EINA_LIST_FOREACH(models, l, model)
      {
-        Evas_Object *grp;
+        it = elm_list_item_append(list, model->name, NULL, NULL,
+                                  _model_item_clicked, model);
+        if ((model->name == cfdata->default_model)
+            || ((!cfdata->default_model) && (!strcmp(model->name, "default"))))
+          sel = it;
+     }
+   if (sel)
+     elm_list_item_selected_set(sel, EINA_TRUE);
+   elm_list_go(list);
+
+   o = elm_button_add(vbx);
+   elm_object_text_set(o, _("Cancel"));
+   evas_object_smart_callback_add(o, "clicked", _popup_cancel_clicked, popup);
+   evas_object_show(o);
+   elm_box_pack_end(vbx, o);
+
+   evas_object_show(fr);
+   evas_object_show(vbx);
+   evas_object_show(bx);
+   evas_object_show(list);
+   evas_object_show(popup);
+   cfdata->popup = popup;
+}
 
-        grp = e_widget_framelist_add(evas, group->description, 0);
+static void
+_cb_add(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Config_Dialog_Data *cfdata;
+   if (!(cfdata = data)) return;
+
+   if (cfdata->dlg_add_new) elm_win_raise(cfdata->dlg_add_new->win);
+   else cfdata->dlg_add_new = _dlg_add_new(cfdata);
+}
 
-        EINA_LIST_FOREACH(group->options, ll, option)
+static void
+_cb_del(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Config_Dialog_Data *cfdata;
+   Elm_Object_Item *it;
+   E_Config_XKB_Layout *cl;
+
+   if (!(cfdata = data)) return;
+
+   it = elm_list_selected_item_get(cfdata->used_list);
+   if (!it) return;
+   cl = elm_object_item_data_get(it);
+   elm_object_item_del(it);
+   if (!cl) return;
+   cfdata->cfg_layouts = eina_list_remove(cfdata->cfg_layouts, cl);
+   it = elm_list_first_item_get(cfdata->used_list);
+   if (it)
+     elm_list_item_selected_set(it, EINA_TRUE);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_popup_cancel_clicked(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   evas_object_del(data);
+}
+
+static void
+_popup_item_clicked(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Eina_List **cfg_opts;
+   E_Config_Dialog_Data *cfdata;
+
+   cfg_opts = evas_object_data_get(obj, "cfg_opts");
+   cfdata = evas_object_data_get(obj, "cfdata");
+
+   *cfg_opts = eina_list_append((*cfg_opts), data);
+   evas_object_del(cfdata->popup);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+
+   _basic_create_fill(cfdata);
+}
+
+static Evas_Object *
+_popup_item_tooltip(void *data, Evas_Object *obj, Evas_Object *tooltip, void 
*item)
+{
+   E_XKB_Option *option;
+   Evas_Object *o;
+
+   if (!(option = data)) return NULL;
+   o = elm_label_add(tooltip);
+   elm_object_text_set(o, option->description);
+   elm_label_line_wrap_set(o, ELM_WRAP_WORD);
+
+   return o;
+}
+
+static void
+_popup_add(const char *title, E_Config_Dialog_Data *cfdata, Eina_List *opts, 
Eina_List **cfg_opts, Evas_Object *list_objects)
+{
+   Evas_Object *popup, *fr, *vbx, *bx, *list, *o;
+   E_XKB_Option *option, *op;
+   Eina_List *l, *ll;
+   Eina_Bool found;
+   Elm_Object_Item *it;
+
+   popup = elm_popup_add(cfdata->cfd->dia->win);
+   elm_popup_allow_events_set(popup, EINA_FALSE);
+
+   fr = elm_frame_add(popup);
+   elm_object_text_set(fr, title);
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_object_content_set(popup, fr);
+   vbx = elm_box_add(fr);
+   elm_box_horizontal_set(vbx, EINA_FALSE);
+   elm_object_content_set(fr, vbx);
+
+   bx = elm_box_add(vbx);
+   elm_box_horizontal_set(bx, EINA_TRUE);
+   elm_box_pack_end(vbx, bx);
+
+   o = evas_object_rectangle_add(evas_object_evas_get(fr));
+   evas_object_size_hint_min_set(o, 0, 240);
+   elm_box_pack_end(bx, o);
+
+   list = elm_list_add(fr);
+   elm_list_mode_set(list, ELM_LIST_COMPRESS);
+   elm_box_pack_end(bx, list);
+   evas_object_data_set(list, "cfg_opts", cfg_opts);
+   evas_object_data_set(list, "cfdata", cfdata);
+
+   EINA_LIST_FOREACH(opts, l, option)
+     {
+        found = EINA_FALSE;
+        EINA_LIST_FOREACH(*cfg_opts, ll, op)
+          {
+             if (op == option)
+               found = EINA_TRUE;
+          }
+        if (!found)
           {
-             Evas_Object *chk;
-
-             chk = e_widget_check_add(evas, option->description,
-                                     &(((E_XKB_Dialog_Option *)
-                                        eina_list_data_get(lll))->enabled));
-             
e_widget_check_widget_disable_on_checked_add(dont_touch_my_damn_keyboard, chk);
-             e_widget_framelist_object_append(grp, chk);
-             lll = eina_list_next(lll);
+             it = elm_list_item_append(list, option->description, NULL, NULL,
+                                       _popup_item_clicked, option);
+             elm_object_item_tooltip_content_cb_set(it, _popup_item_tooltip,
+                                                    option, NULL);
           }
-        e_widget_list_object_append(options, grp, 1, 1, 0.0);
      }
+   o = elm_button_add(vbx);
+   elm_object_text_set(o, _("Cancel"));
+   evas_object_smart_callback_add(o, "clicked", _popup_cancel_clicked, popup);
+   elm_box_pack_end(vbx, o);
+   evas_object_size_hint_weight_set(vbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(vbx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(vbx);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(bx);
+   evas_object_show(o);
+   evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(list);
+   evas_object_size_hint_weight_set(fr, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(fr, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(fr);
+   evas_object_show(popup);
+   cfdata->popup = popup;
+}
 
-   e_widget_size_min_get(options, &mw, &mh);
+static void
+_cb_compose_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
 
-   if (mw < 220) mw = 220;
-   if (mh < 160) mh = 160;
+   if (!(cfdata = data)) return;
 
-   evas_object_size_hint_min_set(options, mw, mh);
-   E_EXPAND(options);
-   E_FILL(options);
+   _popup_add(_("Compose"), cfdata, optcompose,
+              &cfdata->cfg_compose_options, cfdata->compose_list);
+}
 
-   scroller = elm_scroller_add(e_win_evas_win_get(evas));
-   E_EXPAND(scroller);
-   E_FILL(scroller);
-   elm_scroller_bounce_set(scroller, 0, 0);
-   elm_object_content_set(scroller, options);
-   e_widget_sub_object_add(mainn, options);
+static void
+_cb_lv3_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
 
-   e_widget_toolbook_page_append(mainn, NULL, _("Options"), scroller, 1, 1, 1, 
1, 0.5, 0.0);
+   if (!(cfdata = data)) return;
 
-   /* Display the first page by default */
-   e_widget_toolbook_page_show(mainn, 0);
+   _popup_add(_("Third level"), cfdata, optlv3,
+              &cfdata->cfg_lv3_options, cfdata->lv3_list);
+}
 
-   /* The main evas */
-   cfdata->evas = evas;
+static void
+_cb_switch_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
 
-   /* Clear up any previous timer */
-   if (cfdata->fill_delay)
-     ecore_timer_del(cfdata->fill_delay);
+   if (!(cfdata = data)) return;
 
-   /* Trigger the fill */
-   cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata);
+   _popup_add(_("Switch Layout"), cfdata, optswitch,
+              &cfdata->cfg_switch_options, cfdata->switch_list);
+}
 
-   return mainn;
+static void
+_cb_led_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   _popup_add(_("Led"), cfdata, optled,
+              &cfdata->cfg_led_options, cfdata->led_list);
 }
 
+
 static void
-_cb_add(void *data, void *data2 EINA_UNUSED)
+_cb_ctrl_up(void *data, Evas_Object *obj, void *event)
 {
    E_Config_Dialog_Data *cfdata;
+
    if (!(cfdata = data)) return;
 
-   e_config_dialog_changed_set(cfdata->cfd, 1);
-   if (cfdata->dlg_add_new) elm_win_raise(cfdata->dlg_add_new->win);
-   else cfdata->dlg_add_new = _dlg_add_new(cfdata);
+   _popup_add(_("Switch Layout"), cfdata, optswitch,
+              &cfdata->cfg_ctrl_options, cfdata->ctrl_list);
 }
 
 static void
-_cb_del(void *data, void *data2 EINA_UNUSED)
+_cb_keypad_up(void *data, Evas_Object *obj, void *event)
 {
    E_Config_Dialog_Data *cfdata;
-   int n = 0;
 
    if (!(cfdata = data)) return;
-   if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
 
-   e_config_dialog_changed_set(cfdata->cfd, 1);
-   cfdata->cfg_layouts = eina_list_remove_list(cfdata->cfg_layouts, 
eina_list_nth_list(cfdata->cfg_layouts, n));
+   _popup_add(_("Keypad"), cfdata, optkeypad,
+              &cfdata->cfg_keypad_options, cfdata->keypad_list);
+}
 
-   /* Update the list */
-   evas_event_freeze(cfdata->evas);
-   edje_freeze();
-   e_widget_ilist_freeze(cfdata->used_list);
-   e_widget_ilist_remove_num(cfdata->used_list, n);
-   e_widget_ilist_go(cfdata->used_list);
-   e_widget_ilist_thaw(cfdata->used_list);
-   edje_thaw();
-   evas_event_thaw(cfdata->evas);
+
+static void
+_cb_delkeypad_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   _popup_add(_("Keypad delete key"), cfdata, optdelkeypad,
+              &cfdata->cfg_delkeypad_options, cfdata->delkeypad_list);
 }
 
 static void
-_cb_up(void *data, void *data2 EINA_UNUSED)
+_cb_capslock_up(void *data, Evas_Object *obj, void *event)
 {
    E_Config_Dialog_Data *cfdata;
-   void *nddata;
-   Evas_Object *ic;
-   Eina_List *l;
-   const char *lbl, *file;
-   int n;
 
    if (!(cfdata = data)) return;
-   if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
 
-   l = eina_list_nth_list(cfdata->cfg_layouts, n);
+   _popup_add(_("Capslock"), cfdata, optcapslock,
+              &cfdata->cfg_capslock_options, cfdata->capslock_list);
+}
 
-   nddata = eina_list_data_get(eina_list_prev(l));
-   eina_list_data_set(eina_list_prev(l), eina_list_data_get(l));
-   eina_list_data_set(l, nddata);
+static void
+_cb_altwin_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
 
-   /* Update the list */
+   if (!(cfdata = data)) return;
 
-   evas_event_freeze(cfdata->evas);
-   edje_freeze();
-   e_widget_ilist_freeze(cfdata->used_list);
+   _popup_add(_("Alternate win key"), cfdata, optaltwin,
+              &cfdata->cfg_altwin_options, cfdata->altwin_list);
+}
 
-   ic = e_icon_add(cfdata->evas);
-   e_icon_file_get(e_widget_ilist_nth_icon_get(cfdata->used_list, n), &file, 
NULL);
-   e_icon_file_set(ic, file);
-   lbl = e_widget_ilist_nth_label_get(cfdata->used_list, n);
-   e_widget_ilist_prepend_relative_full(cfdata->used_list, ic, NULL, lbl, 
_cb_used_select, cfdata, NULL, (n - 1));
-   e_widget_ilist_remove_num(cfdata->used_list, n);
+static void
+_cb_currency_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
 
-   e_widget_ilist_go(cfdata->used_list);
-   e_widget_ilist_thaw(cfdata->used_list);
-   edje_thaw();
-   evas_event_thaw(cfdata->evas);
+   if (!(cfdata = data)) return;
 
-   e_widget_ilist_selected_set(cfdata->used_list, (n - 1));
+   _popup_add(_("Currency"), cfdata, optcurrency,
+              &cfdata->cfg_currency_options, cfdata->currency_list);
 }
 
 static void
-_cb_dn(void *data, void *data2 EINA_UNUSED)
+_cb_lv5_up(void *data, Evas_Object *obj, void *event)
 {
    E_Config_Dialog_Data *cfdata;
-   void *nddata;
-   Evas_Object *ic;
-   Eina_List *l;
-   const char *lbl, *file;
-   int n;
 
    if (!(cfdata = data)) return;
-   if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
 
-   l = eina_list_nth_list(cfdata->cfg_layouts, n);
+   _popup_add(_("Fifth level"), cfdata, optlv5,
+              &cfdata->cfg_lv5_options, cfdata->lv5_list);
+}
 
-   nddata = eina_list_data_get(eina_list_next(l));
-   eina_list_data_set(eina_list_next(l), eina_list_data_get(l));
-   eina_list_data_set(l, nddata);
+static void
+_cb_spacebar_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
 
-   /* Update the list */
+   if (!(cfdata = data)) return;
 
-   evas_event_freeze(cfdata->evas);
-   edje_freeze();
-   e_widget_ilist_freeze(cfdata->used_list);
+   _popup_add(_("Spacebar"), cfdata, optspacebar,
+              &cfdata->cfg_spacebar_options, cfdata->spacebar_list);
+}
 
-   ic = e_icon_add(cfdata->evas);
-   e_icon_file_get(e_widget_ilist_nth_icon_get(cfdata->used_list, n), &file, 
NULL);
-   e_icon_file_set(ic, file);
-   lbl = e_widget_ilist_nth_label_get(cfdata->used_list, n);
-   e_widget_ilist_append_relative_full(cfdata->used_list, ic, NULL, lbl, 
_cb_used_select, cfdata, NULL, n);
-   e_widget_ilist_remove_num(cfdata->used_list, n);
+static void
+_cb_japan_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
 
-   e_widget_ilist_go(cfdata->used_list);
-   e_widget_ilist_thaw(cfdata->used_list);
-   edje_thaw();
-   evas_event_thaw(cfdata->evas);
+   if (!(cfdata = data)) return;
+
+   _popup_add(_("Japan"), cfdata, optjapan,
+              &cfdata->cfg_japan_options, cfdata->japan_list);
+}
+
+static void
+_cb_korean_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   _popup_add(_("Korean"), cfdata, optkorean,
+              &cfdata->cfg_korean_options, cfdata->korean_list);
+}
+
+static void
+_cb_esperanto_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   _popup_add(_("Esperanto"), cfdata, optesperanto,
+              &cfdata->cfg_esperanto_options, cfdata->esperanto_list);
+}
+
+static void
+_cb_solaris_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   _popup_add(_("Solaris"), cfdata, optsolaris,
+              &cfdata->cfg_solaris_options, cfdata->solaris_list);
+}
+
+static void
+_cb_terminate_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
 
-   e_widget_ilist_selected_set(cfdata->used_list, (n + 1));
+   _popup_add(_("Terminate X"), cfdata, optterminate,
+              &cfdata->cfg_terminate_options, cfdata->terminate_list);
+}
+
+static void
+_cb_misc_up(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   _popup_add(_("Miscelaneous"), cfdata, optmisc,
+              &cfdata->cfg_misc_options, cfdata->misc_list);
+}
+
+
+static void
+_dont_touch_my_damn_keyboard_changed(void *data, Evas_Object *obj, void *event 
EINA_UNUSED)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   cfdata->dont_touch_my_damn_keyboard = elm_check_state_get(obj);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+
+   _basic_create_fill(cfdata);
+}
+
+static void
+_only_label_changed(void *data, Evas_Object *obj, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+
+   if (!(cfdata = data)) return;
+
+   cfdata->only_label = elm_check_state_get(obj);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_cb_up(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Config_Dialog_Data *cfdata;
+   Elm_Object_Item *it, *prev;
+   E_Config_XKB_Layout *cl;
+   Eina_List *l, *ll;
+   void *ndata;
+
+   if (!(cfdata = data)) return;
+
+   it = elm_list_selected_item_get(cfdata->used_list);
+   if (!it) return;
+   prev = elm_list_item_prev(it);
+   if ((!prev) || (prev == it)) return;
+   ndata = elm_object_item_data_get(it);
+   EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
+     {
+        if (cl == ndata)
+          {
+             ll = eina_list_prev(l);
+             eina_list_data_set(l, eina_list_data_get(ll));
+             eina_list_data_set(ll, ndata);
+             break;
+          }
+     }
+   if (!l) return;
+   prev = elm_list_item_insert_before(cfdata->used_list, prev,
+                                      elm_object_item_text_get(it),
+                                      NULL, NULL, NULL,
+                                      ndata);
+   elm_object_item_del(it);
+   elm_list_item_selected_set(prev, EINA_TRUE);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
+}
+
+static void
+_cb_dn(void *data, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Config_Dialog_Data *cfdata;
+   Elm_Object_Item *it, *next;
+   E_Config_XKB_Layout *cl;
+   Eina_List *l, *ll;
+   void *ndata;
+
+   if (!(cfdata = data)) return;
+
+   it = elm_list_selected_item_get(cfdata->used_list);
+   if (!it) return;
+   next = elm_list_item_next(it);
+   if ((!next) || (next == it)) return;
+   ndata = elm_object_item_data_get(it);
+   EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
+     {
+        if (cl == ndata)
+          {
+             ll = eina_list_next(l);
+             if (!ll) return;
+             eina_list_data_set(l, eina_list_data_get(ll));
+             eina_list_data_set(ll, ndata);
+             break;
+          }
+     }
+   if (!l) return;
+   next = elm_list_item_insert_after(cfdata->used_list, next,
+                                     elm_object_item_text_get(it),
+                                     NULL, NULL, NULL,
+                                     elm_object_item_data_get(it));
+   elm_object_item_del(it);
+   elm_list_item_selected_set(next, EINA_TRUE);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
 }
 
 static E_Dialog *
@@ -546,7 +1324,7 @@ _dlg_add_new(E_Config_Dialog_Data *cfdata)
 
    e_dialog_resizable_set(dlg, 1);
    dlg->data = cfdata;
-   
+
    e_object_del_attach_func_set(E_OBJECT(dlg), _dlg_add_cb_del);
    elm_win_center(dlg->win, 1, 1);
 
@@ -602,7 +1380,7 @@ _dlg_add_cb_ok(void *data EINA_UNUSED, E_Dialog *dlg)
 {
    E_Config_Dialog_Data *cfdata = dlg->data;
    E_Config_XKB_Layout *cl;
-   char buf[4096];
+   char buf[PATH_MAX], icon_buf[PATH_MAX];
    Evas_Object *ic;
    /* Configuration information */
    Eina_Stringshare *layout, *model, *variant;
@@ -620,26 +1398,17 @@ _dlg_add_cb_ok(void *data EINA_UNUSED, E_Dialog *dlg)
    cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, cl);
 
    /* Update the main list */
-   evas_event_freeze(cfdata->evas);
-   edje_freeze();
-   e_widget_ilist_freeze(cfdata->used_list);
-
-   ic = e_icon_add(cfdata->evas);
-
-   e_xkb_e_icon_flag_setup(ic, cl->name);
+   ic = elm_icon_add(cfdata->used_list);
+   e_xkb_flag_file_get(icon_buf, sizeof(icon_buf), cl->name);
+   elm_image_file_set(ic, icon_buf, NULL);
    snprintf(buf, sizeof(buf), "%s (%s, %s)",
             cl->name, cl->model, cl->variant);
-   e_widget_ilist_append_full(cfdata->used_list, ic, NULL, buf,
-                              _cb_used_select, cfdata, NULL);
-
-   e_widget_ilist_go(cfdata->used_list);
-   e_widget_ilist_thaw(cfdata->used_list);
-   edje_thaw();
-   evas_event_thaw(cfdata->evas);
+   elm_list_item_append(cfdata->used_list, buf, ic, NULL, NULL, cl);
+   elm_list_go(cfdata->used_list);
 
    cfdata->dlg_add_new = NULL;
    e_object_del(E_OBJECT(dlg));
-   e_config_dialog_changed_set(cfdata->cfd, 1);
+   e_config_dialog_changed_set(cfdata->cfd, _check_changed(cfdata));
 }
 
 static void
@@ -665,6 +1434,9 @@ _cb_dlg_fill_delay(void *data)
    Eina_List *l;
    E_XKB_Layout *layout;
    char buf[4096];
+   const char *lang;
+   E_Locale_Parts *lang_part = NULL;
+   int i = 0, sel = 0;;
 
    if (!(cfdata = data)) return ECORE_CALLBACK_RENEW;
 
@@ -675,6 +1447,12 @@ _cb_dlg_fill_delay(void *data)
    e_widget_ilist_freeze(cfdata->layout_list);
    e_widget_ilist_clear(cfdata->layout_list);
 
+   lang = e_intl_language_get();
+   if (lang)
+   {
+      lang_part = e_intl_locale_parts_get(lang);
+   }
+
    EINA_LIST_FOREACH(layouts, l, layout)
      {
         Evas_Object *ic;
@@ -685,7 +1463,14 @@ _cb_dlg_fill_delay(void *data)
                  layout->description, layout->name);
         e_widget_ilist_append_full(cfdata->layout_list, ic, NULL, buf,
                                    _cb_layout_select, cfdata, layout->name);
+        if (lang_part)
+          {
+             if (!strncasecmp(lang_part->region, layout->name, 2))
+               sel = i;
+          }
+        ++i;
      }
+   if (lang_part) e_intl_locale_parts_free(lang_part);
 
    e_widget_ilist_go(cfdata->layout_list);
    e_widget_ilist_thaw(cfdata->layout_list);
@@ -693,6 +1478,8 @@ _cb_dlg_fill_delay(void *data)
    edje_thaw();
    evas_event_thaw(cfdata->dlg_evas);
 
+   e_widget_ilist_selected_set(cfdata->layout_list, sel);
+
    cfdata->dlg_fill_delay = NULL;
    return ECORE_CALLBACK_CANCEL;
 }
@@ -766,90 +1553,47 @@ static Eina_Bool
 _cb_fill_delay(void *data)
 {
    E_Config_Dialog_Data *cfdata;
-   Eina_List *l;
-   E_Config_XKB_Layout *cl;
-   E_XKB_Model *model;
-   int n = 0;
-   char buf[4096];
 
    if (!(cfdata = data)) return ECORE_CALLBACK_RENEW;
 
-   /* Update the list of used layouts */
-   evas_event_freeze(cfdata->evas);
-   edje_freeze();
-
-   e_widget_ilist_freeze(cfdata->used_list);
-   e_widget_ilist_clear(cfdata->used_list);
-
-   EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl)
-     {
-        Evas_Object *ic = e_icon_add(cfdata->evas);
-        const char *name = cl->name;
-
-        e_xkb_e_icon_flag_setup(ic, name);
-        snprintf(buf, sizeof(buf), "%s (%s, %s)",
-                 cl->name, cl->model, cl->variant);
-        e_widget_ilist_append_full(cfdata->used_list, ic, NULL, buf,
-                                   _cb_used_select, cfdata, NULL);
-     }
-
-   e_widget_ilist_go(cfdata->used_list);
-   e_widget_ilist_thaw(cfdata->used_list);
-
-   e_widget_ilist_freeze(cfdata->dmodel_list);
-   e_widget_ilist_clear(cfdata->dmodel_list);
-
-   /* Update the global model list */
-   EINA_LIST_FOREACH(models, l, model)
-     {
-        snprintf(buf, sizeof(buf), "%s (%s)", model->description, model->name);
-        e_widget_ilist_append(cfdata->dmodel_list, NULL, buf, NULL,
-                              cfdata, model->name);
-        if (model->name == e_config->xkb.default_model)
-          e_widget_ilist_selected_set(cfdata->dmodel_list, n);
-        n++;
-     }
-
-   e_widget_ilist_go(cfdata->dmodel_list);
-   e_widget_ilist_thaw(cfdata->dmodel_list);
-   edje_thaw();
-   evas_event_thaw(cfdata->evas);
+   _basic_create_fill(cfdata);
 
    cfdata->fill_delay = NULL;
    return ECORE_CALLBACK_CANCEL;
 }
 
 static void
-_cb_used_select(void *data)
+_cb_used_select(void *data, Evas_Object *obj EINA_UNUSED, void *event 
EINA_UNUSED)
 {
    E_Config_Dialog_Data *cfdata;
-   int n, c;
+   Elm_Widget_Item *it, *first, *last;
+   E_Config_XKB_Layout *cl;
 
    if (!(cfdata = data)) return;
-   if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return;
 
-   c = e_widget_ilist_count(cfdata->used_list);
-   e_widget_disabled_set(cfdata->btn_del, EINA_FALSE);
+   it = elm_list_selected_item_get(cfdata->used_list);
+   first = elm_list_first_item_get(cfdata->used_list);
+   last = elm_list_last_item_get(cfdata->used_list);
 
-   if (c == 1)
-     {
-        e_widget_disabled_set(cfdata->btn_up, EINA_TRUE);
-        e_widget_disabled_set(cfdata->btn_down, EINA_TRUE);
-     }
-   else if (n == (c - 1))
-     {
-        e_widget_disabled_set(cfdata->btn_up, EINA_FALSE);
-        e_widget_disabled_set(cfdata->btn_down, EINA_TRUE);
-     }
-   else if (n == 0)
+   if (!it) return;
+   cl = elm_object_item_data_get(it);
+   if (!cl) return;
+   elm_object_disabled_set(cfdata->btn_del, EINA_FALSE);
+   if (first == last)
      {
-        e_widget_disabled_set(cfdata->btn_up, EINA_TRUE);
-        e_widget_disabled_set(cfdata->btn_down, EINA_FALSE);
+        elm_object_disabled_set(cfdata->btn_up, EINA_TRUE);
+        elm_object_disabled_set(cfdata->btn_down, EINA_TRUE);
      }
    else
      {
-        e_widget_disabled_set(cfdata->btn_up, EINA_FALSE);
-        e_widget_disabled_set(cfdata->btn_down, EINA_FALSE);
+        if (it == first)
+          elm_object_disabled_set(cfdata->btn_up, EINA_TRUE);
+        else
+          elm_object_disabled_set(cfdata->btn_up, EINA_FALSE);
+        if (it == last)
+          elm_object_disabled_set(cfdata->btn_down, EINA_TRUE);
+        else
+          elm_object_disabled_set(cfdata->btn_down, EINA_FALSE);
      }
 }
 
diff --git a/src/modules/xkbswitch/e_mod_main.c 
b/src/modules/xkbswitch/e_mod_main.c
index ec21057..e59f00c 100644
--- a/src/modules/xkbswitch/e_mod_main.c
+++ b/src/modules/xkbswitch/e_mod_main.c
@@ -279,21 +279,6 @@ _xkb_changed_state(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *event EIN
    return ECORE_CALLBACK_PASS_ON;
 }
 
-#if 0
-static int
-_xkb_menu_items_sort(const void *data1, const void *data2)
-{
-   const E_Config_XKB_Layout *cl1 = data1;
-   const E_Config_XKB_Layout *cl2 = data2;
-   int v;
-
-   v = strcmp(cl1->name, cl2->name);
-   if (!v) v = strcmp(cl1->model, cl2->model);
-   if (!v) v = strcmp(cl1->variant, cl2->variant);
-   return v;
-}
-
-#endif
 static void
 _e_xkb_cb_mouse_down(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event)
 {
diff --git a/src/modules/xkbswitch/e_mod_parse.c 
b/src/modules/xkbswitch/e_mod_parse.c
index 5134144..e309e45 100644
--- a/src/modules/xkbswitch/e_mod_parse.c
+++ b/src/modules/xkbswitch/e_mod_parse.c
@@ -1,10 +1,57 @@
 #include "e.h"
 #include "e_mod_parse.h"
 
+typedef struct Config_Parse_Label_ {
+   const char *name;
+   Eina_List **list;
+} Config_Parse_Label;
+
 Eina_List *layouts = NULL;
 Eina_List *models = NULL;
+
 Eina_List *optgroups = NULL;
 
+Eina_List *optled = NULL;
+Eina_List *optswitch = NULL;
+Eina_List *optlv3 = NULL;
+Eina_List *optctrl = NULL;
+Eina_List *optkeypad = NULL;
+Eina_List *optdelkeypad = NULL;
+Eina_List *optcapslock = NULL;
+Eina_List *optaltwin = NULL;
+Eina_List *optcompose = NULL;
+Eina_List *optcurrency = NULL;
+Eina_List *optlv5 = NULL;
+Eina_List *optspacebar = NULL;
+Eina_List *optjapan = NULL;
+Eina_List *optkorean = NULL;
+Eina_List *optesperanto = NULL;
+Eina_List *optsolaris = NULL;
+Eina_List *optterminate = NULL;
+Eina_List *optmisc = NULL;
+
+static Config_Parse_Label grplabels[] = {
+{ "grp_led", &optled },
+{ "grp", &optswitch },
+{ "lv3", &optlv3 },
+{ "ctrl", &optctrl },
+{ "keypad", &optkeypad },
+{ "kpdl", &optdelkeypad },
+{ "caps", &optcapslock },
+{ "altwin", &optaltwin },
+{ "compose", &optcompose },
+{ "currencysign", &optcurrency },
+{ "eurosign", &optcurrency },
+{ "rupeesign", &optcurrency },
+{ "lv5", &optlv5 },
+{ "nbsp", &optspacebar },
+{ "jap", &optjapan },
+{ "korean", &optkorean },
+{ "esperanto", &optesperanto },
+{ "solaris", &optsolaris },
+{ "terminate", &optterminate }
+};
+
 static const char *rules_file = NULL;
 
 static int layout_sort_cb(const void *data1, const void *data2);
@@ -54,8 +101,8 @@ parse_rules(void)
    E_XKB_Layout *layout = NULL;
    E_XKB_Option *option = NULL;
    E_XKB_Variant *variant = NULL;
-   E_XKB_Option_Group *group = NULL;
    FILE *f;
+   int i;
 
    if (!rules_file) return 0;
 
@@ -211,7 +258,7 @@ parse_rules(void)
      {
         if (fgets(buf, sizeof(buf), f))
           {
-             char *n, *p, *t, *tmp, *name, *txt;
+             char *n, *p, *tmp, *name, *txt;
 
              n = strchr(buf, '\n');
              if (n) *n = '\0';
@@ -226,41 +273,25 @@ parse_rules(void)
              while (p[0] == ' ')
                ++p;
 
-             /* skip "grp" options for switching kbd layouts */
-             //if (strncmp(name, "grp", 3))
-             {
-                if (!strchr(name, ':'))
-                  {
-                     group = E_NEW(E_XKB_Option_Group, 1);
-
-                     /* A hack to get it to parse right if
-                      * the group name contains a space
-                      */
-                     t = strstr(p, "  ");
-                     if (t)
-                       {
-                          while (t[0] == ' ')
-                            ++t;
-                          p = t;
-                       }
-
-                     txt = evas_textblock_text_markup_to_utf8(NULL, p);
-                     group->description = eina_stringshare_add(txt);
-                     E_FREE(txt);
-
-                     optgroups = eina_list_append(optgroups, group);
-                  }
-                else if (group)
-                  {
-                     option = E_NEW(E_XKB_Option, 1);
-                     option->name = eina_stringshare_add(name);
-                     txt = evas_textblock_text_markup_to_utf8(NULL, p);
-                     option->description = eina_stringshare_add(txt);
-                     E_FREE(txt);
-                     group->options = eina_list_append(group->options,
-                                                       option);
-                  }
-             }
+             if (strchr(name, ':'))
+               {
+                  option = E_NEW(E_XKB_Option, 1);
+                  option->name = eina_stringshare_add(name);
+                  txt = evas_textblock_text_markup_to_utf8(NULL, p);
+                  option->description = eina_stringshare_add(txt);
+                  E_FREE(txt);
+                  for (i = 0; i < (sizeof(grplabels) / sizeof(grplabels[0])); 
++i)
+                    {
+                       if (!strncasecmp(name, grplabels[i].name, 
(strlen(grplabels[i].name))))
+                         {
+                            *(grplabels[i].list) = 
eina_list_append(*(grplabels[i].list), option);
+                            break;
+                         }
+                    }
+                  if (i < (sizeof(grplabels) / sizeof(grplabels[0]))) continue;
+                  optmisc = eina_list_append(optmisc, option);
+               }
+             else continue;
 
              free(tmp);
           }
@@ -277,10 +308,20 @@ err:
    return 1;
 }
 
+static void
+_free_option(E_XKB_Option *o)
+{
+   eina_stringshare_del(o->name);
+   eina_stringshare_del(o->description);
+
+   E_FREE(o);
+}
+
+
+
 void
 clear_rules(void)
 {
-   E_XKB_Option_Group *og;
    E_XKB_Variant *v;
    E_XKB_Option *o;
    E_XKB_Layout *la;
@@ -310,20 +351,23 @@ clear_rules(void)
         E_FREE(m);
      }
 
-   EINA_LIST_FREE(optgroups, og)
-     {
-        eina_stringshare_del(og->description);
-
-        EINA_LIST_FREE(og->options, o)
-          {
-             eina_stringshare_del(o->name);
-             eina_stringshare_del(o->description);
-
-             E_FREE(o);
-          }
-
-        E_FREE(og);
-     }
+   EINA_LIST_FREE(optled, o) _free_option(o);
+   EINA_LIST_FREE(optswitch, o) _free_option(o);
+   EINA_LIST_FREE(optlv3, o) _free_option(o);
+   EINA_LIST_FREE(optctrl, o) _free_option(o);
+   EINA_LIST_FREE(optkeypad, o) _free_option(o);
+   EINA_LIST_FREE(optdelkeypad, o) _free_option(o);
+   EINA_LIST_FREE(optcapslock, o) _free_option(o);
+   EINA_LIST_FREE(optaltwin, o) _free_option(o);
+   EINA_LIST_FREE(optcompose, o) _free_option(o);
+   EINA_LIST_FREE(optcurrency, o) _free_option(o);
+   EINA_LIST_FREE(optlv5, o) _free_option(o);
+   EINA_LIST_FREE(optspacebar, o) _free_option(o);
+   EINA_LIST_FREE(optjapan, o) _free_option(o);
+   EINA_LIST_FREE(optkorean, o) _free_option(o);
+   EINA_LIST_FREE(optesperanto, o) _free_option(o);
+   EINA_LIST_FREE(optsolaris, o) _free_option(o);
+   EINA_LIST_FREE(optterminate, o) _free_option(o);
 
    optgroups = NULL;
    layouts = NULL;
diff --git a/src/modules/xkbswitch/e_mod_parse.h 
b/src/modules/xkbswitch/e_mod_parse.h
index e0ce201..f5624cc 100644
--- a/src/modules/xkbswitch/e_mod_parse.h
+++ b/src/modules/xkbswitch/e_mod_parse.h
@@ -26,12 +26,6 @@ typedef struct _E_XKB_Layout
    Eina_List  *variants;
 } E_XKB_Layout;
 
-typedef struct _E_XKB_Option_Group
-{
-   const char *description;
-   Eina_List  *options;
-} E_XKB_Option_Group;
-
 typedef struct _E_XKB_Option
 {
    const char *name;
@@ -46,6 +40,25 @@ int  layout_sort_by_name_cb(const void *data1, const void 
*data2);
 
 extern Eina_List *models;
 extern Eina_List *layouts;
-extern Eina_List *optgroups;
+
+extern Eina_List *optled;
+extern Eina_List *optswitch;
+extern Eina_List *optlv3;
+extern Eina_List *optctrl;
+extern Eina_List *optkeypad;
+extern Eina_List *optdelkeypad;
+extern Eina_List *optcapslock;
+extern Eina_List *optaltwin;
+extern Eina_List *optcompose;
+extern Eina_List *optcurrency;
+extern Eina_List *optlv5;
+extern Eina_List *optspacebar;
+extern Eina_List *optjapan;
+extern Eina_List *optkorean;
+extern Eina_List *optesperanto;
+extern Eina_List *optsolaris;
+extern Eina_List *optterminate;
+extern Eina_List *optmisc;
+
 
 #endif

-- 


Reply via email to