* some code refactoring
authorsndev <sndev>
Mon, 23 Oct 2006 20:43:11 +0000 (20:43 +0000)
committersndev <sndev@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 23 Oct 2006 20:43:11 +0000 (20:43 +0000)
* make mouse binding dialog to use the same action list as in key binding dialog.

SVN revision: 26761

src/bin/e_actions.c
src/bin/e_int_config_keybindings.c
src/bin/e_int_config_mousebindings.c

index fc0df17..bb98536 100644 (file)
@@ -1755,6 +1755,8 @@ e_actions_init(void)
    E_Action *act;
 
    ACT_GO(window_move);
+   e_action_predef_name_set(_("Window : Actions"), _("Move"), "window_move", NULL, NULL, 0);
+
    ACT_GO_MOUSE(window_move);
    ACT_GO_SIGNAL(window_move);
    ACT_END(window_move);
@@ -1762,6 +1764,8 @@ e_actions_init(void)
    
    /* window_resize */
    ACT_GO(window_resize);
+   e_action_predef_name_set(_("Window : Actions"), _("Resize"), "window_resize", NULL, NULL, 0);
+
    ACT_GO_MOUSE(window_resize);
    ACT_GO_SIGNAL(window_resize);
    ACT_END(window_resize);
index b3a37d7..0c34da9 100644 (file)
@@ -33,7 +33,7 @@ static void _modify_key_binding_cb(void *data, void *data2);
 /********* Helper *************************/
 static char *_key_binding_text_get(E_Config_Binding_Key *bi);
 static void _auto_apply_changes(E_Config_Dialog_Data *cfdata);
-static void _find_key_binding_action(E_Config_Binding_Key *bi, int *g, int *a, int *n);
+static void _find_key_binding_action(const char *action, const char *params, int *g, int *a, int *n);
 
 /********* Sorting ************************/
 static int _key_binding_sort_cb(void *d1, void *d2);
@@ -290,6 +290,7 @@ _fill_actions_list(E_Config_Dialog_Data *cfdata)
    E_Action_Description *actd;
    int g, a;
 
+   e_widget_ilist_clear(cfdata->gui.o_action_list);
    for (l = e_action_groups_get(), g = 0; l; l = l->next, g++)
      {
        actg = l->data;
@@ -364,7 +365,6 @@ _action_change_cb(void *data)
 
    cfdata = data;
    _update_action_params(cfdata);
-
 }
 
 static void
@@ -637,6 +637,7 @@ _update_action_list(E_Config_Dialog_Data *cfdata)
    E_Action_Description *actd;
    Evas_List *l, *l2;
    int j = -1, i, n;
+   const char *action, *params;
 
    if (!cfdata->locals.cur) return;
 
@@ -651,6 +652,49 @@ _update_action_list(E_Config_Dialog_Data *cfdata)
             e_widget_disabled_set(cfdata->gui.o_params, 1);
             return;
          }
+       action = bi->action;
+       params = bi->params;
+     }
+   else
+     return;
+
+   _find_key_binding_action(action, params, NULL, NULL, &j);
+
+   if (j >= 0)
+     { 
+       for (i = 0; i < e_widget_ilist_count(cfdata->gui.o_action_list); i++) 
+         { 
+            if (i > j) break;
+            if (e_widget_ilist_nth_is_header(cfdata->gui.o_action_list, i)) j++;
+         }
+     } 
+
+   if (j >= 0) 
+     { 
+       if (j == e_widget_ilist_selected_get(cfdata->gui.o_action_list)) 
+         _update_action_params(cfdata);
+       else 
+         e_widget_ilist_selected_set(cfdata->gui.o_action_list, j);
+     }
+   else
+     { 
+       e_widget_ilist_unselect(cfdata->gui.o_action_list);
+       if (cfdata->locals.action) free(cfdata->locals.action);
+       cfdata->locals.action = strdup("");
+       e_widget_entry_clear(cfdata->gui.o_params);
+     }
+
+   /*if (cfdata->locals.cur[0] == 'k')
+     {
+       sscanf(cfdata->locals.cur, "k%d", &n);
+       bi = evas_list_nth(cfdata->binding.key, n);
+       if (!bi)
+         {
+            e_widget_ilist_unselect(cfdata->gui.o_action_list);
+            e_widget_entry_clear(cfdata->gui.o_params);
+            e_widget_disabled_set(cfdata->gui.o_params, 1);
+            return;
+         }
 
        _find_key_binding_action(bi, NULL, NULL, &j);
        if (j >= 0) 
@@ -676,7 +720,7 @@ _update_action_list(E_Config_Dialog_Data *cfdata)
             cfdata->locals.action = strdup("");
             e_widget_entry_clear(cfdata->gui.o_params);
          }
-     }
+     }*/
 }
 static void
 _update_action_params(E_Config_Dialog_Data *cfdata)
@@ -685,6 +729,14 @@ _update_action_params(E_Config_Dialog_Data *cfdata)
    E_Action_Group *actg;
    E_Action_Description *actd;
    E_Config_Binding_Key *bi;
