diff --git a/src/modules/conf_keybindings/e_int_config_keybindings.c b/src/modules/conf_keybindings/e_int_config_keybindings.c
index f58e03408..1bf70ab54 100644
--- a/src/modules/conf_keybindings/e_int_config_keybindings.c
+++ b/src/modules/conf_keybindings/e_int_config_keybindings.c
@@ -20,7 +20,7 @@ static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas,
static void _fill_actions_list(E_Config_Dialog_Data *cfdata);
/**************** Updates ***********/
-static void _update_key_binding_list(E_Config_Dialog_Data *cfdata);
+static int _update_key_binding_list(E_Config_Dialog_Data *cfdata, E_Config_Binding_Key *bi);
static void _update_action_list(E_Config_Dialog_Data *cfdata);
static void _update_action_params(E_Config_Dialog_Data *cfdata);
static void _update_buttons(E_Config_Dialog_Data *cfdata);
@@ -261,7 +261,7 @@ _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cf
e_widget_table_object_append(ot, of, 0, 1, 1, 1, 1, 1, 1, 0);
e_widget_list_object_append(o, ot, 1, 1, 0.5);
- _update_key_binding_list(cfdata);
+ _update_key_binding_list(cfdata, NULL);
_fill_actions_list(cfdata);
e_dialog_resizable_set(cfd->dia, 1);
@@ -420,11 +420,13 @@ _delete_key_binding_cb(void *data, void *data2)
}
}
- _update_key_binding_list(cfdata);
+ _update_key_binding_list(cfdata, NULL);
+ /* FIXME this wont work here as the list will be created when ilist queue is
+ done an ilist_count will always return 0 here */
if (sel >= e_widget_ilist_count(cfdata->gui.o_binding_list))
sel = e_widget_ilist_count(cfdata->gui.o_binding_list) - 1;
-
+
eina_stringshare_del(cfdata->locals.cur);
cfdata->locals.cur = NULL;
@@ -611,7 +613,7 @@ _restore_key_binding_defaults_cb(void *data, void *data2)
eina_stringshare_del(cfdata->locals.cur);
cfdata->locals.cur = NULL;
- _update_key_binding_list(cfdata);
+ _update_key_binding_list(cfdata, NULL);
_update_buttons(cfdata);
e_widget_ilist_unselect(cfdata->gui.o_action_list);
@@ -795,15 +797,17 @@ _update_action_params(E_Config_Dialog_Data *cfdata)
KB_EXAMPLE_PARAMS;
}
-static void
-_update_key_binding_list(E_Config_Dialog_Data *cfdata)
+static int
+_update_key_binding_list(E_Config_Dialog_Data *cfdata, E_Config_Binding_Key *bi_new)
{
int i;
char *b, b2[64];
Eina_List *l;
E_Config_Binding_Key *bi;
int modifiers = -1;
-
+ int bi_pos = 0;
+ int ret = -1;
+
evas_event_freeze(evas_object_evas_get(cfdata->gui.o_binding_list));
edje_freeze();
e_widget_ilist_freeze(cfdata->gui.o_binding_list);
@@ -820,13 +824,16 @@ _update_key_binding_list(E_Config_Dialog_Data *cfdata)
for (l = cfdata->binding.key, i = 0; l; l = l->next, i++)
{
bi = l->data;
-
+ if (bi == bi_new) ret = bi_pos;
+ if (ret < 0) bi_pos++;
+
if (modifiers != bi->modifiers)
{
modifiers = bi->modifiers;
b = _key_binding_header_get(modifiers);
if (b)
{
+ if (ret < 0) bi_pos++;
e_widget_ilist_header_append(cfdata->gui.o_binding_list, NULL, b);
free(b);
}
@@ -850,6 +857,8 @@ _update_key_binding_list(E_Config_Dialog_Data *cfdata)
e_widget_disabled_set(cfdata->gui.o_del_all, 0);
else
e_widget_disabled_set(cfdata->gui.o_del_all, 1);
+
+ return ret;
}
static void
@@ -1080,12 +1089,8 @@ _grab_key_down_cb(void *data, int type, void *event)
if (cfdata->locals.add)
{
- _update_key_binding_list(cfdata);
+ n = _update_key_binding_list(cfdata, bi);
- for (l = cfdata->binding.key, n = 0; l; l = l->next, n++)
- {
- if (l->data == bi) break;
- }
e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n);
e_widget_ilist_unselect(cfdata->gui.o_action_list);
eina_stringshare_del(cfdata->locals.action);
@@ -1110,6 +1115,7 @@ _grab_key_down_cb(void *data, int type, void *event)
}
else
{
+ printf("blub\n");
char *label;
label = _key_binding_text_get(bi);
@@ -1118,12 +1124,19 @@ _grab_key_down_cb(void *data, int type, void *event)
}
}
else
- {
+ {
+ int i = 0;
+ E_Ilist_Item *it;
+#if 0
+ /* this advice is rather irritating as one sees that the
+ key is bound to an action. if you want to set a
+ keybinding you dont care about whether there is
+ sth else set to it. */
int g, a, j;
const char *label = NULL;
E_Action_Group *actg = NULL;
E_Action_Description *actd = NULL;
-
+
if (cfdata->locals.add)
_find_key_binding_action(bi->action, bi->params, &g, &a, &j);
else
@@ -1140,8 +1153,13 @@ _grab_key_down_cb(void *data, int type, void *event)
"%s action.
"
"Please choose another binding key sequence."),
label ? label : _("Unknown"));
-
-
+#endif
+ EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->gui.o_binding_list), l, it)
+ {
+ if (i++ >= n) break;
+ if (it->header) n++;
+ }
+
e_widget_ilist_nth_show(cfdata->gui.o_binding_list, n-1, 1);
e_widget_ilist_selected_set(cfdata->gui.o_binding_list, n-1);