+   const char *action, *params;
+
+#define KB_EXAMPLE_PARAMS \
+   if ((!actd->param_example) || (!actd->param_example[0])) \
+     e_widget_entry_text_set(cfdata->gui.o_params, TEXT_NO_PARAMS); \
+   else \
+     e_widget_entry_text_set(cfdata->gui.o_params, actd->param_example)
+
 
    if ((!cfdata->locals.action) || (!cfdata->locals.action[0]))
      {
@@ -709,12 +761,7 @@ _update_action_params(E_Config_Dialog_Data *cfdata)
    if ((!cfdata->locals.cur) || (!cfdata->locals.cur[0])) 
      { 
        e_widget_disabled_set(cfdata->gui.o_params, 1); 
-       
-       if ((!actd->param_example) || (!actd->param_example[0])) 
-         e_widget_entry_text_set(cfdata->gui.o_params, TEXT_NO_PARAMS);
-       else 
-         e_widget_entry_text_set(cfdata->gui.o_params, actd->param_example);
-
+       KB_EXAMPLE_PARAMS;
        return;
      }
    
@@ -722,48 +769,46 @@ _update_action_params(E_Config_Dialog_Data *cfdata)
      e_widget_disabled_set(cfdata->gui.o_params, 1);
    else
      e_widget_disabled_set(cfdata->gui.o_params, 0); 
-   
-   if (cfdata->locals.cur[0] == 'k') 
-     { 
-       sscanf(cfdata->locals.cur, "k%d", &b); 
-       bi = evas_list_nth(cfdata->binding.key, b); 
-       if (!bi) 
-         { 
-            e_widget_entry_text_set(cfdata->gui.o_params, TEXT_NO_PARAMS); 
-            e_widget_disabled_set(cfdata->gui.o_params, 1); 
-         } 
-       else 
-         { 
-            if (bi->action)
-              { 
-                 if (!strcmp(bi->action, actd->act_cmd)) 
-                   { 
-                      if ((!bi->params) || (!bi->params[0])) 
-                        { 
-                           if ((!actd->param_example) || (!actd->param_example[0])) 
-                             e_widget_entry_text_set(cfdata->gui.o_params, TEXT_NO_PARAMS); 
-                           else 
-                             e_widget_entry_text_set(cfdata->gui.o_params, actd->param_example); 
-                        }
-                      else 
-                        e_widget_entry_text_set(cfdata->gui.o_params, bi->params);
-                   }
-                 else
-                   {
-                      if ((!actd->param_example) || (!actd->param_example[0])) 
-                        e_widget_entry_text_set(cfdata->gui.o_params, TEXT_NO_PARAMS);
-                      else 
-                        e_widget_entry_text_set(cfdata->gui.o_params, actd->param_example);
-                   }
+
+   if (cfdata->locals.cur[0] == 'k')
+     {
+       sscanf(cfdata->locals.cur, "k%d", &b);
+       bi = evas_list_nth(cfdata->binding.key, b);
+       if (!bi)
+         {
+            e_widget_disabled_set(cfdata->gui.o_params, 1);
+            KB_EXAMPLE_PARAMS;
+            return;
+         }
+       action = bi->action;
+       params = bi->params;
+     }
+   else
+     {
+       e_widget_disabled_set(cfdata->gui.o_params, 1);
+       KB_EXAMPLE_PARAMS;
+       return;
+     }
+
+   if (action)
+     {
+       if (!strcmp(action, actd->act_cmd))
+         {
+            if ((!params) || (!params[0]))
+              {
+                 KB_EXAMPLE_PARAMS;
               }
             else
-              { 
-                 if ((!actd->param_example) || (!actd->param_example[0])) 
-                   e_widget_entry_text_set(cfdata->gui.o_params, TEXT_NO_PARAMS);
-                 else 
-                   e_widget_entry_text_set(cfdata->gui.o_params, actd->param_example);
-              }
+              e_widget_entry_text_set(cfdata->gui.o_params, params);
          }
+       else
+         {
+            KB_EXAMPLE_PARAMS;
+         }
+     }
+   else
+     {
+       KB_EXAMPLE_PARAMS;
      }
 }
 static void
@@ -1043,6 +1088,7 @@ _grab_key_down_cb(void *data, int type, void *event)
                       if (cfdata->locals.action) free(cfdata->locals.action);
                       cfdata->locals.action = strdup("");
                       e_widget_entry_clear(cfdata->gui.o_params);
+                      e_widget_disabled_set(cfdata->gui.o_params, 1);
                    }
                  else
                    {
@@ -1061,7 +1107,10 @@ _grab_key_down_cb(void *data, int type, void *event)
                  E_Action_Group *actg = NULL;
                  E_Action_Description *actd = NULL;
 
-                 _find_key_binding_action(cfdata->locals.add ? bi : bi2, &g, &a, &j);
+                 if (cfdata->locals.add) 
+                   _find_key_binding_action(bi->action, bi->params, &g, &a, &j);
+                 else
+                   _find_key_binding_action(bi2->action, bi2->params, &g, &a, &j);
 
                  actg = evas_list_nth(e_action_groups_get(), g);
                  if (actg) actd = evas_list_nth(actg->acts, a);
@@ -1140,10 +1189,10 @@ _auto_apply_changes(E_Config_Dialog_Data *cfdata)
      }
 }
 static void
-_find_key_binding_action(E_Config_Binding_Key *bi, int *g, int *a, int *n)
+_find_key_binding_action(const char *action, const char *params, int *g, int *a, int *n)
 {
    Evas_List *l, *l2;
-   int gg, aa, nn, found;
+   int gg = -1, aa = -1, nn = -1, found;
    E_Action_Group *actg;
    E_Action_Description *actd;
 
@@ -1151,8 +1200,6 @@ _find_key_binding_action(E_Config_Binding_Key *bi, int *g, int *a, int *n)
    if (a) *a = -1;
    if (n) *n = -1;
 
-   if (!bi) return;
-
    found = 0;
    for (l = e_action_groups_get(), gg = 0, nn = 0; l; l = l->next, gg++)
      {
@@ -1160,33 +1207,38 @@ _find_key_binding_action(E_Config_Binding_Key *bi, int *g, int *a, int *n)
 
        for (l2 = actg->acts, aa = 0; l2; l2 = l2->next, aa++)
          {
-            actd = l2->data; 
-            if (!strcmp((!bi->action ? "" : bi->action), (!actd->act_cmd ? "" : actd->act_cmd)))
+            actd = l2->data;
+            if (!strcmp((!action ? "" : action), (!actd->act_cmd ? "" : actd->act_cmd)))
               {
-                 if (!actd->act_params || !actd->act_params[0])
-                   { 
-                      if (n) *n = nn;
-                      if (g) *g = gg;
-                      if (a) *a = aa;
-                      if (!bi->params || bi->params[0])
+                 if (!params || !params[0])
+                   {
+                      if ((!actd->act_params) || (!actd->act_params[0]))
                         {
-                           found = 1;
-                           break;
+                           if (g) *g = gg;
+                           if (a) *a = aa;
+                           if (n) *n = nn;
+                           return;
                         }
+                      else
+                        continue;
                    }
                  else
                    {
-                      if (!bi->params || !bi->params[0])
-                        continue;
+                      if ((!actd->act_params) || (!actd->act_params[0]))
+                        {
+                           if (g) *g = gg;
+                           if (a) *a = aa;
+                           if (n) *n = nn;
+                           found = 1;
+                        }
                       else
                         {
-                           if (!strcmp(actd->act_params, bi->params))
-                             { 
-                                if (n) *n = nn;
+                           if (!strcmp(params, actd->act_params))
+                             {
                                 if (g) *g = gg;
                                 if (a) *a = aa;
-                                found = 1;
-                                break;
+                                if (n) *n = nn;
+                                return;
                              }
                         }
                    }
@@ -1197,7 +1249,7 @@ _find_key_binding_action(E_Config_Binding_Key *bi, int *g, int *a, int *n)
      }
 
    if (!found)
-     { 
+     {
        if (g) *g = -1;
        if (a) *a = -1;
        if (n) *n = -1;
index 7664e83..7cecdc0 100644 (file)
@@ -1,6 +1,8 @@
 #include "e.h"
 
 
+#define TEXT_NO_PARAMS _("<None>")
+
 #define EXAMPLE_STRING "example : "
 #define E_BINDING_CONTEXT_NUMBER  10
 
@@ -18,60 +20,41 @@ static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Co
 static void _fill_data(E_Config_Dialog_Data *cfdata);
 
 static void _fill_actions_list(E_Config_Dialog_Data *cfdata);
-static void _auto_apply_changes(E_Config_Dialog_Data *cfdata);
-/******** updates ************/
-static void _update_binding_list(E_Config_Dialog_Data *cfdata);
-static void _update_binding_list_selection(E_Config_Dialog_Data *cfdata, const void *bind);
-static void _update_buttons(E_Config_Dialog_Data *cfdata);
-static void _update_binding_params(E_Config_Dialog_Data *cfdata);
 
-/******** callbacks ***********/
+
+/******************* Callbacks *************/
 static void _binding_change_cb(void *data);
 static void _action_change_cb(void *data);
+static void _delete_mouse_binding_cb(void *data, void *data2);
+static void _delete_all_mouse_binding_cb(void *data, void *data2);
+static void _restore_mouse_binding_defaults_cb(void *data, void *data2);
 static void _add_mouse_binding_cb(void *data, void *data2);
 static void _modify_mouse_binding_cb(void *data, void *data2);
-static void _delete_mouse_binding_cb(void *data, void *data2);
-static void _restore_defaults_cb(void *data, void *data2);
 
-static int _grab_key_down_cb(void *data, int type, void *event);
-static int _grab_mouse_down_cb(void *data, int type, void *event);
-static int _grab_mouse_wheel_cb(void *data, int type, void *event);
-static void _grab_wnd_hide_cb(E_Config_Dialog_Data *cfdata);
+/******************* Updates *****************/
+static void _update_action_list(E_Config_Dialog_Data *cfdata);
+static void _update_action_params(E_Config_Dialog_Data *cfdata);
+static void _update_mouse_binding_list(E_Config_Dialog_Data *cfdata);
+static void _update_buttons(E_Config_Dialog_Data *cfdata);
+static void _update_binding_context(E_Config_Dialog_Data *cfdata);
 
-/******** helpers *************/
+/****************** Helper *****************/
+static void _find_key_binding_action(const char *action, const char *params, int *g, int *a, int *n);
 static char *_helper_button_name_get(E_Config_Binding_Mouse *eb);
 static char *_helper_wheel_name_get(E_Config_Binding_Wheel *bw);
 static char *_helper_modifier_name_get(int mod);
+static void _auto_apply_changes(E_Config_Dialog_Data *cfdata);
 
-/********* sorts ***************/
+/********* Sorting ***************/
 static int _mouse_binding_sort_cb(void *d1, void *d2);
 static int _wheel_binding_sort_cb(void *d1, void *d2);
 
-
-#define E_ACTION_NUMBER 32
-const char *action_to_name[E_ACTION_NUMBER][2] = { 
-       {"window_move", "Move Window"}, {"window_resize", "Resize Window" },
-       {"window_raise", "Raise Window"}, {"window_menu", "Window Menu"},
-       {"window_lower", "Lower Window"}, {"window_close", "Close Window"},
-       {"window_kill", "Kill Window"}, {"window_sticky_toggle", "Sticky Window"},
-       {"window_iconic_toggle", "Iconify Window"}, {"window_shaded_toggle", "Shade Window"},
-       {"window_bordless_toggle", "Bordless Window"}, {"desk_flip_by", "Flip Desktop By #:#"},
-       {"desk_deskshow_toggle", "Show Desktop"}, {"desk_flip_to", "Flip To Desktop #:#"},
-       {"desk_linear_flip_by", "Flip Desktop By #"},
-       {"desk_linear_flip_to", "Flip To Desktop #"},
-       {"screen_send_to", "Move Mouse To Screen #"},
-       {"screen_send_by", "Move Mouse By Screen #"},
-       {"window_move_to", "Move Window To Position"}, {"window_move_by", "Shift Window"},
-       {"window_resize_by", "Resize Window By Size"},
-       {"window_drag_icon", "Drag Window Icon"},
-       {"window_desk_move_by", "Move Window By Desktop #"},
-       {"window_desk_move_to", "Move Window To Desktop #"}, {"menu_show", "Show Menu"},
-       {"exec", "Run User Command"}, {"app", "Launch Application"},
-       {"winlist", "Run Winlist Dialog"}, {"restart", "Restart Enlightenment"},
-       {"exit", "Exit Enlightenment"}, {"exebuf", "Run Command Dialog"},
-       {"desk_lock", "Lock Screen"}
-};
-
+/********* grab window **********/
+static void _grab_wnd_show(E_Config_Dialog_Data *cfdata);
+static void _grab_wnd_hide(E_Config_Dialog_Data *cfdata);
+static int _grab_mouse_down_cb(void *data, int type, void *event);
+static int _grab_mouse_wheel_cb(void *data, int type, void *event);
+static int _grab_key_down_cb(void *data, int type, void *event);
 
 struct _E_Config_Dialog_Data
 {
@@ -96,7 +79,7 @@ struct _E_Config_Dialog_Data
        int add; //just to distinguesh among two buttons add/modify
 
        E_Dialog *dia;
-       Ecore_X_Window mousebind_win;
+       Ecore_X_Window bind_win;
        Evas_List *handlers;
     } locals;
 
@@ -107,6 +90,7 @@ struct _E_Config_Dialog_Data
        Evas_Object *o_add;
        Evas_Object *o_mod;
        Evas_Object *o_del;
+       Evas_Object *o_del_all;
        Evas_Object *o_params;
 
        struct {
@@ -151,7 +135,7 @@ _fill_data(E_Config_Dialog_Data *cfdata)
    cfdata->locals.context = E_BINDING_CONTEXT_ANY;
    cfdata->binding.mouse = NULL;
    cfdata->binding.wheel = NULL;
-   cfdata->locals.mousebind_win = 0;
+   cfdata->locals.bind_win = 0;
    cfdata->locals.handlers =  NULL;
    cfdata->locals.dia = NULL;
 
@@ -326,23 +310,34 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
    e_widget_framelist_object_append(of, o);
 
    ol2 = e_widget_list_add(evas, 1, 1);
-   o = e_widget_button_add(evas, _("Add"), NULL, _add_mouse_binding_cb, cfdata, NULL);
+   o = e_widget_button_add(evas, _("Add Mouse"), "enlightenment/e",
+                          _add_mouse_binding_cb, cfdata, NULL);
    cfdata->gui.o_add = o;
    e_widget_list_object_append(ol2, o, 1, 1, 0.5);
 
-   o = e_widget_button_add(evas, _("Modify"), NULL, _modify_mouse_binding_cb, cfdata, NULL);
+   o = e_widget_button_add(evas, _("Delete Mouse"), "enlightenment/e",
+                          _delete_mouse_binding_cb, cfdata, NULL);
+   cfdata->gui.o_del = o;
+   e_widget_disabled_set(o, 1);
+   e_widget_list_object_append(ol2, o, 1, 1, 0.5);
+   e_widget_framelist_object_append(of, ol2);
+
+   ol2 = e_widget_list_add(evas, 1, 1);
+   o = e_widget_button_add(evas, _("Modify"), "enlightenment/e",
+                          _modify_mouse_binding_cb, cfdata, NULL);
    cfdata->gui.o_mod = o;
    e_widget_disabled_set(o, 1);
    e_widget_list_object_append(ol2, o, 1, 1, 0.5);
 
-   o = e_widget_button_add(evas, _("Delete"), NULL, _delete_mouse_binding_cb, cfdata, NULL);
-   cfdata->gui.o_del = o;
+   o = e_widget_button_add(evas, _("Delete All"), "enlightenment/e",
+                          _delete_all_mouse_binding_cb, cfdata, NULL);
+   cfdata->gui.o_del_all = o;
    e_widget_disabled_set(o, 1);
    e_widget_list_object_append(ol2, o, 1, 1, 0.5);
    e_widget_framelist_object_append(of, ol2);
 
-   o = e_widget_button_add(evas, _("Restore Mouse and Wheel Binding Defaults"), NULL,
-                          _restore_defaults_cb, cfdata, NULL);
+   o = e_widget_button_add(evas, _("Restore Mouse and Wheel Binding Defaults"), "enlightenment/e",
+                          _restore_mouse_binding_defaults_cb, cfdata, NULL);
    e_widget_framelist_object_append(of, o);
    e_widget_list_object_append(ol, of, 1, 1, 0.5);
 
@@ -351,7 +346,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
    of = e_widget_framelist_add(evas, _("Action"), 0);
    o = e_widget_ilist_add(evas, 24, 24, &(cfdata->locals.action));
    cfdata->gui.o_action_list = o;
-   e_widget_min_size_set(o, 250, 180); 
+   e_widget_min_size_set(o, 250, 210); 
    e_widget_ilist_go(o);
    e_widget_framelist_object_append(of, o);
    e_widget_list_object_append(ol2, of, 1, 1, 0.5);
@@ -420,8 +415,8 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
 
    e_widget_list_object_append(ol, ol2, 1, 1, 0.5);
 
+   _update_mouse_binding_list(cfdata);
    _fill_actions_list(cfdata);
-   _update_binding_list(cfdata);
 
    return ol;
 }
@@ -430,842 +425,780 @@ static void
 _fill_actions_list(E_Config_Dialog_Data *cfdata)
 {
    char buf[1024];
-   int i;
+   Evas_List *l, *l2;
+   E_Action_Group *actg;
+   E_Action_Description *actd;
+   int g, a;
 
-   for (i = 0; i < E_ACTION_NUMBER; i++)
+   e_widget_ilist_clear(cfdata->gui.o_action_list);
+   for (l = e_action_groups_get(), g = 0; l; l = l->next, g++)
      {
-       snprintf(buf, sizeof(buf), "%d", i);
-       e_widget_ilist_append(cfdata->gui.o_action_list, NULL, action_to_name[i][1],
-                             _action_change_cb, cfdata, buf);
-     } 
+       actg = l->data;
+
+       if (!actg->acts) continue;
+
+       e_widget_ilist_header_append(cfdata->gui.o_action_list, NULL, actg->act_grp);
+
+       for (l2 = actg->acts, a = 0; l2; l2 = l2->next, a++)
+         {
+            actd = l2->data;
+
+            snprintf(buf, sizeof(buf), "%d %d", g, a);
+            e_widget_ilist_append(cfdata->gui.o_action_list, NULL, actd->act_name,
+                                  _action_change_cb, cfdata, buf);
+         }
+     }
    e_widget_ilist_go(cfdata->gui.o_action_list);
 }
 
+/******************* Callbacks *************/
 static void
-_auto_apply_changes(E_Config_Dialog_Data *cfdata)
+_add_mouse_binding_cb(void *data, void *data2)
 {
-   char *n;
-   const char *action;
-   E_Config_Binding_Mouse *eb;
-   E_Config_Binding_Wheel *bw;
+   E_Config_Dialog_Data *cfdata;
 
-   if (!cfdata->locals.cur) return;
+   cfdata = data;
+   _auto_apply_changes(cfdata);
 
-   n = cfdata->locals.cur;
+   cfdata->locals.add = 1;
+   _grab_wnd_show(cfdata);
+}
+static void
+_modify_mouse_binding_cb(void *data, void *data2)
+{
+   E_Config_Dialog_Data *cfdata;
 
-   if (cfdata->locals.cur[0] == 'm')
-     {
-       eb = evas_list_nth(cfdata->binding.mouse, atoi(++n));
-       if (!eb) return;
+   cfdata = data;
+   _auto_apply_changes(cfdata);
 
-       eb->context = cfdata->locals.context;
+   cfdata->locals.add = 0;
+   _grab_wnd_show(cfdata);
+}
+static void
+_action_change_cb(void *data)
+{
+   E_Config_Dialog_Data *cfdata;
 
-       if (eb->action) evas_stringshare_del(eb->action);
-       if (e_widget_ilist_selected_get(cfdata->gui.o_action_list) >= 0) 
-         action = action_to_name[atoi(cfdata->locals.action)][0];
-       else
-         action = NULL;
-       eb->action = action ? evas_stringshare_add(action) : NULL;
+   cfdata = data;
+   _update_action_params(cfdata);
+}
+static void
+_binding_change_cb(void *data)
+{
+   E_Config_Dialog_Data *cfdata;
 
-       if (eb->params) evas_stringshare_del(eb->params);
-       if ((!cfdata->locals.params) || (!cfdata->locals.params[0]) ||
-           (!strncmp(cfdata->locals.params, EXAMPLE_STRING, strlen(EXAMPLE_STRING))))
-         eb->params = NULL;
-       else
-         eb->params = evas_stringshare_add(cfdata->locals.params);
-     }
-   else
-     {
-       bw = evas_list_nth(cfdata->binding.wheel, atoi(++n));
-       if (!bw) return;
+   cfdata = data;
 
-       bw->context = cfdata->locals.context;
-       if (bw->action) evas_stringshare_del(bw->action);
-       if (e_widget_ilist_selected_get(cfdata->gui.o_action_list) >= 0)
-         action = action_to_name[atoi(cfdata->locals.action)][0];
-       else
-         action = NULL;
-       bw->action = action ? evas_stringshare_add(action) : NULL;
+   _auto_apply_changes(cfdata);
 
-       if (bw->params) evas_stringshare_del(bw->params);
-       if ((!cfdata->locals.params) || (!cfdata->locals.params[0]))
-         bw->params = NULL;
-       else
-         bw->params = evas_stringshare_add(cfdata->locals.params);
-     }
+   if (cfdata->locals.cur) free(cfdata->locals.cur);
+   cfdata->locals.cur = NULL;
+
+   if (cfdata->locals.binding[0]) 
+     cfdata->locals.cur = strdup(cfdata->locals.binding);
+
+   _update_buttons(cfdata);
+   _update_action_list(cfdata);
+   _update_binding_context(cfdata);
 }
-/********* updates *************/
-static void 
-_update_binding_actions(E_Config_Dialog_Data *cfdata)
+static void
+_delete_all_mouse_binding_cb(void *data, void *data2)
 {
-   char *n;
-   int i;
+   E_Config_Dialog_Data *cfdata;
    E_Config_Binding_Mouse *eb;
    E_Config_Binding_Wheel *bw;
-   const char *action;
-
-   e_widget_ilist_clear(cfdata->gui.o_action_list);
-   _fill_actions_list(cfdata);
 
-   if (!cfdata->locals.cur) return;
+   cfdata = data;
 
-   n = cfdata->locals.cur;
-   if (cfdata->locals.cur[0] == 'm')
+   //FIXME: need confirmation dialog
+   
+   while (cfdata->binding.mouse)
      {
-       eb = evas_list_nth(cfdata->binding.mouse, atoi(++n));
-       if (!eb) return;
-       action = eb->action;
+       eb = cfdata->binding.mouse->data;
+       if (eb->action) evas_stringshare_del(eb->action);
+       if (eb->params) evas_stringshare_del(eb->params);
+       E_FREE(eb);
+       cfdata->binding.mouse =
+          evas_list_remove_list(cfdata->binding.mouse, cfdata->binding.mouse);
      }
-   else
+
+   while (cfdata->binding.wheel)
      {
-       bw = evas_list_nth(cfdata->binding.wheel, atoi(++n));
-       if (!bw) return;
-       action = bw->action;
+       bw = cfdata->binding.wheel->data;
+       if (bw->action) evas_stringshare_del(bw->action);
+       if (bw->params) evas_stringshare_del(bw->params);
+       E_FREE(bw);
+       cfdata->binding.wheel =
+          evas_list_remove_list(cfdata->binding.wheel, cfdata->binding.wheel);
      }
 
-   if (action && action[0])
-     { 
-       for (i = 0; i < E_ACTION_NUMBER; i++) 
-         { 
-            if (!strcmp(action_to_name[i][0], action)) 
-              { 
-                 e_widget_ilist_selected_set(cfdata->gui.o_action_list, i); 
-                 break; 
-              }
-         }
-     }
-   else
-     cfdata->locals.action[0] = '\0';
+   if (cfdata->locals.cur) free(cfdata->locals.cur);
+   cfdata->locals.cur = NULL;
+
+   e_widget_ilist_clear(cfdata->gui.o_binding_list);
+   e_widget_ilist_go(cfdata->gui.o_binding_list);
+   e_widget_ilist_unselect(cfdata->gui.o_action_list);
+   e_widget_entry_clear(cfdata->gui.o_params);
+   e_widget_disabled_set(cfdata->gui.o_params, 1);
+
+   _update_buttons(cfdata);
+   _update_binding_context(cfdata);
 }
 static void
-_update_binding_list(E_Config_Dialog_Data *cfdata)
+_delete_mouse_binding_cb(void *data, void *data2)
 {
-   char *icon = NULL, *button, *mods;
-   char label[1024], val[10];
-   int i;
    Evas_List *l;
+   int sel, n;
+   E_Config_Dialog_Data *cfdata;
    E_Config_Binding_Mouse *eb;
    E_Config_Binding_Wheel *bw;
 
-   e_widget_ilist_clear(cfdata->gui.o_binding_list);
-
-   if (cfdata->binding.mouse) 
-     { 
-       cfdata->binding.mouse = evas_list_sort(cfdata->binding.mouse, 
-             evas_list_count(cfdata->binding.mouse), _mouse_binding_sort_cb);
-       
-       e_widget_ilist_header_append(cfdata->gui.o_binding_list, NULL, "Mouse Buttons");
-     }
+   cfdata = data;
 
-   for (l = cfdata->binding.mouse, i = 0; l; l = l->next, i++)
+   sel = e_widget_ilist_selected_get(cfdata->gui.o_binding_list);
+   if (cfdata->locals.binding[0] == 'm')
      {
-       Evas_Object *ic;
-       eb = l->data;
-
-       button = _helper_button_name_get(eb);
-       mods = _helper_modifier_name_get(eb->modifiers);
-
-       snprintf(label, sizeof(label), "%s%s%s", button ? button : "", mods[0] ? " + ": "",
-                mods ? mods : "");
-       if (button) free(button);
-       if (mods) free(mods);
-
-       switch (eb->button)
+       sscanf(cfdata->locals.binding, "m%d", &n);
+       l = evas_list_nth_list(cfdata->binding.mouse, n);
+       if (l)
          {
-          case 1:
-             icon = "enlightenment/mouse_left";
-             break;
-          case 2:
-             icon = "enlightenment/mouse_middle";
-             break;
-          case 3:
-             icon = "enlightenment/mouse_right";
-             break;
-          default:
-             icon = "enlightenment/mouse_extra";
+            eb = l->data;
+            if (eb->action) evas_stringshare_del(eb->action);
+            if (eb->params) evas_stringshare_del(eb->params);
+            E_FREE(eb);
+            cfdata->binding.mouse = evas_list_remove_list(cfdata->binding.mouse, l);
          }
-
-       snprintf(val, sizeof(val), "m%d", i);
-
-       ic = edje_object_add(cfdata->evas);
-       e_util_edje_icon_set(ic, icon);
-       e_widget_ilist_append(cfdata->gui.o_binding_list, ic, label, _binding_change_cb,
-                             cfdata, val);
      }
-
-   if (cfdata->binding.wheel) 
+   else if (cfdata->locals.binding[0] == 'w')
      {
-       cfdata->binding.wheel = evas_list_sort(cfdata->binding.wheel, 
-             evas_list_count(cfdata->binding.wheel), _wheel_binding_sort_cb); 
-       
-       e_widget_ilist_header_append(cfdata->gui.o_binding_list, NULL, "Mouse Wheels");
+       sscanf(cfdata->locals.binding, "w%d", &n);
+       l = evas_list_nth_list(cfdata->binding.wheel, n);
+       if (l)
+         {
+            bw = l->data;
+            if (bw->action) evas_stringshare_del(bw->action);
+            if (bw->params) evas_stringshare_del(bw->params);
+            E_FREE(bw);
+            cfdata->binding.wheel = evas_list_remove_list(cfdata->binding.wheel, l);
+         }
      }
+   else
+     return;
 
-   for (l = cfdata->binding.wheel, i = 0; l; l = l->next, i++)
-     {
-       Evas_Object *ic;
-       bw = l->data;
-
-       button = _helper_wheel_name_get(bw);
-       mods = _helper_modifier_name_get(bw->modifiers);
-
-       snprintf(label, sizeof(label), "%s%s%s", button ? button : "", mods[0] ? " + ": "",
-               mods ? mods : "");
-       if (button) free(button);
-       if (mods) free(mods);
+   _update_mouse_binding_list(cfdata);
+   if (sel >= e_widget_ilist_count(cfdata->gui.o_binding_list))
+     sel = e_widget_ilist_count(cfdata->gui.o_binding_list) - 1;
 
-       snprintf(val, sizeof(val), "w%d", i);
 
-       ic = edje_object_add(cfdata->evas);
-       e_util_edje_icon_set(ic, "enlightenment/mouse_wheel");
-       e_widget_ilist_append(cfdata->gui.o_binding_list, ic, label, _binding_change_cb,
-                             cfdata, val);
+   if (cfdata->locals.cur) free(cfdata->locals.cur);
+   cfdata->locals.cur = NULL;
+   if (!e_widget_ilist_count(cfdata->gui.o_binding_list))
+     { 
+       
+       _update_binding_context(cfdata);
+       _update_buttons(cfdata); 
+       
+       e_widget_ilist_unselect(cfdata->gui.o_action_list);
+       e_widget_entry_clear(cfdata->gui.o_params);
+       e_widget_disabled_set(cfdata->gui.o_params, 1);
+     }
+   else 
+     { 
+       if (e_widget_ilist_nth_is_header(cfdata->gui.o_binding_list, sel)) sel++;
+       e_widget_ilist_selected_set(cfdata->gui.o_binding_list, sel);
      }
-
-   e_widget_ilist_go(cfdata->gui.o_binding_list);
 }
 static void
-_update_binding_list_selection(E_Config_Dialog_Data *cfdata, const void *bind)
+_restore_mouse_binding_defaults_cb(void *data, void *data2)
 {
-   Evas_List *l;
-   int sel;
+   E_Config_Binding_Mouse *eb;
+   E_Config_Binding_Wheel *bw;
+   E_Config_Dialog_Data *cfdata;
+
+   cfdata = data;
 
-   for (l = cfdata->binding.mouse, sel = 0; l; l = l->next, sel++)
+   while (cfdata->binding.mouse)
      {
-       if (l->data == bind)
-         {
-            e_widget_ilist_selected_set(cfdata->gui.o_binding_list, sel + 1);
-            return;
-         }
+       eb = cfdata->binding.mouse->data;
+       if (eb->action) evas_stringshare_del(eb->action);
+       if (eb->params) evas_stringshare_del(eb->params);
+       E_FREE(eb);
+       cfdata->binding.mouse =
+          evas_list_remove_list(cfdata->binding.mouse, cfdata->binding.mouse);
      }
 
-   if (evas_list_count(cfdata->binding.mouse)) 
-     sel = evas_list_count(cfdata->binding.mouse) + 1;
-   else
-     sel = 0;
-
-   for (l = cfdata->binding.wheel; l; l = l->next, sel++)
+   while (cfdata->binding.wheel)
      {
-       if (l->data == bind)
-         {
-            e_widget_ilist_selected_set(cfdata->gui.o_binding_list, sel + 1);
-            return;
-         }
-     }
-}
-static void
-_update_buttons(E_Config_Dialog_Data *cfdata)
-{
-   if (!cfdata->locals.cur)
-     { 
-       e_widget_disabled_set(cfdata->gui.o_mod, 1); 
-       e_widget_disabled_set(cfdata->gui.o_del, 1);
-       return;
+       bw = cfdata->binding.wheel->data;
+       if (bw->action) evas_stringshare_del(bw->action);
+       if (bw->params) evas_stringshare_del(bw->params);
+       E_FREE(bw);
+       cfdata->binding.wheel =
+          evas_list_remove_list(cfdata->binding.wheel, cfdata->binding.wheel);
      }
+#define CFG_MOUSEBIND_DFLT(_context, _button, _modifiers, _anymod, _action, _params) \
+   eb = E_NEW(E_Config_Binding_Mouse, 1); \
+   eb->context = _context; \
+   eb->button = _button; \
+   eb->modifiers = _modifiers; \
+   eb->any_mod = _anymod; \
+   eb->action = _action == NULL ? NULL : evas_stringshare_add(_action); \
+   eb->params = _params == NULL ? NULL : evas_stringshare_add(_params); \
+   cfdata->binding.mouse = evas_list_append(cfdata->binding.mouse, eb) 
+   
+   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, E_BINDING_MODIFIER_ALT, 0, "window_move", NULL); 
+   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 2, E_BINDING_MODIFIER_ALT, 0, "window_resize", NULL); 
+   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 3, E_BINDING_MODIFIER_ALT, 0, "window_menu", NULL); 
+   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 1, 0, 0, "menu_show", "main"); 
+   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 2, 0, 0, "menu_show", "clients"); 
+   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 3, 0, 0, "menu_show", "favorites");
 
-   e_widget_disabled_set(cfdata->gui.o_mod, 0);
-   e_widget_disabled_set(cfdata->gui.o_del, 0);
+
+#define CFG_WHEELBIND_DFLT(_context, _direction, _z, _modifiers, _anymod, _action, _params) \
+   bw = E_NEW(E_Config_Binding_Wheel, 1); \
+   bw->context = _context; \
+   bw->direction = _direction; \
+   bw->z = _z; \
+   bw->modifiers = _modifiers; \
+   bw->any_mod = _anymod; \
+   bw->action = _action == NULL ? NULL : evas_stringshare_add(_action); \
+   bw->params = _params == NULL ? NULL : evas_stringshare_add(_params); \
+   cfdata->binding.wheel = evas_list_append(cfdata->binding.wheel, bw) 
+   
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, -1, E_BINDING_MODIFIER_NONE, 1, 
+        "desk_linear_flip_by", "-1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, -1, E_BINDING_MODIFIER_NONE, 1, 
+        "desk_linear_flip_by", "-1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, 1, E_BINDING_MODIFIER_NONE, 1, 
+        "desk_linear_flip_by", "1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, 1, E_BINDING_MODIFIER_NONE, 1, 
+        "desk_linear_flip_by", "1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_POPUP, 0, -1, E_BINDING_MODIFIER_NONE, 1, 
+        "desk_linear_flip_by", "-1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_POPUP, 1, -1, E_BINDING_MODIFIER_NONE, 1, 
+        "desk_linear_flip_by", "-1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_POPUP, 0, 1, E_BINDING_MODIFIER_NONE, 1, 
+        "desk_linear_flip_by", "1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_POPUP, 1, 1, E_BINDING_MODIFIER_NONE, 1, 
+        "desk_linear_flip_by", "1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, -1, E_BINDING_MODIFIER_ALT, 0, 
+        "desk_linear_flip_by", "-1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, -1, E_BINDING_MODIFIER_ALT, 0, 
+        "desk_linear_flip_by", "-1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, 1, E_BINDING_MODIFIER_ALT, 0, 
+        "desk_linear_flip_by", "1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, 1, E_BINDING_MODIFIER_ALT, 0, 
+        "desk_linear_flip_by", "1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 0, -1, E_BINDING_MODIFIER_ALT, 0, 
+        "desk_linear_flip_by", "-1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, -1, E_BINDING_MODIFIER_ALT, 0, 
+        "desk_linear_flip_by", "-1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 0, 1, E_BINDING_MODIFIER_ALT, 0, 
+        "desk_linear_flip_by", "1"); 
+   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, 1, E_BINDING_MODIFIER_ALT, 0, 
+        "desk_linear_flip_by", "1");
+
+   if (cfdata->locals.cur) free(cfdata->locals.cur);
+   cfdata->locals.cur = NULL;
+
+   _update_mouse_binding_list(cfdata);
+   _update_buttons(cfdata);
+   _update_binding_context(cfdata);
+
+   e_widget_ilist_unselect(cfdata->gui.o_action_list);
+   e_widget_entry_clear(cfdata->gui.o_params);
+   e_widget_disabled_set(cfdata->gui.o_params, 1);
 }
+
+/******************* Updates *****************/
+
 static void
-_update_binding_context(E_Config_Dialog_Data *cfdata)
+_update_action_list(E_Config_Dialog_Data *cfdata)
 {
-   char *n;
    E_Config_Binding_Mouse *eb;
    E_Config_Binding_Wheel *bw;
-   E_Binding_Context ctxt;
-
-   e_widget_disabled_set(cfdata->gui.context.o_any, 1);
-   e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
-   e_widget_disabled_set(cfdata->gui.context.o_border, 1);
-   e_widget_disabled_set(cfdata->gui.context.o_menu, 1);
-   e_widget_disabled_set(cfdata->gui.context.o_winlist, 1);
-   e_widget_disabled_set(cfdata->gui.context.o_popup, 1);
-   e_widget_disabled_set(cfdata->gui.context.o_zone, 1);
-   e_widget_disabled_set(cfdata->gui.context.o_container, 1);
-   e_widget_disabled_set(cfdata->gui.context.o_manager, 1);
-   e_widget_disabled_set(cfdata->gui.context.o_none, 1);
+   E_Action_Group *actg;
+   E_Action_Description *actd;
+   Evas_List *l, *l2;
+   const char *action, *params;
+   int j = -1, i, n;
 
    if (!cfdata->locals.cur) return;
 
-   n = cfdata->locals.cur;
    if (cfdata->locals.cur[0] == 'm')
      {
-       eb = evas_list_nth(cfdata->binding.mouse, atoi(++n));
-       if (!eb) return;
-       ctxt = eb->context;
+       sscanf(cfdata->locals.cur, "m%d", &n);
+       eb = evas_list_nth(cfdata->binding.mouse, n);
+       if (!eb)
+         {
+            e_widget_ilist_unselect(cfdata->gui.o_action_list);
+            e_widget_entry_clear(cfdata->gui.o_params);
+            e_widget_disabled_set(cfdata->gui.o_params, 1);
+            return;
+         }
+       action = eb->action;
+       params = eb->params;
      }
-   else
+   else if (cfdata->locals.cur[0] == 'w')
      {
-       bw = evas_list_nth(cfdata->binding.wheel, atoi(++n));
-       if (!bw) return;
-       ctxt = bw->context;
+       sscanf(cfdata->locals.cur, "w%d", &n);
+       bw = evas_list_nth(cfdata->binding.wheel, n);
+       if (!bw)
+         {
+            e_widget_ilist_unselect(cfdata->gui.o_action_list);
+            e_widget_entry_clear(cfdata->gui.o_params);
+            e_widget_disabled_set(cfdata->gui.o_params, 1);
+            return;
+         }
+       action = bw->action;
+       params = bw->params;
      }
+   else
+     return;
 
-   e_widget_disabled_set(cfdata->gui.context.o_any, 0);
-   e_widget_disabled_set(cfdata->gui.context.o_border, 0);
-   e_widget_disabled_set(cfdata->gui.context.o_menu, 0);
-   e_widget_disabled_set(cfdata->gui.context.o_winlist, 0);
-   e_widget_disabled_set(cfdata->gui.context.o_popup, 0);
-   e_widget_disabled_set(cfdata->gui.context.o_zone, 0);
-   e_widget_disabled_set(cfdata->gui.context.o_container, 0);
-   e_widget_disabled_set(cfdata->gui.context.o_manager, 0);
-   e_widget_disabled_set(cfdata->gui.context.o_none, 0);
+   _find_key_binding_action(action, params, NULL, NULL, &j);
+   if (j >= 0)
+     {
+       for (i = 0; i < e_widget_ilist_count(cfdata->gui.o_action_list); i++)
+         {
+            if (i > j) break;
+            if (e_widget_ilist_nth_is_header(cfdata->gui.o_action_list, i)) j++;
+         }
+     }
 
-   if (ctxt == E_BINDING_CONTEXT_ANY) 
-     e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
-   else if (ctxt == E_BINDING_CONTEXT_BORDER)
-     e_widget_radio_toggle_set(cfdata->gui.context.o_border, 1);
-   else if (ctxt == E_BINDING_CONTEXT_MENU)
-     e_widget_radio_toggle_set(cfdata->gui.context.o_menu, 1);
-   else if (ctxt == E_BINDING_CONTEXT_WINLIST)
-     e_widget_radio_toggle_set(cfdata->gui.context.o_winlist, 1);
-   else if (ctxt == E_BINDING_CONTEXT_POPUP)
-     e_widget_radio_toggle_set(cfdata->gui.context.o_popup, 1);
-   else if (ctxt == E_BINDING_CONTEXT_ZONE)
-     e_widget_radio_toggle_set(cfdata->gui.context.o_zone, 1);
-   else if (ctxt == E_BINDING_CONTEXT_CONTAINER)
-     e_widget_radio_toggle_set(cfdata->gui.context.o_container, 1);
-   else if (ctxt == E_BINDING_CONTEXT_MANAGER)
-     e_widget_radio_toggle_set(cfdata->gui.context.o_manager, 1);
-   else if (ctxt == E_BINDING_CONTEXT_NONE)
-     e_widget_radio_toggle_set(cfdata->gui.context.o_none, 1);
+   if (j >= 0)
+     {
+       if (j == e_widget_ilist_selected_get(cfdata->gui.o_action_list))
+         _update_action_params(cfdata);
+       else
+         e_widget_ilist_selected_set(cfdata->gui.o_action_list, j);
+     }
+   else
+     {
+       e_widget_ilist_unselect(cfdata->gui.o_action_list);
+       if (cfdata->locals.action) free(cfdata->locals.action);
+       cfdata->locals.action = strdup("");
+       e_widget_entry_clear(cfdata->gui.o_params);
+     }
 }
 static void
-_update_binding_params(E_Config_Dialog_Data *cfdata)
-{ 
-   char *n;
-   const char *params;
+_update_mouse_binding_list(E_Config_Dialog_Data *cfdata)
+{
+   char *icon = NULL, *button, *mods;
+   char label[1024], val[10];
+   int i;
+   Evas_List *l;
    E_Config_Binding_Mouse *eb;
    E_Config_Binding_Wheel *bw;
 
-   e_widget_entry_clear(cfdata->gui.o_params);
-   e_widget_disabled_set(cfdata->gui.o_params, 1);
+   e_widget_ilist_clear(cfdata->gui.o_binding_list);
 
-   if (!cfdata->locals.cur) return; 
-   
-   e_widget_disabled_set(cfdata->gui.o_params, 0);
+   if (cfdata->binding.mouse) 
+     { 
+       cfdata->binding.mouse = evas_list_sort(cfdata->binding.mouse, 
+             evas_list_count(cfdata->binding.mouse), _mouse_binding_sort_cb);
+       
+       e_widget_ilist_header_append(cfdata->gui.o_binding_list, NULL, "Mouse Buttons");
+     }
 
-   n = cfdata->locals.cur;
-   if (cfdata->locals.cur[0] == 'm')
+   for (l = cfdata->binding.mouse, i = 0; l; l = l->next, i++)
      {
-       eb = evas_list_nth(cfdata->binding.mouse, atoi(++n));
-       params = eb->params;
+       Evas_Object *ic;
+       eb = l->data;
+
+       button = _helper_button_name_get(eb);
+       mods = _helper_modifier_name_get(eb->modifiers);
+
+       snprintf(label, sizeof(label), "%s%s%s", button ? button : "", mods[0] ? " + ": "",
+                mods ? mods : "");
+       if (button) free(button);
+       if (mods) free(mods);
+
+       switch (eb->button)
+         {
+          case 1:
+             icon = "enlightenment/mouse_left";
+             break;
+          case 2:
+             icon = "enlightenment/mouse_middle";
+             break;
+          case 3:
+             icon = "enlightenment/mouse_right";
+             break;
+          default:
+             icon = "enlightenment/mouse_extra";
+         }
+
+       snprintf(val, sizeof(val), "m%d", i);
+
+       ic = edje_object_add(cfdata->evas);
+       e_util_edje_icon_set(ic, icon);
+       e_widget_ilist_append(cfdata->gui.o_binding_list, ic, label, _binding_change_cb,
+                             cfdata, val);
      }
-   else
+
+   if (cfdata->binding.wheel) 
      {
-       bw = evas_list_nth(cfdata->binding.wheel, atoi(++n));
-       params = bw->params;
+       cfdata->binding.wheel = evas_list_sort(cfdata->binding.wheel, 
+             evas_list_count(cfdata->binding.wheel), _wheel_binding_sort_cb); 
+       
+       e_widget_ilist_header_append(cfdata->gui.o_binding_list, NULL, "Mouse Wheels");
      }
 
-   if ((!params) || (!params[0]))
-     { 
-       //FIXME: need to put example
-       //e_widget_entry_text_set(cfdata->gui.o_params, EXAMPLE_STRING);
-       e_widget_entry_clear(cfdata->gui.o_params);
+   for (l = cfdata->binding.wheel, i = 0; l; l = l->next, i++)
+     {
+       Evas_Object *ic;
+       bw = l->data;
+
+       button = _helper_wheel_name_get(bw);
+       mods = _helper_modifier_name_get(bw->modifiers);
+
+       snprintf(label, sizeof(label), "%s%s%s", button ? button : "", mods[0] ? " + ": "",
+               mods ? mods : "");
+       if (button) free(button);
+       if (mods) free(mods);
+
+       snprintf(val, sizeof(val), "w%d", i);
+
+       ic = edje_object_add(cfdata->evas);
+       e_util_edje_icon_set(ic, "enlightenment/mouse_wheel");
+       e_widget_ilist_append(cfdata->gui.o_binding_list, ic, label, _binding_change_cb,
+                             cfdata, val);
      }
+
+   e_widget_ilist_go(cfdata->gui.o_binding_list);
+
+   if (evas_list_count(cfdata->binding.mouse) + evas_list_count(cfdata->binding.wheel))
+     e_widget_disabled_set(cfdata->gui.o_del_all, 0);
    else
-     e_widget_entry_text_set(cfdata->gui.o_params, params);
+     e_widget_disabled_set(cfdata->gui.o_del_all, 1);
 }
-/******** callbacks ***********/
 static void
-_action_change_cb(void *data)
+_update_action_params(E_Config_Dialog_Data *cfdata)
 {
-   const char *action;
-   char *n;
+   int g, a, b;
+   E_Action_Group *actg;
+   E_Action_Description *actd;
    E_Config_Binding_Mouse *eb;
    E_Config_Binding_Wheel *bw;
+   const char *action, *params;
 
-   E_Config_Dialog_Data *cfdata;
+#define MB_EXAMPLE_PARAMS \
+   if ((!actd->param_example) || (!actd->param_example[0])) \
+     e_widget_entry_text_set(cfdata->gui.o_params, TEXT_NO_PARAMS); \
+   else \
+     e_widget_entry_text_set(cfdata->gui.o_params, actd->param_example)
 
-   cfdata = data;
 
-   if (!cfdata->locals.cur) return;
+   if ((!cfdata->locals.action) || (!cfdata->locals.action[0]))
+     {
+       e_widget_disabled_set(cfdata->gui.o_params, 1);
+       e_widget_entry_clear(cfdata->gui.o_params);
+     }
+   sscanf(cfdata->locals.action, "%d %d", &g, &a);
 
-   action = action_to_name[atoi(cfdata->locals.action)][0];
+   actg = evas_list_nth(e_action_groups_get(), g);
+   if (!actg) return;
+   actd = evas_list_nth(actg->acts, a);
+   if (!actd) return;
 
-   n = cfdata->locals.cur;
-   if (cfdata->locals.cur[0] == 'm')
+   if (actd->act_params)
      {
-       eb = evas_list_nth(cfdata->binding.mouse, atoi(++n));
-       if (!eb || !eb->action)
-         { 
-            //FIXME: need to put here an example how to make binding 
-            e_widget_entry_clear(cfdata->gui.o_params);
-            return;
-         }
+       e_widget_disabled_set(cfdata->gui.o_params, 1);
+       e_widget_entry_text_set(cfdata->gui.o_params, actd->act_params);
+       return;
+     }
+
+   if ((!cfdata->locals.cur) || (!cfdata->locals.cur[0]))
+     {
+       e_widget_disabled_set(cfdata->gui.o_params, 1);
+       MB_EXAMPLE_PARAMS;
+       return;
+     }
 
-       if (!strcmp(eb->action, action))
+   if (!actd->editable)
+     e_widget_disabled_set(cfdata->gui.o_params, 1);
+   else
+     e_widget_disabled_set(cfdata->gui.o_params, 0);
+
+   if (cfdata->locals.cur[0] == 'm')
+     {
+       sscanf(cfdata->locals.cur, "m%d", &b);
+       eb = evas_list_nth(cfdata->binding.mouse, b);
+       if (!eb)
          {
-            if (!eb->params)
-              { 
-                 //FIXME: need to put here an example how to make binding 
-                 //e_widget_entry_text_set(cfdata->gui.o_params, EXAMPLE_STRING);
-                 e_widget_entry_clear(cfdata->gui.o_params);
-              }
-            else
-              e_widget_entry_text_set(cfdata->gui.o_params, eb->params);
-         }
-       else
-         { 
-            //FIXME: need to put here an example how to make binding 
-            //e_widget_entry_text_set(cfdata->gui.o_params, EXAMPLE_STRING);
-            e_widget_entry_clear(cfdata->gui.o_params);
+            e_widget_disabled_set(cfdata->gui.o_params, 1);
+            MB_EXAMPLE_PARAMS;
+            return;
          }
+       action = eb->action;
+       params = eb->params;
      }
-   else
+   else if (cfdata->locals.cur[0] = 'w')
      {
-       bw = evas_list_nth(cfdata->binding.wheel, atoi(++n));
-       if (!bw || !bw->action)
-         { 
-            //FIXME: need to put here an example how to make binding 
-            e_widget_entry_clear(cfdata->gui.o_params);
+       sscanf(cfdata->locals.cur, "w%d", &b);
+       bw = evas_list_nth(cfdata->binding.wheel, b);
+       if (!bw)
+         {
+            e_widget_disabled_set(cfdata->gui.o_params, 1);
+            MB_EXAMPLE_PARAMS;
             return;
          }
+       action = bw->action;
+       params = bw->params;
+     }
+   else
+     { 
+       e_widget_disabled_set(cfdata->gui.o_params, 1);
+        MB_EXAMPLE_PARAMS;
+       return;
+     }
 
-       if (!strcmp(bw->action, action))
-         { 
-            if (!bw->params)
+   if (action)
+     {
+       if (!strcmp(action, actd->act_cmd))
+         {
+            if ((!params) || (!params[0]))
               {
-                 //FIXME: need to put here an example how to make binding 
-                 e_widget_entry_clear(cfdata->gui.o_params);
+                 MB_EXAMPLE_PARAMS;
               }
             else
-              e_widget_entry_text_set(cfdata->gui.o_params, bw->params);
+              e_widget_entry_text_set(cfdata->gui.o_params, params);
          }
        else
-         { 
-            //FIXME: need to put here an example how to make binding 
-            //e_widget_entry_text_set(cfdata->gui.o_params, EXAMPLE_STRING);
-            e_widget_entry_clear(cfdata->gui.o_params);
+         {
+            MB_EXAMPLE_PARAMS;
          }
      }
+   else
+     {
+       MB_EXAMPLE_PARAMS;
+     }
 }
 
 static void
-_binding_change_cb(void *data)
-{
-   E_Config_Dialog_Data *cfdata;
-
-   cfdata = data;
-
-   _auto_apply_changes(cfdata);
-
-   if (cfdata->locals.cur) free(cfdata->locals.cur);
-   cfdata->locals.cur = NULL;
-
-   if (cfdata->locals.binding[0]) 
-     cfdata->locals.cur = strdup(cfdata->locals.binding);
-
-   _update_binding_context(cfdata);
-   _update_binding_actions(cfdata);
-   _update_binding_params(cfdata);
-   _update_buttons(cfdata);
-}
-static void
-_add_mouse_binding_cb(void *data, void *data2)
-{
-   E_Config_Dialog_Data *cfdata;
-   cfdata = data;
-
-   if (cfdata->locals.mousebind_win != 0) return;
-
-   cfdata->locals.add = 1;
-   cfdata->locals.dia = e_dialog_new(e_container_current_get(e_manager_current_get()),
-                                    "E", "_mousebind_getmouse_dialog");
-   if (!cfdata->locals.dia) return;
-   e_dialog_title_set(cfdata->locals.dia, _("Mouse Binding Sequence"));
-   e_dialog_icon_set(cfdata->locals.dia, "enlightenment/mouse_clean", 64);
-   e_dialog_text_set(cfdata->locals.dia, TEXT_PRESS_MOUSE_BINIDING_SEQUENCE);
-   e_win_centered_set(cfdata->locals.dia->win, 1);
-   e_win_borderless_set(cfdata->locals.dia->win, 1);
-
-   cfdata->locals.mousebind_win = ecore_x_window_input_new(e_manager_current_get()->root,
-                                                          0, 0, 1, 1);
-   ecore_x_window_show(cfdata->locals.mousebind_win);
-   e_grabinput_get(cfdata->locals.mousebind_win, 0, cfdata->locals.mousebind_win);
-
-   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
-                             ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
-                                _grab_key_down_cb, cfdata));
-
-   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
-                             ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
-                                _grab_mouse_down_cb, cfdata));
-
-   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
-                             ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL,
-                                _grab_mouse_wheel_cb, cfdata));
-
-   e_dialog_show(cfdata->locals.dia);
-}
-static void
-_modify_mouse_binding_cb(void *data, void *data2)
+_update_buttons(E_Config_Dialog_Data *cfdata)
 {
-   E_Config_Dialog_Data *cfdata;
-   cfdata = data;
-
-   if (cfdata->locals.mousebind_win != 0) return;
-
-   cfdata->locals.add = 0;
-   cfdata->locals.dia = e_dialog_new(e_container_current_get(e_manager_current_get()),
-                                    "E", "_mousebind_getmouse_dialog");
-   if (!cfdata->locals.dia) return;
-   e_dialog_title_set(cfdata->locals.dia, _("Mouse Binding Sequence"));
-   e_dialog_icon_set(cfdata->locals.dia, "enlightenment/mouse_clean", 64);
-   e_dialog_text_set(cfdata->locals.dia, TEXT_PRESS_MOUSE_BINIDING_SEQUENCE);
-   e_win_centered_set(cfdata->locals.dia->win, 1);
-   e_win_borderless_set(cfdata->locals.dia->win, 1);
-
-   cfdata->locals.mousebind_win = ecore_x_window_input_new(e_manager_current_get()->root,
-                                                          0, 0, 1, 1);
-   ecore_x_window_show(cfdata->locals.mousebind_win);
-   e_grabinput_get(cfdata->locals.mousebind_win, 0, cfdata->locals.mousebind_win);
-
-   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
-                             ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
-                                _grab_key_down_cb, cfdata));
-
-   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
-                             ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
-                                _grab_mouse_down_cb, cfdata));
+   if (e_widget_ilist_count(cfdata->gui.o_binding_list))
+     e_widget_disabled_set(cfdata->gui.o_del_all, 0);
+   else
+     e_widget_disabled_set(cfdata->gui.o_del_all, 1);
 
-   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
-                             ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL,
-                                _grab_mouse_wheel_cb, cfdata));
+   if (!cfdata->locals.cur)
+     { 
+       e_widget_disabled_set(cfdata->gui.o_mod, 1); 
+       e_widget_disabled_set(cfdata->gui.o_del, 1);
+       return;
+     }
 
-   e_dialog_show(cfdata->locals.dia);
+   e_widget_disabled_set(cfdata->gui.o_mod, 0);
+   e_widget_disabled_set(cfdata->gui.o_del, 0);
 }
 static void
-_delete_mouse_binding_cb(void *data, void *data2)
+_update_binding_context(E_Config_Dialog_Data *cfdata)
 {
-   Evas_List *l;
-   char *n;
-   int sel;
-   E_Config_Dialog_Data *cfdata;
+   int n;
    E_Config_Binding_Mouse *eb;
    E_Config_Binding_Wheel *bw;
+   E_Binding_Context ctxt;
 
-   cfdata = data;
+   // disable all the radios.
+   e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_any, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_border, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_menu, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_winlist, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_popup, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_zone, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_container, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_manager, 1);
+   e_widget_disabled_set(cfdata->gui.context.o_none, 1);
 
-   sel = e_widget_ilist_selected_get(cfdata->gui.o_binding_list);
-   if (cfdata->locals.binding[0] == 'm') 
-     {
-       n = cfdata->locals.binding;
-       l = evas_list_nth_list(cfdata->binding.mouse, atoi(++n));
+   if (!cfdata->locals.cur) return;
 
-       if (l)
-         { 
-            eb = l->data; 
-            if (eb->action) evas_stringshare_del(eb->action); 
-            if (eb->params) evas_stringshare_del(eb->params); 
-            E_FREE(eb); 
-            cfdata->binding.mouse = evas_list_remove_list(cfdata->binding.mouse, l);
-         }
+   if (cfdata->locals.cur[0] == 'm')
+     {
+       sscanf(cfdata->locals.cur, "m%d", &n);
+       eb = evas_list_nth(cfdata->binding.mouse, n);
+       if (!eb) return;
+       ctxt = eb->context;
      }
-   else
+   else if (cfdata->locals.cur[0] == 'w')
      {
-       n = cfdata->locals.binding;
-       l = evas_list_nth_list(cfdata->binding.wheel, atoi(++n));
-
-       if (l)
-         {
-            bw = l->data;
-            if (bw->action) evas_stringshare_del(bw->action);
-            if (bw->params) evas_stringshare_del(bw->params);
-            E_FREE(bw);
-
-            cfdata->binding.wheel = evas_list_remove_list(cfdata->binding.wheel, l);
-         }
+       sscanf(cfdata->locals.cur, "w%d", &n);
+       bw = evas_list_nth(cfdata->binding.wheel, n);
+       if (!bw) return;
+       ctxt = bw->context;
      }
+   else
+     return;
 
-   _update_binding_list(cfdata);
-   if (sel >= e_widget_ilist_count(cfdata->gui.o_binding_list))
-     sel = e_widget_ilist_count(cfdata->gui.o_binding_list) - 1;
-
+   e_widget_disabled_set(cfdata->gui.context.o_any, 0);
+   e_widget_disabled_set(cfdata->gui.context.o_border, 0);
+   e_widget_disabled_set(cfdata->gui.context.o_menu, 0);
+   e_widget_disabled_set(cfdata->gui.context.o_winlist, 0);
+   e_widget_disabled_set(cfdata->gui.context.o_popup, 0);
+   e_widget_disabled_set(cfdata->gui.context.o_zone, 0);
+   e_widget_disabled_set(cfdata->gui.context.o_container, 0);
+   e_widget_disabled_set(cfdata->gui.context.o_manager, 0);
+   e_widget_disabled_set(cfdata->gui.context.o_none, 0);
 
-   if (cfdata->locals.cur) free(cfdata->locals.cur);
-   cfdata->locals.cur = NULL;
-   if (!e_widget_ilist_count(cfdata->gui.o_binding_list))
-     { 
-       _update_binding_context(cfdata);
-       _update_binding_params(cfdata);
-       _update_buttons(cfdata);
-       e_widget_ilist_unselect(cfdata->gui.o_action_list);
-     }
-   else 
-     e_widget_ilist_selected_set(cfdata->gui.o_binding_list, sel);
+   if (ctxt == E_BINDING_CONTEXT_ANY) 
+     e_widget_radio_toggle_set(cfdata->gui.context.o_any, 1);
+   else if (ctxt == E_BINDING_CONTEXT_BORDER)
+     e_widget_radio_toggle_set(cfdata->gui.context.o_border, 1);
+   else if (ctxt == E_BINDING_CONTEXT_MENU)
+     e_widget_radio_toggle_set(cfdata->gui.context.o_menu, 1);
+   else if (ctxt == E_BINDING_CONTEXT_WINLIST)
+     e_widget_radio_toggle_set(cfdata->gui.context.o_winlist, 1);
+   else if (ctxt == E_BINDING_CONTEXT_POPUP)
+     e_widget_radio_toggle_set(cfdata->gui.context.o_popup, 1);
+   else if (ctxt == E_BINDING_CONTEXT_ZONE)
+     e_widget_radio_toggle_set(cfdata->gui.context.o_zone, 1);
+   else if (ctxt == E_BINDING_CONTEXT_CONTAINER)
+     e_widget_radio_toggle_set(cfdata->gui.context.o_container, 1);
+   else if (ctxt == E_BINDING_CONTEXT_MANAGER)
+     e_widget_radio_toggle_set(cfdata->gui.context.o_manager, 1);
+   else if (ctxt == E_BINDING_CONTEXT_NONE)
+     e_widget_radio_toggle_set(cfdata->gui.context.o_none, 1);
 }
+/****************** Helper *****************/
 static void
-_restore_defaults_cb(void *data, void *data2)
+_auto_apply_changes(E_Config_Dialog_Data *cfdata)
 {
+   int n, g, a;
    E_Config_Binding_Mouse *eb;
    E_Config_Binding_Wheel *bw;
-   E_Config_Dialog_Data *cfdata;
 
-   cfdata = data;
+   E_Action_Group *actg;
+   E_Action_Description *actd;
+   const char **action, **params;
 
-   while (cfdata->binding.mouse)
-     {
-       eb = cfdata->binding.mouse->data;
-       if (eb->action) evas_stringshare_del(eb->action);
-       if (eb->params) evas_stringshare_del(eb->params);
-       E_FREE(eb);
-       cfdata->binding.mouse =
-          evas_list_remove_list(cfdata->binding.mouse, cfdata->binding.mouse);
-     }
+   if ((!cfdata->locals.cur) || (!cfdata->locals.cur[0])) return;
 
-   while (cfdata->binding.wheel)
+   if (cfdata->locals.cur[0] == 'm')
      {
-       bw = cfdata->binding.wheel->data;
-       if (bw->action) evas_stringshare_del(bw->action);
-       if (bw->params) evas_stringshare_del(bw->params);
-       E_FREE(bw);
-       cfdata->binding.wheel =
-          evas_list_remove_list(cfdata->binding.wheel, cfdata->binding.wheel);
-     }
-#define CFG_MOUSEBIND_DFLT(_context, _button, _modifiers, _anymod, _action, _params) \
-   eb = E_NEW(E_Config_Binding_Mouse, 1); \
-   eb->context = _context; \
-   eb->button = _button; \
-   eb->modifiers = _modifiers; \
-   eb->any_mod = _anymod; \
-   eb->action = _action == NULL ? NULL : evas_stringshare_add(_action); \
-   eb->params = _params == NULL ? NULL : evas_stringshare_add(_params); \
-   cfdata->binding.mouse = evas_list_append(cfdata->binding.mouse, eb) 
-   
-   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, E_BINDING_MODIFIER_ALT, 0, "window_move", NULL); 
-   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 2, E_BINDING_MODIFIER_ALT, 0, "window_resize", NULL); 
-   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_BORDER, 3, E_BINDING_MODIFIER_ALT, 0, "window_menu", NULL); 
-   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 1, 0, 0, "menu_show", "main"); 
-   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 2, 0, 0, "menu_show", "clients"); 
-   CFG_MOUSEBIND_DFLT(E_BINDING_CONTEXT_ZONE, 3, 0, 0, "menu_show", "favorites");
+       sscanf(cfdata->locals.cur, "m%d", &n);
+       eb = evas_list_nth(cfdata->binding.mouse, n);
+       if (!eb) return;
 
+       eb->context = cfdata->locals.context;
+       action = &(eb->action);
+       params = &(eb->params);
+     }
+   else if (cfdata->locals.cur[0] == 'w')
+     {
+       sscanf(cfdata->locals.cur, "w%d", &n);
+       bw = evas_list_nth(cfdata->binding.wheel, n);
+       if (!bw) return;
 
-#define CFG_WHEELBIND_DFLT(_context, _direction, _z, _modifiers, _anymod, _action, _params) \
-   bw = E_NEW(E_Config_Binding_Wheel, 1); \
-   bw->context = _context; \
-   bw->direction = _direction; \
-   bw->z = _z; \
-   bw->modifiers = _modifiers; \
-   bw->any_mod = _anymod; \
-   bw->action = _action == NULL ? NULL : evas_stringshare_add(_action); \
-   bw->params = _params == NULL ? NULL : evas_stringshare_add(_params); \
-   cfdata->binding.wheel = evas_list_append(cfdata->binding.wheel, bw) 
+       bw->context = cfdata->locals.context;
+       action = &(bw->action);
+       params = &(bw->params);
+     } 
    
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, -1, E_BINDING_MODIFIER_NONE, 1, 
-        "desk_linear_flip_by", "-1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, -1, E_BINDING_MODIFIER_NONE, 1, 
-        "desk_linear_flip_by", "-1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, 1, E_BINDING_MODIFIER_NONE, 1, 
-        "desk_linear_flip_by", "1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, 1, E_BINDING_MODIFIER_NONE, 1, 
-        "desk_linear_flip_by", "1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_POPUP, 0, -1, E_BINDING_MODIFIER_NONE, 1, 
-        "desk_linear_flip_by", "-1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_POPUP, 1, -1, E_BINDING_MODIFIER_NONE, 1, 
-        "desk_linear_flip_by", "-1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_POPUP, 0, 1, E_BINDING_MODIFIER_NONE, 1, 
-        "desk_linear_flip_by", "1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_POPUP, 1, 1, E_BINDING_MODIFIER_NONE, 1, 
-        "desk_linear_flip_by", "1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, -1, E_BINDING_MODIFIER_ALT, 0, 
-        "desk_linear_flip_by", "-1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, -1, E_BINDING_MODIFIER_ALT, 0, 
-        "desk_linear_flip_by", "-1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 0, 1, E_BINDING_MODIFIER_ALT, 0, 
-        "desk_linear_flip_by", "1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_CONTAINER, 1, 1, E_BINDING_MODIFIER_ALT, 0, 
-        "desk_linear_flip_by", "1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 0, -1, E_BINDING_MODIFIER_ALT, 0, 
-        "desk_linear_flip_by", "-1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, -1, E_BINDING_MODIFIER_ALT, 0, 
-        "desk_linear_flip_by", "-1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 0, 1, E_BINDING_MODIFIER_ALT, 0, 
-        "desk_linear_flip_by", "1"); 
-   CFG_WHEELBIND_DFLT(E_BINDING_CONTEXT_BORDER, 1, 1, E_BINDING_MODIFIER_ALT, 0, 
-        "desk_linear_flip_by", "1");
+   if (*action) evas_stringshare_del(*action); 
+   if (*params) evas_stringshare_del(*params); 
+   *action = NULL; 
+   *params = NULL;
 
-   if (cfdata->locals.cur) free(cfdata->locals.cur);
-   cfdata->locals.cur = NULL;
-
-   _update_binding_list(cfdata);
-   _update_buttons(cfdata);
-   _update_binding_params(cfdata);
-   _update_binding_context(cfdata);
-   e_widget_ilist_unselect(cfdata->gui.o_action_list);
-}
+   if ((!cfdata->locals.action) || (!cfdata->locals.action[0])) return;
 
-static int
-_grab_mouse_down_cb(void *data, int type, void *event)
-{
-   E_Config_Dialog_Data *cfdata;
-   E_Config_Binding_Mouse *eb;
-   int mod = E_BINDING_MODIFIER_NONE;
-   Ecore_X_Event_Mouse_Button_Down *ev = event;
+   sscanf(cfdata->locals.action, "%d %d", &g, &a);
 
-   cfdata = data;
-   if (ev->win != cfdata->locals.mousebind_win) return 1; 
+   actg = evas_list_nth(e_action_groups_get(), g);
+   if (!actg) return;
+   actd = evas_list_nth(actg->acts, a);
+   if (!actd) return;
 
-   if (ev->modifiers & ECORE_X_MODIFIER_SHIFT)
-     mod |= E_BINDING_MODIFIER_SHIFT;
-   if (ev->modifiers & ECORE_X_MODIFIER_CTRL)
-     mod |= E_BINDING_MODIFIER_CTRL;
-   if (ev->modifiers & ECORE_X_MODIFIER_ALT)
-     mod |= E_BINDING_MODIFIER_ALT;
-   if (ev->modifiers & ECORE_X_MODIFIER_WIN)
-     mod |= E_BINDING_MODIFIER_WIN; 
-   
-   
-   if (cfdata->locals.add) 
-     { 
-       eb = E_NEW(E_Config_Binding_Mouse, 1); 
-       eb->context = E_BINDING_CONTEXT_ANY; 
-       eb->button = ev->button; 
-       eb->modifiers = mod; 
-       eb->any_mod = 0; 
-       eb->action = evas_stringshare_add(action_to_name[0][0]); 
-       eb->params = NULL; 
-       
-       cfdata->binding.mouse = evas_list_append(cfdata->binding.mouse, eb);
-     }
+   if (actd->act_cmd) *action = evas_stringshare_add(actd->act_cmd);
+   if (actd->act_params) 
+     *params = evas_stringshare_add(actd->act_params);
    else
      {
-       char *n = cfdata->locals.cur; 
-       
-       eb = evas_list_nth(cfdata->binding.mouse, atoi(++n));
-       if (eb)
+       int ok = 1;
+       if (cfdata->locals.params)
          {
-            eb->button = ev->button;
-            eb->modifiers = mod;
-         }
-     } 
-   _update_binding_list(cfdata); 
-   _update_binding_list_selection(cfdata, eb); 
-
-   _grab_wnd_hide_cb(cfdata);
-   _update_buttons(cfdata);
-   return 1;
-}
-static int 
-_grab_mouse_wheel_cb(void *data, int type, void *event)
-{
-   E_Config_Binding_Wheel *bw;
-   E_Config_Dialog_Data *cfdata;
-   Ecore_X_Event_Mouse_Wheel *ev = event;
-   int mod = E_BINDING_MODIFIER_NONE;
-
-   cfdata = data;
+            if (!strcmp(cfdata->locals.params, TEXT_NO_PARAMS)) ok = 0;
 
-   if (ev->win != cfdata->locals.mousebind_win) return 1;
-
-   if (ev->modifiers & ECORE_X_MODIFIER_SHIFT)
-     mod |= E_BINDING_MODIFIER_SHIFT;
-   if (ev->modifiers & ECORE_X_MODIFIER_CTRL)
-     mod |= E_BINDING_MODIFIER_CTRL;
-   if (ev->modifiers & ECORE_X_MODIFIER_ALT)
-     mod |= E_BINDING_MODIFIER_ALT;
-   if (ev->modifiers & ECORE_X_MODIFIER_WIN)
-     mod |= E_BINDING_MODIFIER_WIN; 
-   
-   
-   if (cfdata->locals.add)
-     {
-       bw = E_NEW(E_Config_Binding_Wheel, 1);
-       bw->context = E_BINDING_CONTEXT_ANY;
-       bw->direction = ev->direction;
-       bw->z = ev->z;
-       bw->modifiers = mod;
-       bw->any_mod = 0;
-       bw->action = evas_stringshare_add(action_to_name[0][0]);
-       bw->params = NULL; 
-       
-       cfdata->binding.wheel = evas_list_append(cfdata->binding.wheel, bw);
-     }
-   else 
-     {
-       char *n = cfdata->locals.cur; 
-       
-       bw = evas_list_nth(cfdata->binding.wheel, atoi(++n));
-       if (bw)
-         {
-            bw->direction = ev->direction;
-            bw->z = ev->z;
-            bw->modifiers = mod;
+            if ((actd->param_example) && (!strcmp(cfdata->locals.params, actd->param_example)))
+              ok = 0;
          }
-     } 
-   _update_binding_list(cfdata); 
-   _update_binding_list_selection(cfdata, bw);
-
-   _grab_wnd_hide_cb(cfdata);
-   _update_buttons(cfdata);
-
-   return 1;
-}
-static int
-_grab_key_down_cb(void *data, int type, void *event)
-{
-   E_Config_Dialog_Data *cfdata;
-   Ecore_X_Event_Key_Down *ev = event;
-
-   cfdata = data;
-
-   if (ev->win != cfdata->locals.mousebind_win) return 1;
+       else
+         ok = 0;
 
-   if (!strcmp(ev->keyname, "Escape") &&
-       !(ev->modifiers & ECORE_X_MODIFIER_SHIFT) &&
-       !(ev->modifiers & ECORE_X_MODIFIER_CTRL) &&
-       !(ev->modifiers & ECORE_X_MODIFIER_ALT) &&
-       !(ev->modifiers & ECORE_X_MODIFIER_WIN))
-     { 
-       _grab_wnd_hide_cb(cfdata);
+       if (ok)
+         *params = evas_stringshare_add(cfdata->locals.params);
      }
-   return 1;
 }
-static void
-_grab_wnd_hide_cb(E_Config_Dialog_Data *cfdata)
-{
-   while (cfdata->locals.handlers)
-     {
-       ecore_event_handler_del(cfdata->locals.handlers->data);
-       cfdata->locals.handlers = evas_list_remove_list(cfdata->locals.handlers,
-                                                       cfdata->locals.handlers);
-     }
-   cfdata->locals.handlers = NULL;
-   e_grabinput_release(cfdata->locals.mousebind_win, cfdata->locals.mousebind_win);
-   ecore_x_window_del(cfdata->locals.mousebind_win);
-   cfdata->locals.mousebind_win = 0;
 
-   e_object_del(E_OBJECT(cfdata->locals.dia));
-   cfdata->locals.dia = NULL;
-}
-/******** helpers *************/
-static char *
-_helper_modifier_name_get(int mod)
+static void
+_find_key_binding_action(const char *action, const char *params, int *g, int *a, int *n)
 {
-   char mods[1024]="";
+   Evas_List *l, *l2;
+   int gg = -1, aa = -1, nn = -1, found;
+   E_Action_Group *actg;
+   E_Action_Description *actd;
 
-   if (mod & E_BINDING_MODIFIER_SHIFT)
-     snprintf(mods, sizeof(mods), "SHIFT");
+   if (g) *g = -1;
+   if (a) *a = -1;
+   if (n) *n = -1;
 
-   if (mod & E_BINDING_MODIFIER_CTRL)
+   found = 0;
+   for (l = e_action_groups_get(), gg = 0, nn = 0; l; l = l->next, gg++)
      {
-       if (mods[0]) strcat(mods, " + ");
-       strcat(mods, "CTRL");
-     }
+       actg = l->data;
 
-   if (mod & E_BINDING_MODIFIER_ALT)
-     {
-       if (mods[0]) strcat(mods, " + ");
-       strcat(mods, "ALT");
+       for (l2 = actg->acts, aa = 0; l2; l2 = l2->next, aa++)
+         {
+            actd = l2->data;
+
+            if (!strcmp((!action ? "" : action), (!actd->act_cmd ? "" : actd->act_cmd)))
+              {
+                 if (!params || !params[0])
+                   {
+                      if ((!actd->act_params) || (!actd->act_params[0]))
+                        {
+                           if (g) *g = gg;
+                           if (a) *a = aa;
+                           if (n) *n = nn;
+                           return;
+                        }
+                      else
+                        continue;
+                   }
+                 else
+                   {
+                      if ((!actd->act_params) || (!actd->act_params[0]))
+                        {
+                           if (g) *g = gg;
+                           if (a) *a = aa;
+                           if (n) *n = nn;
+                           found = 1;
+                        }
+                      else
+                        {
+                           if (!strcmp(params, actd->act_params))
+                             {
+                                if (g) *g = gg;
+                                if (a) *a = aa;
+                                if (n) *n = nn;
+                                return;
+                             }
+                        }
+                   }
+              }
+            nn++;
+         }
+       if (found) break;
      }
 
-   if (mod & E_BINDING_MODIFIER_WIN)
+   if (!found)
      {
-       if (mods[0]) strcat(mods, " + ");
-       strcat(mods, "WIN");
+       if (g) *g = -1;
+       if (a) *a = -1;
+       if (n) *n = -1;
      }
-
-   return strdup(mods);
 }
 static char *
 _helper_button_name_get(E_Config_Binding_Mouse *eb)
@@ -1318,7 +1251,37 @@ _helper_wheel_name_get(E_Config_Binding_Wheel *bw)
      }
    return name;
 }
-/********* sorts ***************/
+
+static char *
+_helper_modifier_name_get(int mod)
+{
+   char mods[1024]="";
+
+   if (mod & E_BINDING_MODIFIER_SHIFT)
+     snprintf(mods, sizeof(mods), "SHIFT");
+
+   if (mod & E_BINDING_MODIFIER_CTRL)
+     {
+       if (mods[0]) strcat(mods, " + ");
+       strcat(mods, "CTRL");
+     }
+
+   if (mod & E_BINDING_MODIFIER_ALT)
+     {
+       if (mods[0]) strcat(mods, " + ");
+       strcat(mods, "ALT");
+     }
+
+   if (mod & E_BINDING_MODIFIER_WIN)
+     {
+       if (mods[0]) strcat(mods, " + ");
+       strcat(mods, "WIN");
+     }
+
+   return strdup(mods);
+}
+
+/********* Sorting ***************/
 static int
 _mouse_binding_sort_cb(void *d1, void *d2)
 {
@@ -1373,3 +1336,311 @@ _wheel_binding_sort_cb(void *d1, void *d2)
      }
    return 0;
 }
+
+static void
+_grab_wnd_show(E_Config_Dialog_Data *cfdata)
+{
+   E_Manager *man;
+
+   if (cfdata->locals.bind_win != 0) return;
+
+   man = e_manager_current_get();
+
+   cfdata->locals.dia = e_dialog_new(e_container_current_get(man), 
+                                    "E", "_mousebind_getmouse_dialog");
+   if (!cfdata->locals.dia) return;
+   e_dialog_title_set(cfdata->locals.dia, _("Mouse Binding Sequence"));
+   e_dialog_icon_set(cfdata->locals.dia, "enlightenment/mouse_clean", 48);
+   e_dialog_text_set(cfdata->locals.dia, TEXT_PRESS_MOUSE_BINIDING_SEQUENCE);
+   e_win_centered_set(cfdata->locals.dia->win, 1);
+   e_win_borderless_set(cfdata->locals.dia->win, 1);
+
+   cfdata->locals.bind_win = ecore_x_window_input_new(man->root, 0, 0, 1, 1);
+   ecore_x_window_show(cfdata->locals.bind_win);
+   e_grabinput_get(cfdata->locals.bind_win, 0, cfdata->locals.bind_win);
+
+   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
+                             ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
+                                _grab_key_down_cb, cfdata));
+
+   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
+                             ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN,
+                                _grab_mouse_down_cb, cfdata));
+
+   cfdata->locals.handlers = evas_list_append(cfdata->locals.handlers,
+                             ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL,
+                                _grab_mouse_wheel_cb, cfdata));
+
+   e_dialog_show(cfdata->locals.dia);
+   ecore_x_icccm_transient_for_set(cfdata->locals.dia->win->evas_win, cfdata->cfd->dia->win->evas_win);
+}
+
+static void
+_grab_wnd_hide(E_Config_Dialog_Data *cfdata)
+{
+   while (cfdata->locals.handlers)
+     {
+       ecore_event_handler_del(cfdata->locals.handlers->data);
+       cfdata->locals.handlers = 
+          evas_list_remove_list(cfdata->locals.handlers, cfdata->locals.handlers);
+     }
+   cfdata->locals.handlers = NULL;
+   e_grabinput_release(cfdata->locals.bind_win, cfdata->locals.bind_win);
+   ecore_x_window_del(cfdata->locals.bind_win);
+   cfdata->locals.bind_win = 0;
+
+   e_object_del(E_OBJECT(cfdata->locals.dia));
+   cfdata->locals.dia = NULL;
+}
+
+static int
+_grab_mouse_down_cb(void *data, int type, void *event)
+{
+   Evas_List *l;
+   E_Config_Dialog_Data *cfdata;
+   E_Config_Binding_Mouse *eb;
+   E_Config_Binding_Wheel *bw;
+   int mod = E_BINDING_MODIFIER_NONE, n;
+
+   Ecore_X_Event_Mouse_Button_Down *ev;
+   
+   ev = event;
+   cfdata = data;
+
+   if (ev->win != cfdata->locals.bind_win) return 1; 
+
+   if (ev->modifiers & ECORE_X_MODIFIER_SHIFT)
+     mod |= E_BINDING_MODIFIER_SHIFT;
+   if (ev->modifiers & ECORE_X_MODIFIER_CTRL)
+     mod |= E_BINDING_MODIFIER_CTRL;
+   if (ev->modifiers & ECORE_X_MODIFIER_ALT)
+     mod |= E_BINDING_MODIFIER_ALT;
+   if (ev->modifiers & ECORE_X_MODIFIER_WIN)
+     mod |= E_BINDING_MODIFIER_WIN; 
+   
+   
+   if (cfdata->locals.add) 
+     { 
+       eb = E_NEW(E_Config_Binding_Mouse, 1); 
+       eb->context = E_BINDING_CONTEXT_ANY; 
+       eb->button = ev->button; 
+       eb->modifiers = mod; 
+       eb->any_mod = 0; 
+       eb->action = NULL; 
+       eb->params = NULL; 
+       
+       cfdata->binding.mouse = evas_list_append(cfdata->binding.mouse, eb);
+     }
+   else
+     {
+       if (cfdata->locals.cur[0] == 'm')
+         { 
+            sscanf(cfdata->locals.cur, "m%d", &n); 
+            eb = evas_list_nth(cfdata->binding.mouse, n); 
+            if (eb) 
+              { 
+                 eb->button = ev->button; 
+                 eb->modifiers = mod; 
+              }
+         }
+       else if (cfdata->locals.cur[0] == 'w')
+         {
+            sscanf(cfdata->locals.cur, "w%d", &n);
+            l = evas_list_nth_list(cfdata->binding.wheel, n);
+            bw = l->data;
+
+            eb = E_NEW(E_Config_Binding_Mouse, 1); 
+            eb->context = bw->context;
+            eb->button = ev->button; 
+            eb->modifiers = mod; 
+            eb->any_mod = 0; 
+            eb->action = bw->action; 
+            eb->params = bw->params; 
+
+            cfdata->binding.mouse = evas_list_append(cfdata->binding.mouse, eb);
+
+            bw->action = NULL;
+            bw->params = NULL;
+            E_FREE(bw);
+            cfdata->binding.wheel = evas_list_remove_list(cfdata->binding.wheel, l);
+         }
+       else
+         ;
+     } 
+   _update_mouse_binding_list(cfdata); 
+
+   if (cfdata->locals.add)
+     { 
+       for (l = cfdata->binding.mouse, n = 0; l; l = l->next, n++)
+         {
+            if (l->data == eb) break;
+         } 
+
+       e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1); 
+
+       if (cfdata->locals.action) free(cfdata->locals.action);
+       cfdata->locals.action = strdup("");
+       e_widget_ilist_unselect(cfdata->gui.o_action_list);
+       e_widget_entry_clear(cfdata->gui.o_params);
+       e_widget_disabled_set(cfdata->gui.o_params, 1);
+     }
+   else
+     { 
+       for (l = cfdata->binding.mouse, n = 0; l; l = l->next, n++) 
+         { 
+            if (l->data == eb) break; 
+         } 
+
+       if (cfdata->locals.cur) free(cfdata->locals.cur);
+       cfdata->locals.cur = NULL;
+
+       e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1);
+     }
+   _update_buttons(cfdata);
+   _grab_wnd_hide(cfdata);
+
+   return 1;
+}
+
+static int 
+_grab_mouse_wheel_cb(void *data, int type, void *event)
+{
+   Evas_List *l;
+   E_Config_Binding_Wheel *bw;
+   E_Config_Binding_Mouse *eb;
+   E_Config_Dialog_Data *cfdata;
+   Ecore_X_Event_Mouse_Wheel *ev; 
+   int mod = E_BINDING_MODIFIER_NONE, n;
+
+   ev = event;
+   cfdata = data;
+
+   if (ev->win != cfdata->locals.bind_win) return 1;
+
+   if (ev->modifiers & ECORE_X_MODIFIER_SHIFT)
+     mod |= E_BINDING_MODIFIER_SHIFT;
+   if (ev->modifiers & ECORE_X_MODIFIER_CTRL)
+     mod |= E_BINDING_MODIFIER_CTRL;
+   if (ev->modifiers & ECORE_X_MODIFIER_ALT)
+     mod |= E_BINDING_MODIFIER_ALT;
+   if (ev->modifiers & ECORE_X_MODIFIER_WIN)
+     mod |= E_BINDING_MODIFIER_WIN; 
+   
+   
+   if (cfdata->locals.add)
+     {
+       bw = E_NEW(E_Config_Binding_Wheel, 1);
+       bw->context = E_BINDING_CONTEXT_ANY;
+       bw->direction = ev->direction;
+       bw->z = ev->z;
+       bw->modifiers = mod;
+       bw->any_mod = 0;
+       bw->action = NULL;
+       bw->params = NULL; 
+       
+       cfdata->binding.wheel = evas_list_append(cfdata->binding.wheel, bw);
+     }
+   else 
+     {
+       if (cfdata->locals.cur[0] == 'm')
+         {
+            sscanf(cfdata->locals.cur, "m%d", &n);
+            l = evas_list_nth_list(cfdata->binding.mouse, n);
+            eb = l->data; 
+            
+            bw = E_NEW(E_Config_Binding_Wheel, 1);
+            bw->context = eb->context;
+            bw->direction = ev->direction;
+            bw->z = ev->z;
+            bw->modifiers = mod;
+            bw->any_mod = 0;
+            bw->action = eb->action;
+            bw->params = eb->params; 
+
+            cfdata->binding.wheel = evas_list_append(cfdata->binding.wheel, bw);
+
+            E_FREE(eb);
+            cfdata->binding.mouse = evas_list_remove_list(cfdata->binding.mouse, l);
+
+         }
+       else if (cfdata->locals.cur[0] == 'w')
+         {
+            sscanf(cfdata->locals.cur, "w%d", &n);
+            bw = evas_list_nth(cfdata->binding.wheel, n);
+            if (bw)
+              {
+                 bw->direction = ev->direction;
+                 bw->z = ev->z;
+                 bw->modifiers = mod;
+              }
+         }
+       else
+         ;
+     } 
+   _update_mouse_binding_list(cfdata); 
+
+   if (cfdata->locals.add)
+     { 
+       for (l = cfdata->binding.wheel, n = 0; l; l = l->next, n++)
+         {
+            if (l->data == bw) break;
+         } 
+
+       if (evas_list_count(cfdata->binding.mouse))
+         { 
+            n += evas_list_count(cfdata->binding.mouse) + 2;
+            e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n); 
+         }
+       else 
+         e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1); 
+
+       e_widget_ilist_unselect(cfdata->gui.o_action_list);
+       if (cfdata->locals.action) free(cfdata->locals.action);
+       cfdata->locals.action = strdup("");
+       e_widget_entry_clear(cfdata->gui.o_params);
+       e_widget_disabled_set(cfdata->gui.o_params, 1);
+     }
+   else
+     {
+       for (l = cfdata->binding.wheel, n = 0; l; l = l->next, n++)
+         {
+            if (l->data == bw) break;
+         }
+
+       if (cfdata->locals.cur) free(cfdata->locals.cur);
+       cfdata->locals.cur = NULL;
+
+       if (evas_list_count(cfdata->binding.mouse)) 
+         { 
+            n += evas_list_count(cfdata->binding.mouse) + 2;
+            e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n);
+         }
+       else
+         e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n + 1);
+     }
+   _update_buttons(cfdata);
+
+   _grab_wnd_hide(cfdata);
+   return 1;
+}
+
+static int
+_grab_key_down_cb(void *data, int type, void *event)
+{
+   E_Config_Dialog_Data *cfdata;
+   Ecore_X_Event_Key_Down *ev = event;
+
+   cfdata = data;
+
+   if (ev->win != cfdata->locals.bind_win) return 1;
+
+   if (!strcmp(ev->keyname, "Escape") &&
+       !(ev->modifiers & ECORE_X_MODIFIER_SHIFT) &&
+       !(ev->modifiers & ECORE_X_MODIFIER_CTRL) &&
+       !(ev->modifiers & ECORE_X_MODIFIER_ALT) &&
+       !(ev->modifiers & ECORE_X_MODIFIER_WIN))
+     { 
+       _grab_wnd_hide(cfdata);
+     }
+   return 1;
+}